plugin_name = $plugin; $this->public_key = $pk; } function log_transaction_success($trx_ref){ //send reference to logger along with plugin name and public key $url = "https://plugin-tracker.paystackintegrations.com/log/charge_success"; $fields = [ 'plugin_name' => $this->plugin_name, 'transaction_reference' => $trx_ref, 'public_key' => $this->public_key ]; $fields_string = http_build_query($fields); $ch = curl_init(); curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_POST, true); curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string); curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); //execute post $result = curl_exec($ch); // echo $result; } } // Require libraries needed for gateway module functions. require_once __DIR__ . '/../../../init.php'; require_once __DIR__ . '/../../../includes/gatewayfunctions.php'; require_once __DIR__ . '/../../../includes/invoicefunctions.php'; // Detect module name from filename. $gatewayModuleName = basename(__FILE__, '.php'); // Fetch gateway configuration parameters. $gatewayParams = getGatewayVariables($gatewayModuleName); // Die if module is not active. if (!$gatewayParams['type']) { die("Module Not Activated"); } // Retrieve data returned in payment gateway callback $invoiceId = filter_input(INPUT_GET, "invoiceid"); $txnref = $invoiceId . '_' .time(); $trxref = filter_input(INPUT_GET, "trxref"); if ($gatewayParams['testMode'] == 'on') { $secretKey = $gatewayParams['testSecretKey']; } else { $secretKey = $gatewayParams['liveSecretKey']; } if(strtolower(filter_input(INPUT_GET, 'go'))==='standard'){ // falling back to standard $ch = curl_init(); $isSSL = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443); $amountinkobo = filter_input(INPUT_GET, 'amountinkobo'); $email = filter_input(INPUT_GET, 'email'); $phone = filter_input(INPUT_GET, 'phone'); $callback_url = 'http' . ($isSSL ? 's' : '') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] . '?invoiceid=' . rawurlencode($invoiceId); $txStatus = new stdClass(); // set url curl_setopt($ch, CURLOPT_URL, "https://api.paystack.co/transaction/initialize/"); curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Authorization: Bearer '. trim($secretKey), 'Content-Type: application/json' ) ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( array( "amount"=>$amountinkobo, "email"=>$email, "phone"=>$phone, "reference" => $txnref, "callback_url"=>$callback_url ) ) ); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_SSLVERSION, 6); // exec the cURL $response = curl_exec($ch); // should be 0 if (curl_errno($ch)) { // curl ended with an error $txStatus->error = "cURL said:" . curl_error($ch); curl_close($ch); } else { //close connection curl_close($ch); // Then, after your curl_exec call: $body = json_decode($response); if (!$body->status) { // paystack has an error message for us $txStatus->error = "Paystack API said: " . $body->message; } else { // get body returned by Paystack API $txStatus = $body->data; } } if(!$txStatus->error){ header('Location: ' . $txStatus->authorization_url); die(' Redirecting to authorization_url.'\'>'.$txStatus->authorization_url.'...'); } else { if ($gatewayParams['gatewayLogs'] == 'on') { $output = "Transaction Initialize failed" . "\r\nReason: {$txStatus->error}"; logTransaction($gatewayModuleName, $output, "Unsuccessful"); } die($txStatus->error); } } // if ((strtoupper($_SERVER['REQUEST_METHOD']) != 'POST' ) || !array_key_exists('HTTP_X_PAYSTACK_SIGNATURE', $_SERVER) ) { // exit(); // } $input = @file_get_contents("php://input"); $event = json_decode($input); if (isset($event->event)) { // echo "
"; if(!$_SERVER['HTTP_X_PAYSTACK_SIGNATURE'] || ($_SERVER['HTTP_X_PAYSTACK_SIGNATURE'] !== hash_hmac('sha512', $input, $secretKey))){ exit(); } switch($event->event){ case 'subscription.create': break; case 'subscription.disable': break; case 'charge.success': $trxref = $event->data->reference; //PSTK Logger if ($gatewayParams['testMode'] == 'on') { $pk = $gatewayParams['testPublicKey']; } else { $pk = $gatewayParams['livePublicKey']; } $pstk_logger = new whmcs_paystack_plugin_tracker('whmcs',$pk ); $pstk_logger->log_transaction_success($trxref); //------------------------------------- $order_details = explode( '_', $trxref); $invoiceId = (int) $order_details[0]; break; case 'invoice.create': // Recurring payments case 'invoice.update': // Recurring payments break; } http_response_code(200); // exit(); } /** * Verify Paystack transaction. */ $txStatus = verifyTransaction($trxref, $secretKey); if ($txStatus->error) { if ($gatewayParams['gatewayLogs'] == 'on') { $output = "Transaction ref: " . $trxref . "\r\nInvoice ID: " . $invoiceId . "\r\nStatus: failed" . "\r\nReason: {$txStatus->error}"; logTransaction($gatewayModuleName, $output, "Unsuccessful"); } $success = false; } elseif ($txStatus->status == 'success') { if ($gatewayParams['gatewayLogs'] == 'on') { $output = "Transaction ref: " . $trxref . "\r\nInvoice ID: " . $invoiceId . "\r\nStatus: succeeded"; logTransaction($gatewayModuleName, $output, "Successful"); //PSTK Logger if ($gatewayParams['testMode'] == 'on') { $pk = $gatewayParams['testPublicKey']; } else { $pk = $gatewayParams['livePublicKey']; } $pstk_logger_ = new whmcs_paystack_plugin_tracker('whmcs',$pk ); $pstk_logger_->log_transaction_success($trxref); //------------------------------------- } $success = true; } else { if ($gatewayParams['gatewayLogs'] == 'on') { $output = "Transaction ref: " . $trxref . "\r\nInvoice ID: " . $invoiceId . "\r\nStatus: {$txStatus->status}"; logTransaction($gatewayModuleName, $output, "Unsuccessful"); } $success = false; } function paystackshutdownFunction(){ $invoiceId = filter_input(INPUT_GET, "invoiceid"); $isSSL = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443); $invoice_url = 'http' . ($isSSL ? 's' : '') . '://' . $_SERVER['HTTP_HOST'] . substr($_SERVER['REQUEST_URI'], 0, strrpos($_SERVER['REQUEST_URI'], '/')) . '/../../../viewinvoice.php?id='. rawurlencode($invoiceId); header('Location: '.$invoice_url); } if ($success) { // print_r($txStatus); // die(); /** * Validate Callback Invoice ID. * * Checks invoice ID is a valid invoice number. * * Performs a die upon encountering an invalid Invoice ID. * * Returns a normalised invoice ID. */ $invoiceId = checkCbInvoiceID($invoiceId, $gatewayModuleName); /** * Check Callback Transaction ID. * * Performs a check for any existing transactions with the same given * transaction number. * * Performs a die upon encountering a duplicate. */ checkCbTransID($trxref); $amount = floatval($txStatus->amount)/100; $requested_amount = floatval($txStatus->requested_amount)/100; if (isset($requested_amount) && $requested_amount > 0) { $amount = $requested_amount; } $fees = floatval($txStatus->fees)/100; if ($gatewayParams['convertto']) { $result = select_query("tblclients", "tblinvoices.invoicenum,tblclients.currency,tblcurrencies.code", array("tblinvoices.id" => $invoiceId), "", "", "", "tblinvoices ON tblinvoices.userid=tblclients.id INNER JOIN tblcurrencies ON tblcurrencies.id=tblclients.currency"); $data = mysql_fetch_array($result); $invoice_currency_id = $data['currency']; $converto_amount = convertCurrency($amount, $gatewayParams['convertto'], $invoice_currency_id); $converto_fees = convertCurrency($fees, $gatewayParams['convertto'], $invoice_currency_id); $amount = format_as_currency($converto_amount); $fees = format_as_currency($converto_fees); } /** * Add Invoice Payment. * * Applies a payment transaction entry to the given invoice ID. * * @param int $invoiceId Invoice ID * @param string $transactionId Transaction ID * @param float $paymentAmount Amount paid (defaults to full balance) * @param float $paymentFee Payment fee (optional) * @param string $gatewayModule Gateway module name */ addInvoicePayment($invoiceId, $trxref, $amount, $fees, $gatewayModuleName); // load invoice $isSSL = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443); $invoice_url = 'http' . ($isSSL ? 's' : '') . '://' . $_SERVER['HTTP_HOST'] . substr($_SERVER['REQUEST_URI'], 0, strrpos($_SERVER['REQUEST_URI'], '/')) . '/../../../viewinvoice.php?id='. rawurlencode($invoiceId); header('Location: '.$invoice_url); } else { die($txStatus->error . ' ; ' . $txStatus->status); } function verifyTransaction($trxref, $secretKey) { $ch = curl_init(); $txStatus = new stdClass(); // set url curl_setopt($ch, CURLOPT_URL, "https://api.paystack.co/transaction/verify/" . rawurlencode($trxref)); curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Authorization: Bearer '. trim($secretKey) ) ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_SSLVERSION, 6); // exec the cURL $response = curl_exec($ch); // should be 0 if (curl_errno($ch)) { // curl ended with an error $txStatus->error = "cURL said:" . curl_error($ch); curl_close($ch); } else { //close connection curl_close($ch); // Then, after your curl_exec call: $body = json_decode($response); if (!$body->status) { // paystack has an error message for us $txStatus->error = "Paystack API said: " . $body->message; } else { // get body returned by Paystack API $txStatus = $body->data; } } return $txStatus; }