<?php
use dezlov\PayPal\IpnListener;
use Jimmerioles\BitcoinCurrencyConverter\Converter;
class PaymentModel
{
const PAYMENT_PAYPAL_ID = 1;
const PAYMENT_STRIPE_ID = 2;
const PAYMENT_WEBMONEY_ID = 3;
const PAYMENT_PERFECT_MONEY = 4;
/*const PAYMENT_SKRILL_ID = 5;*/
const PAYMENT_GEARY_ID = 6;
const PAYMENT_PAYZA_ID = 7;
const PAYMENT_PAYTM_ID = 8;
const PAYMENT_COINPAYMENTS_ID = 9;
const PAYMENT_PAYWANT_ID = 10;
public static function paymentInfo()
{
$database = DatabaseFactory::getFactory()->getConnection();
$method = intval($_GET['method']);
$get = $database->prepare('SELECT minlimit, maxlimit FROM payment_methods WHERE id = :id');
$get->execute([':id' => $method]);
echo json_encode($get->fetchObject());
}
public static function history(int $page = 0, int $itemsPerPage = 20)
{
$database = DatabaseFactory::getFactory()->getConnection();
$get = $database->prepare("SELECT * FROM transactions WHERE user_id = :userid ORDER BY created DESC LIMIT " . $itemsPerPage . " OFFSET " . $itemsPerPage * $page);
$get->execute(array(':userid' => Session::get('user_id')));
return $get->fetchAll();
}
public static function paypalsettings()
{
$database = DatabaseFactory::getFactory()->getConnection();
$get = $database->prepare('SELECT * FROM payment_methods WHERE id = 1');
$get->execute();
return $get->fetchObject();
}
public static function gearySettings()
{
$database = DatabaseFactory::getFactory()->getConnection();
$get = $database->prepare('SELECT * FROM payment_methods WHERE id = 6');
$get->execute();
return $get->fetchObject();
}
// START STRIPE METHOD
public static function stripeSettings()
{
$database = DatabaseFactory::getFactory()->getConnection();
$get = $database->prepare('SELECT * FROM payment_methods WHERE id = 2');
$get->execute();
return $get->fetchObject();
}
public static function stripe()
{
$secret = self::stripeSettings()->field2;
// Stripe settings
$stripesettings = self::stripeSettings();
// From post
$token = Request::post('stripeToken', true);
$amount = Request::post('amountInCents', true);
$amountnormal = $amount / 100;
$email = Request::post('stripeEmail', true);
$username = $_SESSION['user_name'];
$database = DatabaseFactory::getFactory()->getConnection();
if (empty($amount)) {
Session::add('feedback_negative', Text::get('Amountisemptyenteravalidvalue'));
return false;
} elseif (!filter_var($amount, FILTER_VALIDATE_FLOAT)) {
Session::add('feedback_negative', Text::get('Amountisnotfloatnumber'));
return false;
} elseif ($amountnormal > $stripesettings->maxlimit) {
Session::add('feedback_negative', Text::get('Specifiedamountismorethanmaxlimit')." ($$stripesettings->maxlimit), ".Text::get('pleasetryagain'));
return false;
} elseif ($amountnormal < $stripesettings->minlimit) {
Session::add('feedback_negative', Text::get('Specifiedamountislessthanminlimit')." ($$stripesettings->minlimit), ".Text::get('pleasetryagain'));
return false;
} elseif ($stripesettings->enabled == 0) {
Session::add('feedback_negative', Text::get('StripePaymentMethodisdisabled'));
return false;
} else {
$createCharge = SubscriptionModel::processStripe($secret, $token, $email, $amount, 'usd', "Add funds to account: $username");
if(isset($createCharge['success'])) {
/* Check if its users first payment & user is referred by someone, if yes
* someone gets 10% etc of the payment amount depending on table settings->affiliate_comission value
*/
AffiliateModel::rewardReferrer(Session::get('user_id'), $amountnormal, $createCharge['customerId']);
// Add balance
$add = $database->prepare('UPDATE users SET balance = balance + :amount WHERE user_id = :userid');
$executeAdd = $add->execute(array(
':userid' => Session::get('user_id'),
':amount' => $amountnormal
));
// Add transaction history
$addtran = $database->prepare('INSERT INTO transactions (user_id, payment_id, complete, created, amount, method) VALUES (:userid, :payment, :complete, :created, :amount, :method)');
$executeAddtran = $addtran->execute(array(
':userid' => Session::get('user_id'),
':payment' => $createCharge['customerId'],
':complete' => 1,
':created' => date('Y-m-d H:i:s'),
':amount' => $amountnormal,
':method' => 'Stripe'
));
if ($executeAdd && $executeAddtran) {
Session::add('feedback_positive', Text::get('Youhavesuccessfullyadded').' <b>$' . $amountnormal . '</b> '.Text::get('toyourbalance'));
}
} else {
Session::add('feedback_negative', Text::get('Couldnotprocesspayment'));
}
}
}
public static function webmoneySettings()
{
$database = DatabaseFactory::getFactory()->getConnection();
$get = $database->prepare('SELECT * FROM payment_methods WHERE id = 3');
$get->execute();
return $get->fetchObject();
}
public static function paywantSettings()
{
$database = DatabaseFactory::getFactory()->getConnection();
$get = $database->prepare('SELECT * FROM payment_methods WHERE id = 10');
$get->execute();
return $get->fetchObject();
}
public static function paywant(){
if($_POST){
error_reporting(0);
$SiparisID = $_POST["SiparisID"];
$ExtraData = $_POST["ExtraData"];
$UserID = $_POST["UserID"];
$ReturnData = $_POST["ReturnData"];
$Status = $_POST["Status"];
$OdemeKanali = $_POST["OdemeKanali"];
$OdemeTutari = $_POST["OdemeTutari"];
$NetKazanc = $_POST["NetKazanc"];
$Hash = $_POST["Hash"];
$database = DatabaseFactory::getFactory()->getConnection();
$add = $database->prepare('UPDATE users SET balance = balance + :amount WHERE user_id = :userid');
$add->execute(array(
':userid' => $UserID,
':amount' => $OdemeTutari
));
$addtran = $database->prepare('INSERT INTO transactions (user_id, payment_id, complete, created, amount, method) VALUES (:userid, :payment, :complete, :created, :amount, :method)');
$addtran->execute(array(
':userid' => $UserID,
':payment' => '',
':complete' => 1,
':created' => date('Y-m-d H:i:s'),
':amount' => $OdemeTutari,
':method' => 'PayWant'
));
echo 'OK';
}
}
public static function webmoney()
{
// Prerequest flag
if ($_POST['LMI_PREREQUEST'] == 1) {
// The merchant's purse to which the customer has made payment. Format is a letter and 12 digits.
if ($_POST['LMI_PAYEE_PURSE'] == self::webmoneySettings()->field1) echo 'YES';
} else {
$key =
$_POST['LMI_PAYEE_PURSE'] .
$_POST['LMI_PAYMENT_AMOUNT'] .
$_POST['LMI_PAYMENT_NO'] .
$_POST['LMI_MODE'] .
$_POST['LMI_SYS_INVS_NO'] .
$_POST['LMI_SYS_TRANS_NO'] .
$_POST['LMI_SYS_TRANS_DATE'] .
self::webmoneySettings()->field2 .
$_POST['LMI_PAYER_PURSE'] .
$_POST['LMI_PAYER_WM'];
if (strtoupper(hash('sha256', $key)) != $_POST['LMI_HASH']) {
exit;
}
$userid = filter_var($_POST['userid'], FILTER_SANITIZE_NUMBER_INT);
$database = DatabaseFactory::getFactory()->getConnection();
AffiliateModel::rewardReferrer($userid, $_POST['LMI_PAYMENT_AMOUNT']);
// Add balance
$add = $database->prepare('UPDATE users SET balance = balance + :amount WHERE user_id = :userid');
$add->execute(array(
':userid' => $userid,
':amount' => $_POST['LMI_PAYMENT_AMOUNT']
));
// Add transaction history
$addtran = $database->prepare('INSERT INTO transactions (user_id, payment_id, complete, created, amount, method) VALUES (:userid, :payment, :complete, :created, :amount, :method)');
$addtran->execute(array(
':userid' => $userid,
':payment' => '',
':complete' => 1,
':created' => date('Y-m-d H:i:s'),
':amount' => $_POST['LMI_PAYMENT_AMOUNT'],
':method' => 'WebMoney'
));
}
}
public static function processWebmoney()
{
// Amount user would like to deposit to account balance
$price = Request::post('price', true);
$webmoneysettings = self::webmoneySettings();
if (empty($price)) {
Session::add('feedback_negative', Text::get('Amountisemptyenteravalidvalue'));
return false;
} elseif (!filter_var($price, FILTER_VALIDATE_FLOAT)) {
Session::add('feedback_negative', Text::get('Amountisnotfloatnumber'));
return false;
} elseif ($price > self::webmoneySettings()->maxlimit) {
Session::add('feedback_negative', Text::get('Specifiedamountismorethanmaxlimit')." $$webmoneysettings->maxlimit, ".Text::get('pleasetryagain').".");
return false;
} elseif ($price < self::webmoneySettings()->minlimit) {
Session::add('feedback_negative', Text::get('Specifiedamountislessthanminlimit')." $$webmoneysettings->minlimit, ".Text::get('pleasetryagain').".");
return false;
} elseif (self::webmoneySettings()->enabled == 0) {
Session::add('feedback_negative', Text::get('WebmoneyPaymentMethodisdisabled'));
return false;
} else {
$username = Session::get('user_name');
Session::set('processwebmoney', '1');
Session::set('LMI_PAYEE_PURSE', self::webmoneySettings()->field1);
Session::set('LMI_PAYMENT_AMOUNT', $price);
Session::set('LMI_PAYMENT_DESC', Text::get('Addfundstoaccount').": $username");
Redirect::to('addfunds/processwebmoney');
}
}
public static function perfectmoneySettings()
{
$database = DatabaseFactory::getFactory()->getConnection();
$get = $database->prepare('SELECT * FROM payment_methods WHERE id = 4');
$get->execute();
return $get->fetchObject();
}
public static function perfectmoney()
{
$secret = strtoupper(md5(self::perfectmoneySettings()->field2));
$hash = $_POST['PAYMENT_ID'] . ':' .
$_POST['PAYEE_ACCOUNT'] . ':' .
$_POST['PAYMENT_AMOUNT'] . ':' .
$_POST['PAYMENT_UNITS'] . ':' .
$_POST['PAYMENT_BATCH_NUM'] . ':' .
$_POST['PAYER_ACCOUNT'] . ':' .
$secret . ':' .
$_POST['TIMESTAMPGMT'];
$hash = strtoupper(md5($hash));
if ($hash != $_POST['V2_HASH']) exit('error');
$database = DatabaseFactory::getFactory()->getConnection();
AffiliateModel::rewardReferrer($_POST['PAYMENT_ID'], $_POST['PAYMENT_AMOUNT']);
// Add balance
$add = $database->prepare('UPDATE users SET balance = balance + :amount WHERE user_id = :userid');
$add->execute(array(
':userid' => $_POST['PAYMENT_ID'],
':amount' => $_POST['PAYMENT_AMOUNT']
));
// Add transaction history
$addtran = $database->prepare('INSERT INTO transactions (user_id, payment_id, complete, created, amount, method) VALUES (:userid, :payment, :complete, :created, :amount, :method)');
$addtran->execute(array(
':userid' => $_POST['PAYMENT_ID'],
':payment' => '',
':complete' => 1,
':created' => date('Y-m-d H:i:s'),
':amount' => $_POST['PAYMENT_AMOUNT'],
':method' => 'Perfect Money'
));
}
public static function processpaywant()
{
$price = Request::post('price', true);
Session::set('processpaywant', '1');
$db = DatabaseFactory::getFactory()->getConnection();
$result = $db->prepare("SELECT * FROM payment_methods WHERE id = ? ");
$result->execute(array(10));
$d = $result->fetchAll()[0];
$apiKey = $d->apikey; // api anahtarı
$apiSecret = $d->apisecret; // api gizli anahtarı
$userID = Session::get('user_id'); // kullanıcı id
$userEmail = Session::get('user_email'); // kullanıcı e-mail adresi
$returnData = $orderid = Session::get('user_name'); // sipariş kodu
$userIPAdresi = $_SERVER['REMOTE_ADDR']; // kullanıcının ip adresi
$hashOlustur = base64_encode(hash_hmac('sha256',"$returnData|$userEmail|$userID".$apiKey,$apiSecret,true));
$productData = array(
"name" => $price." TL Bakiye Yukleme ", // Ürün adı
"amount" => $price*100, // Ürün fiyatı, 10 TL : 1000
"extraData" => 1, // Notify sayfasına iletilecek ekstra veri
"paymentChannel" => "1,2,3", // Bu ödeme için kullanılacak ödeme kanalları
"commissionType" => 1 // Komisyon tipi, 1: Yansıt, 2: Üstlen
);
$postData = array(
'apiKey' => $apiKey,
'hash' => $hashOlustur,
'returnData'=> $returnData,
'userEmail' => $userEmail,
'userIPAddress' => $userIPAdresi,
'userID' => $userID,
'proApi' => true,
'productData' => $productData
);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "http://api.paywant.com/gateway.php",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => http_build_query($postData),
));
$response = curl_exec($curl);
$err = curl_error($curl);
if ($err)
echo "cURL Error #:" . $err;
else{
$jsonDecode = json_decode($response,false);
if($jsonDecode->Status == 100){
header("Location:". $jsonDecode->Message);
// Ortak odeme sayfasina yonlendir
}else
echo $response;
}
curl_close($curl);
//Redirect::to('addfunds/paywant');
}
public static function processPerfectmoney()
{
// Amount user would like to deposit to account balance
$price = Request::post('price', true);
$perfectsettings = self::perfectmoneySettings();
if (empty($price)) {
Session::add('feedback_negative', Text::get('Amountisemptyenteravalidvalue'));
return false;
} elseif (!filter_var($price, FILTER_VALIDATE_FLOAT)) {
Session::add('feedback_negative', Text::get('Amountisnotfloatnumber'));
return false;
} elseif ($price > self::perfectmoneySettings()->maxlimit) {
Session::add('feedback_negative', Text::get('Specifiedamountismorethanmaxlimit')." $$perfectsettings->maxlimit, ".Text::get('pleasetryagain').".");
return false;
} elseif ($price < self::perfectmoneySettings()->minlimit) {
Session::add('feedback_negative', Text::get('Specifiedamountislessthanminlimit')." $$perfectsettings->minlimit, ".Text::get('pleasetryagain').".");
return false;
} elseif (self::perfectmoneySettings()->enabled == 0) {
Session::add('feedback_negative', Text::get('PerfectMoneyPaymentMethodisdisabled'));
return false;
} else {
Session::set('processperfect', '1');
Session::set('usd_account', self::perfectmoneySettings()->field1);
Session::set('payee_name', SiteSettingsModel::sitesettings()->sitename);
Session::set('payment_amount', $price);
Redirect::to('addfunds/processperfect');
}
}
public static function processGeary() {
// Amount user would like to deposit to account balance
$price = Request::post('price', true);
$gearySettings = self::gearySettings();
if (empty($price)) {
Session::add('feedback_negative', Text::get('Amountisemptyenteravalidvalue'));
return false;
} elseif (!filter_var($price, FILTER_VALIDATE_FLOAT)) {
Session::add('feedback_negative', Text::get('Amountisnotfloatnumber'));
return false;
} elseif ($price > $gearySettings->maxlimit) {
Session::add('feedback_negative', Text::get('Specifiedamountismorethanmaxlimit')." $$gearySettings->maxlimit, try again.");
return false;
} elseif ($price < $gearySettings->minlimit) {
Session::add('feedback_negative', Text::get('Specifiedamountislessthanminlimit')." $$gearySettings->minlimit, try again.");
return false;
} elseif ($gearySettings->enabled == 0) {
Session::add('feedback_negative', Text::get('MyceliumGearPaymentMethodisdisabled'));
return false;
} else {
$gateway_id = PaymentModel::gearySettings()->field1;
$gateway_secret = PaymentModel::gearySettings()->field2;
$geary = new Geary($gateway_id, $gateway_secret);
$keychain_id = $geary->get_last_keychain_id()->last_keychain_id + 1;
self::updateKeychainGeary($keychain_id);
$callback_data = (string)Session::get('user_id').'&'.$price;
$order = $geary->create_order($price, $keychain_id, $callback_data);
if ($order->payment_id) {
// Redirect to a payment gateway
header("Location: https://gateway.gear.mycelium.com/pay/{$order->payment_id}");
die();
}
}
}
public static function geary() {
$gateway_id = PaymentModel::gearySettings()->field1;
$gateway_secret = PaymentModel::gearySettings()->field2;
$geary = new Geary($gateway_id, $gateway_secret);
$order = $geary->check_order_callback();
// Order status was received
if ($order !== FALSE) {
// If payment is paid 2 or over-paid 4, proceed
if($order['status'] == 2 || $order['status'] == 4) {
// get user id from callback_data (get value before &)
$userid = strtok($order['callback_data'], '&');
// get price from callback_data (get value after &)
$receivedPriceUSD = substr($order['callback_data'], strrpos($order['callback_data'], '&') + 1);
// If the user has over-paid, convert paid bitcoin to usd
if($order['status'] == 4) {
$convert = new Converter;
$receivedPriceUSD = $convert->toCurrency('USD', $order['amount_paid_in_btc']);
}
AffiliateModel::rewardReferrer($userid, $receivedPriceUSD, $order['order_id']);
$database = DatabaseFactory::getFactory()->getConnection();
// Add balance
$add = $database->prepare('UPDATE users SET balance = balance + :amount WHERE user_id = :userid');
$add->execute(array(
':userid' => $userid,
':amount' => $receivedPriceUSD
));
// Add transaction history
$addtran = $database->prepare('INSERT INTO transactions (user_id, payment_id, complete, created, amount, method) VALUES (:userid, :payment, :complete, :created, :amount, :method)');
$addtran->execute(array(
':userid' => $userid,
':payment' => $order['order_id'],
':complete' => 1,
':created' => date('Y-m-d H:i:s'),
':amount' => $receivedPriceUSD,
':method' => 'Mycelium Gear'
));
}
} else {
echo 'Signature mismatch';
}
}
public static function updateKeychainGeary(int $id) {
$database = DatabaseFactory::getFactory()->getConnection();
$update = $database->prepare('UPDATE payment_methods SET field3 = :id WHERE id = 6');
$update->execute([
':id' => $id
]);
}
public static function getUserCustomDefaults()
{
$database = DatabaseFactory::getFactory()->getConnection();
$ids = [];
$values = [];
$query = $database->query("SELECT id, name, enabled, user_default_enabled FROM payment_methods");
$rows = $query->fetchAll();
foreach ($rows as $row) {
$ids[] = $row->id;
$values[] = $row;
}
return array_combine($ids, $values);
} Referan'sın ödemesine göre komisyon
1
●173
- 11-07-2018, 05:40:16Üyeliği durdurulduMerhaba allta bulunan kod içersinde paywant ödeme eklettim fakat referansın ödeme yapınca komisyon vermiyor webmoney gibi diğer ödeme yöntemlerinde sorunsuz çalısıyor bu kodda ne eksik acaba yardım ederseniz sevinirim.Teşekkürler
- 11-07-2018, 05:41:18Üyeliği durduruldukodun devamı
public static function processPayPal() { // Amount user would like to deposit to account balance $price = Request::post('price', true); $paypalsettings = self::paypalsettings(); if (empty($price)) { Session::add('feedback_negative', Text::get('Amountisemptyenteravalidvalue')); return false; } elseif (!filter_var($price, FILTER_VALIDATE_FLOAT)) { Session::add('feedback_negative', Text::get('Amountisnotfloatnumber')); return false; } elseif ($price > $paypalsettings->maxlimit) { Session::add('feedback_negative', Text::get('Specifiedamountismorethanmaxlimit')." $$paypalsettings->maxlimit, try again."); return false; } elseif ($price < $paypalsettings->minlimit) { Session::add('feedback_negative', Text::get('Specifiedamountislessthanminlimit')." $$paypalsettings->minlimit, try again."); return false; } elseif ($paypalsettings->enabled == 0) { Session::add('feedback_negative', Text::get('PayPalPaymentMethodisdisabled')); return false; } else { $customData = ['addfunds', Session::get('user_id')]; SubscriptionModel::processPayPal( $paypalsettings->field1, Config::get('URL').'page/paypal', Config::get('URL').'addfunds', Config::get('URL').'addfunds?paypal=success', Text::get('Addfundstoaccount').': '.Session::get('user_name').' - '.SiteSettingsModel::sitesettings()->sitename, Text::get('Backto').' '.SiteSettingsModel::sitesettings()->sitename, $price, json_encode($customData) ); } } // PAYZA START public static function payzaSettings() { $database = DatabaseFactory::getFactory()->getConnection(); $get = $database->prepare('SELECT * FROM payment_methods WHERE id = 7'); $get->execute(); return $get->fetchObject(); } public static function processPayza() { // Amount user would like to deposit to account balance $price = Request::post('price', true); $payzaSettings = self::payzaSettings(); if (empty($price)) { Session::add('feedback_negative', Text::get('Amountisemptyenteravalidvalue')); return false; } elseif (!filter_var($price, FILTER_VALIDATE_FLOAT)) { Session::add('feedback_negative', Text::get('Amountisnotfloatnumber')); return false; } elseif ($price > $payzaSettings->maxlimit) { Session::add('feedback_negative', Text::get('Specifiedamountismorethanmaxlimit')." $$payzaSettings->maxlimit, try again."); return false; } elseif ($price < $payzaSettings->minlimit) { Session::add('feedback_negative', Text::get('Specifiedamountislessthanminlimit')." $$payzaSettings->minlimit, try again."); return false; } elseif ($payzaSettings->enabled == 0) { Session::add('feedback_negative', Text::get('PayzaPaymentMethodisdisabled')); return false; } else { Session::set('ap_merchant', $payzaSettings->field1); Session::set('ap_purchasetype', 'service'); Session::set('ap_itemname', SiteSettingsModel::sitesettings()->sitename); Session::set('ap_amount', $price); Session::set('ap_currency', 'USD'); Session::set('ap_quantity', 1); Session::set('ap_description', Text::get('Addfundstoaccount').': '.Session::get('user_name').' - '.SiteSettingsModel::sitesettings()->sitename); Session::set('apc_1', Session::get('user_id')); Session::set('ap_ipnversion', 2); Session::set('ap_testmode', 0); Session::set('ap_returnurl', Config::get('URL').'addfunds?payza=success'); Session::set('ap_cancelurl', Config::get('URL').'addfunds'); Session::set('ap_alerturl', Config::get('URL').'page/payza'); Redirect::to('addfunds/processpayza'); } } // Payza will send us a token that we need to send back to verify that this request is valid and from payza to prevent hackers. public static function payza() { $IPN_V2_HANDLER = 'https://secure.payza.com/ipn2.ashx'; $TOKEN_IDENTIFIER = 'token='; $token = urlencode($_POST['token']); $token = $TOKEN_IDENTIFIER . $token; $response = ''; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $IPN_V2_HANDLER); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $token); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($ch); curl_close($ch); if (strlen($response) > 0) { if (urldecode($response) == "INVALID TOKEN") { die(); } else { $response = urldecode($response); $aps = explode("&", $response); $info = array(); foreach ($aps as $ap) { $ele = explode("=", $ap); $info[$ele[0]] = $ele[1]; } $receivedMerchantEmailAddress = $info['ap_merchant']; $transactionStatus = $info['ap_status']; $testModeStatus = $info['ap_test']; $purchaseType = $info['ap_purchasetype']; $totalAmountReceived = $info['ap_totalamount']; $feeAmount = $info['ap_feeamount']; $netAmount = $info['ap_netamount']; $transactionReferenceNumber = $info['ap_referencenumber']; $currency = $info['ap_currency']; $transactionDate = $info['ap_transactiondate']; $transactionType = $info['ap_transactiontype']; $customerFirstName = $info['ap_custfirstname']; $customerLastName = $info['ap_custlastname']; $customerAddress = $info['ap_custaddress']; $customerCity = $info['ap_custcity']; $customerState = $info['ap_custstate']; $customerCountry = $info['ap_custcountry']; $customerZipCode = $info['ap_custzip']; $customerEmailAddress = $info['ap_custemailaddress']; $myItemName = $info['ap_itemname']; $myItemCode = $info['ap_itemcode']; $myItemDescription = $info['ap_description']; $myItemQuantity = $info['ap_quantity']; $myItemAmount = $info['ap_amount']; $additionalCharges = $info['ap_additionalcharges']; $shippingCharges = $info['ap_shippingcharges']; $taxAmount = $info['ap_taxamount']; $discountAmount = $info['ap_discountamount']; // USER ID BELOW $myCustomField_1 = $info['apc_1']; if ($transactionStatus == 'Success') { // Transaction is successfully paid, now lets do our thing $database = DatabaseFactory::getFactory()->getConnection(); AffiliateModel::rewardReferrer($myCustomField_1, $totalAmountReceived); // Add balance $add = $database->prepare('UPDATE users SET balance = balance + :amount WHERE user_id = :userid'); $add->execute(array( ':userid' => $myCustomField_1, ':amount' => $totalAmountReceived )); // Add transaction history $addtran = $database->prepare('INSERT INTO transactions (user_id, payment_id, complete, created, amount, method) VALUES (:userid, :payment, :complete, :created, :amount, :method)'); $addtran->execute(array( ':userid' => $myCustomField_1, ':payment' => $transactionReferenceNumber, ':complete' => 1, ':created' => date('Y-m-d H:i:s'), ':amount' => $totalAmountReceived, ':method' => 'Payza' )); } else { die(); } } } else { //something is wrong, no response is received from Payza die(); } } // PAYZA END /** * @param int $userID * @return array stdClass array of all the payments methods that is turned on * enabled member tells whether payment method is user enabled or not */ public static function getUserPaymentMethods(int $userID): array { $defaults = self::getUserCustomDefaults(); $userValues = UserModel::getPersonalPaymentMethods($userID); $returnValue = []; foreach ($defaults as $d) { if ($d->enabled) { $paymentMethod = new stdClass(); $paymentMethod->id = $d->id; foreach ($userValues as $u) { if ($u->payment_id == $d->id) { $paymentMethod->enabled = $u->enabled; } } if (!isset($paymentMethod->enabled)) { $paymentMethod->enabled = $d->user_default_enabled; } $returnValue[] = $paymentMethod; } } return $returnValue; } public static function getEnabledUserPaymentMethods(int $userID): array { $values = self::getUserPaymentMethods($userID); $returnValue = []; foreach ($values as $v) { if ($v->enabled) { $returnValue[] = $v->id; } } return $returnValue; } // Skrill /* public static function skrillSettings() { $database = DatabaseFactory::getFactory()->getConnection(); $get = $database->prepare('SELECT * FROM pm_skrill'); $get->execute(); return $get->fetchObject(); } public static function skrill() { // Validate the Moneybookers signature $concatFields = $_POST['merchant_id'] .$_POST['transaction_id'] .strtoupper(md5(self::skrillSettings()->secret)) .$_POST['mb_amount'] .$_POST['mb_currency'] .$_POST['status']; // Ensure the signature is valid, the status code == 2, // and that the money is going to you if (strtoupper(md5($concatFields)) == $_POST['md5sig'] && $_POST['status'] == 2 && $_POST['pay_to_email'] == self::skrillSettings()->email) { // Valid transaction. $database = DatabaseFactory::getFactory()->getConnection(); // Add balance $add = $database->prepare('UPDATE users SET balance = balance + :amount WHERE user_id = :userid'); $add->execute(array( ':userid' => $_POST['PAYMENT_ID'], ':amount' => $_POST['PAYMENT_AMOUNT'] )); // Add transaction history $addtran = $database->prepare('INSERT INTO transactions (user_id, payment_id, complete, created, amount, method) VALUES (:userid, :payment, :complete, :created, :amount, :method)'); $addtran->execute(array( ':userid' => $_POST['PAYMENT_ID'], ':payment' => '', ':complete' => 1, ':created' => date('Y-m-d H:i:s'), ':amount' => $_POST['PAYMENT_AMOUNT'], ':method' => 'Perfect Money' )); } else { // Invalid transaction. Bail out exit; } } public static function processSkrill() { // Amount user would like to deposit to account balance $price = Request::post('price', true); $skrillsettings = self::skrillSettings(); if (empty($price)) { Session::add('feedback_negative', "Amount is empty, enter a valid value and try again."); return false; } elseif (!filter_var($price, FILTER_VALIDATE_FLOAT)) { Session::add('feedback_negative', "Amount is not valid, please try again."); return false; } elseif ($price > $skrillsettings->maxlimit) { Session::add('feedback_negative', "Specified amount is more than max limit $$skrillsettings->maxlimit, try again."); return false; } elseif ($price < $skrillsettings->minlimit) { Session::add('feedback_negative', "Specified amount is less than min limit $$skrillsettings->minlimit, try again."); return false; } elseif ($skrillsettings->enabled == 0) { Session::add('feedback_negative', 'Skrill Payment Method is disabled at the moment, try again later.'); return false; } else { $request = new \Skrill\Quick\SkrillRequest(); $request->pay_to_email = $skrillsettings->email; $request->amount = $price; $request->currency = 'USD'; $request->language = 'EN'; $request->prepare_only = '1'; $client = new \Skrill\Quick\SkrillClient($request); $sessionid = $client->generateSID(); //return SESSION ID $redirecturl = $client->getRedirectUrl(); //return redirect url Session::set('processSkrill', 1); Session::set('skrill_amount', $price); Session::set('skrill_sessionid', $redirecturl); Redirect::to('addfunds/processskrill'); } } */ public static function redeemCode($code, $userid) { if (!self::redeemBlocked($userid)) { return false; } $dbc = DatabaseFactory::getFactory()->getConnection(); $codeExists = $dbc->prepare("SELECT *FROM balance_code WHERE balance_key = :code"); $codeExists->execute([':code' => $code]); if ($codeExists->rowCount() == 0) { self::redeemFailed($userid); Session::add('feedback_negative', Text::get('Codewasnotfound')); return false; } $codeObj = $codeExists->fetchObject(); if (isset($codeObj->user_id)) { self::redeemFailed($userid); Session::add('feedback_negative', Text::get('Thiscodehasbeenused')); return false; } AffiliateModel::rewardReferrer(Session::get('user_id'), $codeObj->amount, $codeObj->balance_key); $userBalance = $dbc->prepare("UPDATE users SET balance = (balance + :amount) WHERE users.user_id = :userid"); $userBalance->execute([ ':amount' => $codeObj->amount, ':userid' => $userid ]); if ($userBalance->rowCount() == 1) { $addtran = $dbc->prepare('INSERT INTO transactions (user_id, payment_id, complete, created, amount, method) VALUES (:userid, :payment, :complete, :created, :amount, :method)'); $addtran->execute(array( ':userid' => $userid, ':payment' => $codeObj->balance_key, ':complete' => 1, ':created' => date('Y-m-d H:i:s'), ':amount' => $codeObj->amount, ':method' => 'Redeem' )); $usedCode = $dbc->prepare("UPDATE balance_code SET user_id = :userid WHERE balance_key = :code"); $usedCode->execute([ ':userid' => $userid, ':code' => $codeObj->balance_key ]); $resetFailed = $dbc->prepare("UPDATE redeem_block SET failed_times = 0 WHERE user_id = :userid"); $resetFailed->execute(['userid' => $userid]); return $codeObj->amount; } return false; } public static function redeemFailed($userid) { $dbc = DatabaseFactory::getFactory()->getConnection(); $stmt = $dbc->prepare("INSERT INTO redeem_block(user_id, failed_times, last_failed) VALUES (:userid, 1, NOW()) ON DUPLICATE KEY UPDATE failed_times = (failed_times + 1), last_failed = NOW()"); return $stmt->execute([ ':userid' => $userid ]); } public static function redeemBlocked($user_id) { $dbc = DatabaseFactory::getFactory()->getConnection(); $stmt = $dbc->prepare("SELECT failed_times, UNIX_TIMESTAMP(last_failed) AS last_failed FROM redeem_block WHERE user_id = :userid"); $stmt->execute([':userid' => $user_id]); $user = $stmt->fetchObject(); if ($user->failed_times >= 3 AND ($user->last_failed > (time() - 30))) { Session::add('feedback_negative', Text::get('Toomanyfailedattemptswait').' ' . (30 - (time() - $user->last_failed)) . ' '.Text::get('seconds')); return false; } return true; } public static function addRedeemCodes($code_value, $code_number = 1) { if ($code_value <= 0){ return 0; } $dbc = DatabaseFactory::getFactory()->getConnection(); $stmt = $dbc->prepare("INSERT INTO balance_code(balance_key, amount) VALUES (:code, :amount)"); $added = []; while (sizeof($added) < $code_number){ $code = Text::random_str(10); $stmt->execute([ ':code' => $code, ':amount' => $code_value ]); if($stmt->rowCount() == 1){ $added[] = $code; } } if (sizeof($added) == 0){ return 'No codes'; } return $added; } public static function removeCode($code) { $dbc = DatabaseFactory::getFactory()->getConnection(); $stmt = $dbc->prepare("DELETE FROM balance_code WHERE balance_key = :code"); $stmt->execute([ ':code' => $code ]); return ($stmt->rowCount() > 0) ? true : false; } public static function getRedeemCodes($page = 0, $IPP = 25, $query = "") { $dbc = DatabaseFactory::getFactory()->getConnection(); $sql = "SELECT balance_code.*, users.user_name as username FROM balance_code LEFT JOIN users ON balance_code.user_id = users.user_id"; $data = []; if (strlen($query) > 0){ $sql .= (strlen($query) > 0 ? ' WHERE balance_key = :query' : ''); $data[':query'] = $query; } $sql .= " ORDER BY user_id ASC, amount ASC LIMIT " . ($page * $IPP) . ', ' . $IPP; $stmt = $dbc->prepare($sql); $stmt->execute($data); return $stmt->fetchAll(); } public static function getRedeemCode($code) { $dbc = DatabaseFactory::getFactory()->getConnection(); $stmt = $dbc->prepare("SELECT balance_code.*, users.user_name as username FROM balance_code LEFT JOIN users ON balance_code.user_id = users.user_id WHERE balance_key = :code"); $stmt->execute([':code' => $code]); return $stmt->fetchObject(); } public static function setRedeemGiven($code, $given) { $dbc = DatabaseFactory::getFactory()->getConnection(); $stmt = $dbc->prepare("UPDATE balance_code SET given = :given WHERE balance_key = :code"); $stmt->execute([':given' => $given, ':code' => $code]); return $stmt->rowCount() == 1 ? true : false; } // PAYTM START public static function paytmSettings() { $database = DatabaseFactory::getFactory()->getConnection(); $get = $database->prepare('SELECT * FROM payment_methods WHERE id = 8'); $get->execute(); return $get->fetchObject(); } public static function processPaytm() { // Amount user would like to deposit to account balance $price = Request::post('price', true); $settings = self::paytmSettings(); if (!self::paymentFilterCheck($price, $settings)) return false; $orderid = Session::get('user_id').'_'.self::randomNumber(8); $paramList = []; $paramList["ORDER_ID"] = $orderid; $paramList["CUST_ID"] = Session::get('user_id'); $paramList["INDUSTRY_TYPE_ID"] = 'Retail'; $paramList["CHANNEL_ID"] = 'WEB'; $paramList["TXN_AMOUNT"] = $price; $paramList["MID"] = $settings->field1; $paramList["WEBSITE"] = $settings->field3; $paramList["EMAIL"] = Session::get('user_email'); $paramList["CALLBACK_URL"] = Config::get('URL').'page/paytm'; Session::set('ORDER_ID', $orderid); Session::set('CUST_ID', Session::get('user_id')); Session::set('INDUSTRY_TYPE_ID', 'Retail'); Session::set('CHANNEL_ID', 'WEB'); Session::set('TXN_AMOUNT', $price); Session::set('MID', $settings->field1); Session::set('WEBSITE', $settings->field3); Session::set('EMAIL', Session::get('user_email')); Session::set('CALLBACK_URL', Config::get('URL').'page/paytm'); Session::set('CHECKSUMHASH', Paytm::getChecksumFromArray($paramList,$settings->field2)); Redirect::to('addfunds/processpaytm'); } public static function paymentFilterCheck($price, $settings) { if (empty($price)) { Session::add('feedback_negative', Text::get('Amountisemptyenteravalidvalue')); return false; } elseif (!filter_var($price, FILTER_VALIDATE_FLOAT)) { Session::add('feedback_negative', Text::get('Amountisnotfloatnumber')); return false; } elseif ($price > $settings->maxlimit) { Session::add('feedback_negative', Text::get('Specifiedamountismorethanmaxlimit')." $$settings->maxlimit, try again."); return false; } elseif ($price < $settings->minlimit) { Session::add('feedback_negative', Text::get('Specifiedamountislessthanminlimit')." $$settings->minlimit, try again."); return false; } elseif ($settings->enabled == 0) { Session::add('feedback_negative', Text::get('ChosenPaymentMethodisdisabled')); return false; } return true; } public static function paytm() { $paramList = $_POST; $paytmChecksum = isset($_POST["CHECKSUMHASH"]) ? $_POST["CHECKSUMHASH"] : ""; //Sent by Paytm pg // Verify all parameters received from Paytm pg to your application. Like MID received from paytm pg is same as your applications MID, TXN_AMOUNT and ORDER_ID // are same as what was sent by you to Paytm PG for initiating transaction etc. $isValidChecksum = Paytm::verifychecksum_e($paramList, self::paytmSettings()->field2, $paytmChecksum); //will return TRUE or FALSE string. if($isValidChecksum == "TRUE") { if ($_POST["STATUS"] == "TXN_SUCCESS") { // Transaction is successfully paid, now lets do our thing $database = DatabaseFactory::getFactory()->getConnection(); $userid = strtok(Request::post('ORDERID', true), '_'); $amountinUSD = Request::post('TXNAMOUNT', true); // If currency is in INR, we need to convert to USD. if (Request::post('CURRENCY', true) == 'INR') { $amountinUSD = PaymentModel::convertCurrency('INR', 'USD', Request::post('TXNAMOUNT', true)); } AffiliateModel::rewardReferrer($userid, $amountinUSD); // Add balance $add = $database->prepare('UPDATE users SET balance = balance + :amount WHERE user_id = :userid'); $add->execute(array( ':userid' => $userid, ':amount' => $amountinUSD )); // Add transaction history $addtran = $database->prepare('INSERT INTO transactions (user_id, payment_id, complete, created, amount, method) VALUES (:userid, :payment, :complete, :created, :amount, :method)'); $addtran->execute(array( ':userid' => $userid, ':payment' => Request::post('TXNID', true), ':complete' => 1, ':created' => date('Y-m-d H:i:s'), ':amount' => $amountinUSD, ':method' => 'Paytm' )); Session::add('feedback_positive', Text::get('Yourpaymenthasbeenprocessed')); !empty(Session::get('user_id')) ? Redirect::to('addfunds') : Redirect::to('index'); die(); } else { Session::add('feedback_negative', Text::get('Yourpaymentfailed')); !empty(Session::get('user_id')) ? Redirect::to('addfunds') : Redirect::to('index'); die(); } } else { !empty(Session::get('user_id')) ? Redirect::to('addfunds') : Redirect::to('index'); die(); //Process transaction as suspicious. } } // PAYTM END public static function randomNumber($length) { $result = ''; for($i = 0; $i < $length; $i++) { $result .= mt_rand(0, 9); } return $result; } public static function convertCurrency($from,$to,$amount) { $data = file_get_contents("https://api.fixer.io/latest?base=$from"); $data = json_decode($data); $to = $data->rates->$to; return $amount*$to; } // COINPAYMENTS START public static function coinPaymentsSettings() { $database = DatabaseFactory::getFactory()->getConnection(); $get = $database->prepare('SELECT * FROM payment_methods WHERE id = 9'); $get->execute(); return $get->fetchObject(); } public static function processCoinpayments() { // Amount user would like to deposit to account balance $price = Request::post('price', true); $settings = self::coinPaymentsSettings(); if (!self::paymentFilterCheck($price, $settings)) return false; Session::set('merchant', $settings->field1); Session::set('cmd', '_pay'); Session::set('reset', 1); Session::set('currency', 'USD'); Session::set('allow_currencies', $settings->field3); Session::set('amountf', $price); Session::set('item_name', Text::get('Addfundstoaccount').': '.Session::get('user_name').' - '.SiteSettingsModel::sitesettings()->sitename); Session::set('allow_quantity', 0); Session::set('want_shipping', 0); Session::set('cancel_url', Config::get('URL').'addfunds'); Session::set('custom', Session::get('user_id')); Session::set('ipn_url', Config::get('URL').'page/coinpayments'); Redirect::to('addfunds/processcoinpayments'); } private static function checkIfPaymentAlreadyCompleted($transaction_id, $userid) { $database = DatabaseFactory::getFactory()->getConnection(); $check = $database->prepare('SELECT * FROM transactions WHERE payment_id = :transid AND user_id = :userid AND complete = 1'); $check->execute([ ':transid' => $transaction_id, ':userid' => $userid ]); return $check->rowCount() > 0 ? true : false; } public static function coinpayments() { // Fill these in with the information from your CoinPayments.net account. $cp_merchant_id = self::coinPaymentsSettings()->field1; $cp_ipn_secret = self::coinPaymentsSettings()->field2; if (!isset($_POST['ipn_mode']) || $_POST['ipn_mode'] != 'hmac') { die('IPN Mode is not HMAC'); } if (!isset($_SERVER['HTTP_HMAC']) || empty($_SERVER['HTTP_HMAC'])) { die('No HMAC signature sent.'); } $request = file_get_contents('php://input'); if ($request === FALSE || empty($request)) { die('Error reading POST data'); } if (!isset($_POST['merchant']) || $_POST['merchant'] != trim($cp_merchant_id)) { die('No or incorrect Merchant ID passed'); } $hmac = hash_hmac("sha512", $request, trim($cp_ipn_secret)); if (!hash_equals($hmac, $_SERVER['HTTP_HMAC'])) { //if ($hmac != $_SERVER['HTTP_HMAC']) { <-- Use this if you are running a version of PHP below 5.6.0 without the hash_equals function die('HMAC signature does not match'); } // HMAC Signature verified at this point, load some variables. $txn_id = Request::post('txn_id', true); $amount1 = Request::post('amount1', true); $currency1 = Request::post('currency1', true); $status = Request::post('status', true); //These would normally be loaded from your database, the most common way is to pass the Order ID through the 'custom' POST field. $order_currency = 'USD'; $userid = Request::post('custom', true); // see if the transaction ID $txn_id has already been handled before at this point if (self::checkIfPaymentAlreadyCompleted($txn_id, $userid)) die('Transaction has already been handled.'); // Check the original currency to make sure the buyer didn't change it. if ($currency1 != $order_currency) { die('Original currency mismatch!'); } if ($status >= 100 || $status == 2) { // payment is complete or queued for nightly payout, success $database = DatabaseFactory::getFactory()->getConnection(); AffiliateModel::rewardReferrer($userid, $amount1); // Add balance $add = $database->prepare('UPDATE users SET balance = balance + :amount WHERE user_id = :userid'); $add->execute(array( ':userid' => $userid, ':amount' => $amount1 )); // Add transaction history $addtran = $database->prepare('INSERT INTO transactions (user_id, payment_id, complete, created, amount, method) VALUES (:userid, :payment, :complete, :created, :amount, :method)'); $addtran->execute(array( ':userid' => $userid, ':payment' => $txn_id, ':complete' => 1, ':created' => date('Y-m-d H:i:s'), ':amount' => $amount1, ':method' => 'Coinpayments' )); } die('IPN OK'); } // COINPAYMENTS END }