From 3e0256b91ef561b2a6862a4671abc3ab28b65689 Mon Sep 17 00:00:00 2001 From: Patrick Date: Mon, 24 Jun 2024 10:23:37 -0400 Subject: [PATCH 1/3] SP-986: Plugin cleanup and whmcs.json changes --- .../callback/bitpaycheckout_ipn.php | 67 ++++++++---------- .../gateways/bitpaycheckout/icon-256x256.png | Bin 0 -> 55117 bytes modules/gateways/bitpaycheckout/whmcs.json | 35 +++++++++ 3 files changed, 66 insertions(+), 36 deletions(-) create mode 100644 modules/gateways/bitpaycheckout/icon-256x256.png create mode 100644 modules/gateways/bitpaycheckout/whmcs.json diff --git a/modules/gateways/bitpaycheckout/callback/bitpaycheckout_ipn.php b/modules/gateways/bitpaycheckout/callback/bitpaycheckout_ipn.php index 405f1dd..e67b797 100644 --- a/modules/gateways/bitpaycheckout/callback/bitpaycheckout_ipn.php +++ b/modules/gateways/bitpaycheckout/callback/bitpaycheckout_ipn.php @@ -3,14 +3,9 @@ /** * BitPay Checkout IPN 5.0.0 * - * This file demonstrates how a payment gateway callback should be - * handled within WHMCS. - * - * It demonstrates verifying that the payment gateway module is active, - * validating an Invoice ID, checking for the existence of a Transaction ID, - * Logging the Transaction for debugging and Adding Payment to an Invoice. - * - * For more information, please refer to the online documentation. + * This file verifies that the payment gateway module is active, + * validates an Invoice ID, checks for the existence of a Transaction ID, + * and adds Payment to an Invoice. * * @see https://developers.whmcs.com/payment-gateways/callbacks/ * @@ -30,8 +25,8 @@ // Fetch gateway configuration parameters. $gatewayParams = getGatewayVariables($gatewayModuleName); -define("TEST_URL", 'https://test.bitpay.com/invoices/'); -define("PROD_URL", 'https://bitpay.com/invoices/'); +define('TEST_URL', 'https://test.bitpay.com/invoices/'); +define('PROD_URL', 'https://bitpay.com/invoices/'); function checkInvoiceStatus($url) { @@ -48,17 +43,17 @@ function checkInvoiceStatus($url) $data = $response['data']; $file = 'bitpay.txt'; -$err = "bitpay_err.txt"; +$err = 'bitpay_err.txt'; -file_put_contents($file, "===========INCOMING IPN=========================", FILE_APPEND); +file_put_contents($file, '===========INCOMING IPN=========================', FILE_APPEND); file_put_contents($file, date('d.m.Y H:i:s'), FILE_APPEND); file_put_contents($file, print_r($response, true), FILE_APPEND); -file_put_contents($file, "===========END OF IPN===========================", FILE_APPEND); +file_put_contents($file, '===========END OF IPN===========================', FILE_APPEND); $order_status = $data['status']; $order_invoice = $data['id']; $endpoint = $gatewayParams['bitpay_checkout_endpoint']; -if ($endpoint == "Test") { +if ($endpoint == 'Test') { $url_check = TEST_URL . $order_invoice; } else { $url_check = PROD_URL . $order_invoice; @@ -67,7 +62,7 @@ function checkInvoiceStatus($url) $orderid = checkCbInvoiceID($invoiceStatus->data->orderId, 'bitpaycheckout'); $price = $invoiceStatus->data->price; -#first see if the ipn matches +//first see if the ipn matches $trans_data = Capsule::table('_bitpay_checkout_transactions') ->select('order_id', 'transaction_id', 'transaction_status') ->where([ @@ -81,15 +76,15 @@ function checkInvoiceStatus($url) if ($btn_id) { switch ($data['status']) { - #complete, update invoice table to Paid + //complete, update invoice table to Paid case 'complete': if ($transaction_status == $data['status']) { exit(); } - #update the bitpay_invoice table - $table = "_bitpay_checkout_transactions"; - $update = array("transaction_status" => "complete", "updated_at" => date('Y-m-d H:i:s')); + //update the bitpay_invoice table + $table = '_bitpay_checkout_transactions'; + $update = array('transaction_status' => 'complete', 'updated_at' => date('Y-m-d H:i:s')); try { Capsule::table($table) ->where([ @@ -110,10 +105,10 @@ function checkInvoiceStatus($url) ); break; - #processing - put in Payment Pending + //processing - put in Payment Pending case 'paid': - #update the invoices table - $table = "tblinvoices"; + //update the invoices table + $table = 'tblinvoices'; $update = array("status" => 'Payment Pending','datepaid' => date('Y-m-d H:i:s')); try { Capsule::table($table) @@ -126,9 +121,9 @@ function checkInvoiceStatus($url) file_put_contents($file, $e, FILE_APPEND); } - #update the bitpay_invoice table - $table = "_bitpay_checkout_transactions"; - $update = array("transaction_status" => 'paid', "updated_at" => date('Y-m-d H:i:s')); + //update the bitpay_invoice table + $table = '_bitpay_checkout_transactions'; + $update = array('transaction_status' => 'paid', 'updated_at' => date('Y-m-d H:i:s')); try { Capsule::table($table) ->where([ @@ -141,10 +136,10 @@ function checkInvoiceStatus($url) } break; - #expired, remove from transaction table, wont be in invoice table + //expired, remove from transaction table, wont be in invoice table case 'expired': - #delete any orphans - $table = "_bitpay_checkout_transactions"; + //delete any orphans + $table = '_bitpay_checkout_transactions'; try { Capsule::table($table) ->where('transaction_id', '=', $order_invoice) @@ -154,12 +149,12 @@ function checkInvoiceStatus($url) } break; - #refunded, set invoice and bitpay transaction to refunded status + //refunded, set invoice and bitpay transaction to refunded status case 'pending': - if ($event['name'] == "refund_pending") { - #update the invoices table - $table = "tblinvoices"; - $update = array("status" => 'Refunded','datepaid' => date('Y-m-d H:i:s')); + if ($event['name'] == 'refund_pending') { + //update the invoices table + $table = 'tblinvoices'; + $update = array('status' => 'Refunded','datepaid' => date('Y-m-d H:i:s')); try { Capsule::table($table) ->where([ @@ -171,9 +166,9 @@ function checkInvoiceStatus($url) file_put_contents($file, $e, FILE_APPEND); } - #update the bitpay invoice table - $table = "_bitpay_checkout_transactions"; - $update = array("transaction_status" => 'refunded', "updated_at" => date('Y-m-d H:i:s')); + //update the bitpay invoice table + $table = '_bitpay_checkout_transactions'; + $update = array('transaction_status' => 'refunded', 'updated_at' => date('Y-m-d H:i:s')); try { Capsule::table($table) ->where([ diff --git a/modules/gateways/bitpaycheckout/icon-256x256.png b/modules/gateways/bitpaycheckout/icon-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..0f78df919b3ba22de3d5b2410168642cc2afff04 GIT binary patch literal 55117 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 LNkvXXu0mjfzvLc> literal 0 HcmV?d00001 diff --git a/modules/gateways/bitpaycheckout/whmcs.json b/modules/gateways/bitpaycheckout/whmcs.json new file mode 100644 index 0000000..db8359b --- /dev/null +++ b/modules/gateways/bitpaycheckout/whmcs.json @@ -0,0 +1,35 @@ +{ + "schema": "1.0", + "type": "whmcs-gateways", + "name": "BitPayCheckout", + "license": "MIT", + "category": "payments", + "description": { + "name": "BitPay Checkout", + "tagline": "Accept payments via crypto currency using BitPay", + "features": [ + "Accept bitcoin and bitcoin cash payments from payment protocol compatible wallets", + "Price in your local currency", + "Get settled via Bank transfer (EUR, USD, GBP or any of the supported fiat currencies), BTC, BCH, ETH, WBTC, LTC, DOGE, XRP or stable coins (USDC, GUSD, PAXOS, BUSD and DAI)", + "By design, chargebacks are not possible with cryptocurrency payments", + "Have an overview of all your bitcoin and bitcoin cash payments in your BitPay merchant account at https://bitpay.com/dashboard", + "Refund your customers in bitcoin or bitcoin cash in your BitPay merchant dashboard at https://bitpay.com/dashboard/payments" + ] + }, + "logo": { + "filename": "icon-256x256.png" + }, + "support": { + "homepage": "https:\/\/www.bitpay.com\/", + "learn_more": "https:\/\/www.bitpay.com\/online-payments", + "email": "support@bitpay.com", + "support_url": "https:\/\/www.bitpay.com\/request-help", + "docs_url": "https:\/\/developer.bitpay.com\/" + }, + "authors": [ + { + "name": "BitPay", + "homepage": "https:\/\/www.bitpay.com\/" + } + ] +} From 6a60003b2429624397736f1131b084e21e1d2eb2 Mon Sep 17 00:00:00 2001 From: Patrick Date: Mon, 24 Jun 2024 12:05:10 -0400 Subject: [PATCH 2/3] SP-986: Update comments formatting --- modules/gateways/bitpaycheckout.php | 21 ++++++++----------- .../callback/bitpaycheckout_ipn.php | 20 +++++++++--------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/modules/gateways/bitpaycheckout.php b/modules/gateways/bitpaycheckout.php index 87adab0..69011f6 100644 --- a/modules/gateways/bitpaycheckout.php +++ b/modules/gateways/bitpaycheckout.php @@ -15,11 +15,11 @@ * @license http://www.whmcs.com/license/ WHMCS Eula */ -if (!defined("WHMCS")) { - die("This file cannot be accessed directly"); +if (!defined('WHMCS')) { + die('This file cannot be accessed directly'); } -include_once(__DIR__ . DIRECTORY_SEPARATOR . 'bitpaycheckout' +require(__DIR__ . DIRECTORY_SEPARATOR . 'bitpaycheckout' . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'); @@ -75,8 +75,6 @@ function ($table) { * * radio * * textarea * - * Examples of each field type and their possible configuration parameters are - * provided in the sample function below. * * @see https://developers.whmcs.com/payment-gateways/configuration/ * @@ -140,7 +138,7 @@ function bitpaycheckout_link($config_params) } $bitpay_checkout_mode = $config_params['bitpay_checkout_mode']; - $curpage = basename($_SERVER["SCRIPT_FILENAME"]); + $curpage = basename($_SERVER['SCRIPT_FILENAME']); $curpage = str_replace("/", "", $curpage); if ($curpage != 'viewinvoice.php') { @@ -196,13 +194,12 @@ function bitpaycheckout_link($config_params) $params->orderId = trim($invoiceId); // @phpcs:ignore Generic.Files.LineLength.TooLong + $protocol = 'https://'; $params->notificationURL = $protocol . $_SERVER['SERVER_NAME']. $dir . '/modules/gateways/bitpaycheckout/callback/bitpaycheckout_ipn.php'; // @phpcs:ignore Generic.Files.LineLength.TooLong $params->redirectURL = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $params->fullNotifications = true; - $protocol = 'https://'; - // @phpcs:ignore Generic.Files.LineLength.TooLong $notificationURL = $protocol . $_SERVER['SERVER_NAME'] . $dir . '/modules/gateways/bitpaycheckout/callback/bitpaycheckout_ipn.php'; // @phpcs:ignore Generic.Files.LineLength.TooLong @@ -232,11 +229,11 @@ function bitpaycheckout_link($config_params) $invoice->setBuyer($buyer); $basicInvoice = $client->createInvoice($invoice, Facade::POS, false); - error_log("=======USER LOADED BITPAY CHECKOUT INVOICE====="); + error_log('=======USER LOADED BITPAY CHECKOUT INVOICE====='); error_log(date('d.m.Y H:i:s')); - error_log("=======END OF INVOICE=========================="); + error_log('=======END OF INVOICE=========================='); - #insert into the database + // Insert into the database $pdo = Capsule::connection()->getPdo(); $pdo->beginTransaction(); @@ -277,7 +274,7 @@ function redirectURL($url){ var payment_status = null; var is_paid = false; - window.addEventListener("message", function(event) { + window.addEventListener('message', function(event) { payment_status = event.data.status; if(payment_status == 'paid' || payment_status == 'confirmed' || payment_status == 'complete'){ is_paid = true; diff --git a/modules/gateways/bitpaycheckout/callback/bitpaycheckout_ipn.php b/modules/gateways/bitpaycheckout/callback/bitpaycheckout_ipn.php index e67b797..eac9ec4 100644 --- a/modules/gateways/bitpaycheckout/callback/bitpaycheckout_ipn.php +++ b/modules/gateways/bitpaycheckout/callback/bitpaycheckout_ipn.php @@ -62,7 +62,7 @@ function checkInvoiceStatus($url) $orderid = checkCbInvoiceID($invoiceStatus->data->orderId, 'bitpaycheckout'); $price = $invoiceStatus->data->price; -//first see if the ipn matches +// First see if the ipn matches $trans_data = Capsule::table('_bitpay_checkout_transactions') ->select('order_id', 'transaction_id', 'transaction_status') ->where([ @@ -76,13 +76,13 @@ function checkInvoiceStatus($url) if ($btn_id) { switch ($data['status']) { - //complete, update invoice table to Paid + // Complete, update invoice table to Paid case 'complete': if ($transaction_status == $data['status']) { exit(); } - //update the bitpay_invoice table + // Update the bitpay_invoice table $table = '_bitpay_checkout_transactions'; $update = array('transaction_status' => 'complete', 'updated_at' => date('Y-m-d H:i:s')); try { @@ -105,9 +105,9 @@ function checkInvoiceStatus($url) ); break; - //processing - put in Payment Pending + // Processing - put in Payment Pending case 'paid': - //update the invoices table + // Update the invoices table $table = 'tblinvoices'; $update = array("status" => 'Payment Pending','datepaid' => date('Y-m-d H:i:s')); try { @@ -121,7 +121,7 @@ function checkInvoiceStatus($url) file_put_contents($file, $e, FILE_APPEND); } - //update the bitpay_invoice table + // Update the bitpay_invoice table $table = '_bitpay_checkout_transactions'; $update = array('transaction_status' => 'paid', 'updated_at' => date('Y-m-d H:i:s')); try { @@ -136,9 +136,9 @@ function checkInvoiceStatus($url) } break; - //expired, remove from transaction table, wont be in invoice table + // Expired, remove from transaction table, wont be in invoice table case 'expired': - //delete any orphans + // Delete any orphans $table = '_bitpay_checkout_transactions'; try { Capsule::table($table) @@ -149,7 +149,7 @@ function checkInvoiceStatus($url) } break; - //refunded, set invoice and bitpay transaction to refunded status + // Refunded, set invoice and bitpay transaction to refunded status case 'pending': if ($event['name'] == 'refund_pending') { //update the invoices table @@ -166,7 +166,7 @@ function checkInvoiceStatus($url) file_put_contents($file, $e, FILE_APPEND); } - //update the bitpay invoice table + // Update the bitpay invoice table $table = '_bitpay_checkout_transactions'; $update = array('transaction_status' => 'refunded', 'updated_at' => date('Y-m-d H:i:s')); try { From 3351a4c2cea3ce65ff8930ccd4224aa89bc55f40 Mon Sep 17 00:00:00 2001 From: Patrick Date: Mon, 24 Jun 2024 12:59:22 -0400 Subject: [PATCH 3/3] SP-896: PHPCS fix --- modules/gateways/bitpaycheckout.php | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/gateways/bitpaycheckout.php b/modules/gateways/bitpaycheckout.php index 69011f6..87f09ef 100644 --- a/modules/gateways/bitpaycheckout.php +++ b/modules/gateways/bitpaycheckout.php @@ -195,6 +195,7 @@ function bitpaycheckout_link($config_params) $params->orderId = trim($invoiceId); // @phpcs:ignore Generic.Files.LineLength.TooLong $protocol = 'https://'; + // @phpcs:ignore Generic.Files.LineLength.TooLong $params->notificationURL = $protocol . $_SERVER['SERVER_NAME']. $dir . '/modules/gateways/bitpaycheckout/callback/bitpaycheckout_ipn.php'; // @phpcs:ignore Generic.Files.LineLength.TooLong $params->redirectURL = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";