From 46e53541a3a6813860c553952ec459eb459643c2 Mon Sep 17 00:00:00 2001 From: andy Date: Fri, 25 Mar 2022 02:04:37 +0000 Subject: [PATCH] Init Xendit payment gateway module --- .gitignore | 17 ++++ README.md | 41 ++++++++ modules/gateways/xendit.php | 116 +++++++++++++++++++++++ modules/gateways/xendit/composer.json | 15 +++ modules/gateways/xendit/logo.png | Bin 0 -> 15535 bytes modules/gateways/xendit/phpunit.xml.dist | 9 ++ modules/gateways/xendit/whmcs.json | 20 ++++ 7 files changed, 218 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 modules/gateways/xendit.php create mode 100644 modules/gateways/xendit/composer.json create mode 100644 modules/gateways/xendit/logo.png create mode 100644 modules/gateways/xendit/phpunit.xml.dist create mode 100644 modules/gateways/xendit/whmcs.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4e3f01e --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# Blacklist files/folders in same directory as the .gitignore file +/* +vendor + +# Whitelist some files +!.gitignore +!README.md + +!modules/ +modules/* +!modules/gateways/ +modules/gateways/* +!modules/gateways/xendit/ +!modules/gateways/xendit.php + +modules/gateways/callback +!modules/gateways/callback/xendit.php diff --git a/README.md b/README.md new file mode 100644 index 0000000..f29a931 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# Xendit Payment Gateway Module for WHMCS # + +## Summary ## + +Xendit Payment Gateway allow you to enable the multi payment channels on WHMCS + +## System requirements +This module has been tested against the following tech stacks: + +| Requirement | Minimum | Recommended | +|------------------------|-------------------------------------------------------------|-------------------------------------------------------------------| +| PHP Version | 7.2 | Latest 7.3 or 7.4 Release | +| PHP Memory Limit | 64MB | 128MB** | +| PHP Database Extension | PDO | PDO | +| PHP Extensions | Curl with SSL*** , GD2 Image Library, JSON Support, XML | Iconv, MBString, GMP, OpenSSL***, BC Math, Intl, Fileinfo | +| MySQL Version | 5.2.0 | Latest 5.7 | +| Ioncube Loaders | 10.4.5 or later | The latest 11.x Ioncube for your PHP version | + +For the latest WHMCS minimum system requirements, please refer to +https://docs.whmcs.com/System_Requirements + +## Installation ## +- Clone this to your directory +- Copy `modules/gateways/xendit` to your `/modules/gateways` +- Copy `modules/gateways/callback/xendit.php` to your `/modules/gateways/callback` + +## Configuration ## +1. Access your WHMCS admin page. +2. Go to menu Setup -> Payments -> Payment Gateways. +3. There are will be `**Xendit Payment Gateway Module**` +4. Then choose Setup -> Payments -> Payment Gateways -> Manage Existing Gateways +5. Put the `secretKey` and `publicKey` (Open Xendit Dashboard > Settings > API Keys > Generate Secret Key > Copy SecretKey & PublicKey) +6. Click Save Changes + +## Ownership + +Team: [TPI Team](https://www.draw.io/?state=%7B%22ids%22:%5B%221Vk1zqYgX2YqjJYieQ6qDPh0PhB2yAd0j%22%5D,%22action%22:%22open%22,%22userId%22:%22104938211257040552218%22%7D) + +Slack Channel: [#integration-product](https://xendit.slack.com/messages/integration-product) + +Slack Mentions: `@troops-tpi` diff --git a/modules/gateways/xendit.php b/modules/gateways/xendit.php new file mode 100644 index 0000000..2e7af8d --- /dev/null +++ b/modules/gateways/xendit.php @@ -0,0 +1,116 @@ + 'Xendit Payment Gateway', + 'APIVersion' => '1.1' + ); +} + +function xendit_storeremote($params){} + +/** + * @return array + */ +function xendit_config() +{ + (new \Xendit\Lib\ActionBase())->createTable(); + return (new \Xendit\Lib\ActionBase())->createConfig(); +} + +/** + * @param $params + * @return string + * @throws Exception + */ +function xendit_link($params) +{ + return (new \Xendit\Lib\Link())->generatePaymentLink($params); +} + +/** + * No local credit card input. + * + * This is a required function declaration. Denotes that the module should + * not allow local card data input. + */ +function xendit_nolocalcc() {} + +/** + * Remote input. + * + * Called when a pay method is requested to be created or a payment is + * being attempted. + * + * New pay methods can be created or added without a payment being due. + * In these scenarios, the amount parameter will be empty and the workflow + * should be to create a token without performing a charge. + * + * @param array $params Payment Gateway Module Parameters + * + * @see https://developers.whmcs.com/payment-gateways/remote-input-gateway/ + * + * @return array + */ +function xendit_remoteinput($params) +{ + +} + +/** + * Remote update. + * + * Called when a pay method is requested to be updated. + * + * The expected return of this function is direct HTML output. It provides + * more flexibility than the remote input function by not restricting the + * return to a form that is posted into an iframe. We still recommend using + * an iframe where possible and this sample demonstrates use of an iframe, + * but the update can sometimes be handled by way of a modal, popup or + * other such facility. + * + * @param array $params Payment Gateway Module Parameters + * + * @see https://developers.whmcs.com/payment-gateways/remote-input-gateway/ + * + * @return array + */ +function xendit_remoteupdate($params) +{ + if(strpos($_REQUEST["rp"], "/admin/") !== FALSE){ + return << + Updating your card/bank is not possible. Please create a new Pay Method to make changes. + +HTML; + } +} + +/** + * Admin status message. + * + * Called when an invoice is viewed in the admin area. + * + * @param array $params Payment Gateway Module Parameters. + * + * @return array + */ +function xendit_adminstatusmsg($params) +{ +} diff --git a/modules/gateways/xendit/composer.json b/modules/gateways/xendit/composer.json new file mode 100644 index 0000000..c4aba68 --- /dev/null +++ b/modules/gateways/xendit/composer.json @@ -0,0 +1,15 @@ +{ + "name": "xendit/xendit-whmcs", + "description": "Xendit Payment Gateway for WHMCS", + "license": "MIT", + "authors": [ + { + "name": "TPI", + "email": "thirdpartyintegrations@xendit.co" + } + ], + "homepage": "https://xendit.co", + "require-dev": { + "phpunit/phpunit": "@stable" + } +} diff --git a/modules/gateways/xendit/logo.png b/modules/gateways/xendit/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..00233670f8f1b7f0dfbba47ae6f79a6c291b4d15 GIT binary patch literal 15535 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 literal 0 HcmV?d00001 diff --git a/modules/gateways/xendit/phpunit.xml.dist b/modules/gateways/xendit/phpunit.xml.dist new file mode 100644 index 0000000..5575376 --- /dev/null +++ b/modules/gateways/xendit/phpunit.xml.dist @@ -0,0 +1,9 @@ + + + + + + tests/* + + + diff --git a/modules/gateways/xendit/whmcs.json b/modules/gateways/xendit/whmcs.json new file mode 100644 index 0000000..f37f6c3 --- /dev/null +++ b/modules/gateways/xendit/whmcs.json @@ -0,0 +1,20 @@ +{ + "schema": "1.0", + "type": "whmcs-gateways", + "name": "xendit", + "license": "MIT", + "category": "payments", + "description": { + "name": "Xendit", + "tagline": "Xendit Payment Gateway for WHMCS" + }, + "logo": { + "filename": "logo.png" + }, + "authors": [ + { + "name": "TPI", + "homepage": "https:\/\/xendit.co\/" + } + ] +}