prinx / sevotransact
Sevotransact 支付网关 SDK。
Requires
- php: >=7.3
- illuminate/collections: ^8.16
- prinx/dotenv: ^1.0
- prinx/notify: ^0.0
- respect/validation: ^2.2
- symfony/http-client: ^5.1
- symfony/http-foundation: ^5.1
Requires (Dev)
- nunomaduro/collision: ^5.1
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.4
- symfony/var-dumper: ^5.1
README
SEVOTRANSACT PHP SDK
Sevotransact 支付网关 PHP SDK 可以与您喜欢的框架或纯 PHP 项目一起使用。
安装
该软件包可以通过 composer 安装。如果您还没有安装,请先安装它。然后在项目根目录中打开终端并运行
composer require prinx/sevotransact
用法
首先在项目根目录中创建一个 .env
文件,如果您还没有的话。
接下来,通过输入您的 sevotransact 凭据和账户信息来配置 .env 文件
#... SEVOTRANSACT_ID=your_sevotransact_id SEVOTRANSACT_KEY=your_sevotransact_key SEVOTRANSACT_ACCOUNT=your_sevotransact_account SEVOTRANSACT_NICKNAME=your_sevotransact_nickname SEVOTRANSACT_DESCRIPTION=your_sevotransact_description SEVOTRANSACT_PRIMARY_CALLBACK=primary_callback SEVOTRANSACT_SECONDARY_CALLBACK=secondary_callback
主要和次要回调是 SEVOTRANSACT
将交易结果发送到的 URL。您可以在此处查看如何处理交易回调。
次要回调是可选的。
请求支付
require 'path/to/vendor/autoload.php'; // Not needed if using a framework. use Prinx\Sevotransact\MobileMoney; $payment = new MobileMoney; $amount = 1; // 1 GHC $phone = '233...'; $network = 'MTN'; // MTN|AIRTEL|VODAFONE $request = $payment->request($amount, $phone, $network);
凭证码
某些网络(通常是 VODAFONE)要求用户生成凭证码。此代码可以轻松传递到请求中
$request = $payment->request($amount, $phone, $network, $voucherCode); // or $payment->setVoucherCode($voucherCode); $request = $payment->request($amount, $phone, $network);
凭证码现在是可选的。如果没有传递,用户将直接在手机上收到提示以接受交易。
移动货币请求响应
移动货币请求将自动返回一个响应,您可以从中判断请求是否正在处理。
$request = $payment->request($amount, $phone, $network); if ($request->isBeingProcessed()) { $status = $request->getStatus(); // ... } else { $error = $request->getError(); // ... }
警告:此响应只是通知您您的请求已收到并正在处理,或者在发送请求时出现了错误。这不是移动货币请求的实际响应。移动货币请求的实际响应将发送到您提供的回调 URL。
处理回调
交易结果将被发送到发送请求时提供的回调 URL。要处理回调,在您喜欢的框架中创建一个新的路由,或者创建一个 php 文件来处理回调。解析到该路由或文件的 URL 必须是您在 .env
中提供的回调 URL。
现在,您可以创建一个回调实例,该实例将接收您交易的状况
// File: callback.php require 'path/to/vendor/autoload.php'; use Prinx\Sevotransact\Callback; $callback = new Callback;
或者如果您正在使用框架,并且回调路由由控制器处理
// This is just an example. // Write your controller the way you are used to with your favorite framework. namespace Controllers; use Prinx\Sevotransact\Callback; class MobileMoneyCallbackController extends Controller { public function processCallback() { $callback = new Callback; } }
现在我们可以注册将在移动货币交易成功、失败或某些定义的特定条件下运行的回调函数。这些回调函数将接收 $callback
实例。
$callback->success(function (Callback $callback) { // Transaction was successful. Do stuff. })->failure(function (Callback $callback) { // Transaction failed. Do stuff. })->always(function (Callback $callback) { // Do stuff whether transaction was successful or not. });
您不需要使用所有回调。只需使用所需的回调即可。
现在,通过在回调上调用 process
方法来运行一切。
$callback->process();
完整的代码将是
$callback = new Callback; $callback->success(function (Callback $callback) { // })->failure(function (Callback $callback) { // })->always(function (Callback $callback) { // })->process();
提示:如果您只有一个回调函数将在交易成功或失败时运行,您可以直接将函数传递给 process 方法
$callback = new Callback; $callback->process(function (Callback $callback) { // });
成功的交易
交易代码确定交易是成功还是失败。默认情况下,成功的交易代码包含在 $callback->getSuccessCodes()
返回的数组中。您可以选择(可能出于任何原因)将失败代码视为成功代码,通过使用 $callback->addSuccessCode($code)
方法将其添加到成功代码中。
on 方法
on
方法是一种强大的监听交易请求回调的方式。它接受一个数组作为第一个参数,该数组包含可以匹配请求负载的条件,以及作为第二个参数的回调函数,如果条件与负载匹配,则将运行该回调函数。
可以将字符串作为条件传递,然后它将被视为回调URL中的有效负载中发送的代码。
use Prinx\Sevotransact\Callback; $callback = new Callback; $callback->on('000', function (Callback $callback) { // })->on('101', function (Callback $callback) { // })->on(['code' => '000', 'phone' => '233...'], function (Callback $callback) { // })->success(function (Callback $callback){ // We can still chain the success or failure methods. })->failure(function (Callback $callback) { // })->process();
Callback类实现了流畅接口。您几乎可以以任何顺序链式调用其大多数方法(如on
、success
、failure
方法)。
回调将按注册顺序执行。
有效负载
将有效负载发送到回调URL。它包含8个参数
code
请求的代码。
$requestCode = $callback->getCode();
status
$requestStatus = $callback->getStatus(); // approved, declined...
details
状态详情消息。
$requestDetails = $callback->getDetails();
id
事务ID。
$transactionId = $callback->getId();
phone
请求的电话号码。
$phone = $callback->getPhone(); // 233...
network
电话号码所属的网络。
$network = $callback->getNetwork(); // MTN, AIRTEL, VODAFONE, ...
amount
交易金额。
$amount = $callback->getAmount();
currency
交易所使用的货币。
$currency = $callback->getCurrency(); // GHS
您可以通过不带参数调用getPayload
方法来获取所有有效负载数组。
$payload = $callback->getPayload();
您还可以通过将参数名传递给getPayload
方法来获取任何有效负载参数,例如
$transactionId = $callback->getPayload('id'); $transactionCode = $callback->getPayload('code');
与请求相关的消息
您可以通过调用回调实例的message
方法来获取与请求相关的消息。
$message = $callback->getMessage();
消息与有效负载中的代码相关联。
消息
这些是可能的消息
[ '000' => 'Transaction successful. Your transaction ID is '.$transactionId, '101' => 'Transaction failed. Insufficient fund in wallet.', '102' => 'Transaction failed. Number non-registered for mobile money.', '103' => 'Transaction failed. Wrong PIN. Transaction timed out.', '104' => 'Transaction failed. Transaction declined', '114' => 'Transaction failed. Invalid voucher', '909' => 'Transaction failed. Duplicate transaction id.', 'default' => 'Transaction failed.', ];
在闭包中使用移动货币回调实例
回调实例会自动传递到闭包中。然后您可以使用它如下
$callback->success(function (Callback $callback) { $message = $callback->getMessage(); });
将其他参数传递给闭包
您可以通过在闭包上使用PHP的use
关键字轻松地将其他参数传递给闭包
// SmsService is your own implementation. $sms = new SmsService(); $callback->success(function (Callback $callback) use ($sms) { $message = $callback->getMessage(); $phone = $callback->getPhone(); $sms->send($message, $phone); });
使用类处理回调
您可以直接将回调闭包传递给success
、failure
或on
方法,而不是将所有回调移动到类中,并将类传递给process
方法。
首先,创建一个包含callbacks
方法的类
class CallbackHandler { public function callbacks(Callback $callback) { // } }
callbacks
方法必须返回一个数组,包含您的条件与回调闭包的映射
class CallbackHandler { public function callbacks(Callback $callback) { return [ ['000', function (Callback $callback) { $message = $callback->getMessage(); }], ['101', function (Callback $callback) { // }], ]; } }
映射可以是重复的
class CallbackHandler { public function callbacks(Callback $callback) { return [ ['000', function (Callback $callback) { // }], ['000', function (Callback $callback) { // Another callback that will be run for the same code. }], ['101', function (Callback $callback) { // }], ]; } }
或者您可以传递闭包数组
class CallbackHandler { public function callbacks(Callback $callback) { return [ ['000', [ function (Callback $callback) { // }, function (Callback $callback) { // Another callback that will be run for the same code. }, ]], ['101', function (Callback $callback) { // }], ]; } }
您可以传递自定义条件success
、failure
或always
class CallbackHandler { public function callbacks(Callback $callback) { return [ ['success', function (Callback $callback) { // }], ['failure', function (Callback $callback) { // }], ['always', function (Callback $callback) { // }], ]; } }
您还可以传递条件数组
class CallbackHandler { public function callbacks(Callback $callback) { return [ [['code' => '000', 'phone' => '233...'], function (Callback $callback) { // }], ]; } }
所有这些都可以根据您的需求混合使用
class CallbackHandler { public function callbacks(Callback $callback) { return [ ['000', function (Callback $callback) { // }], [['code' => '000', 'phone' => '233...'], function (Callback $callback) { // }], ['success', function (Callback $callback) { // }], ['always', function (Callback $callback) { // }], ]; } }
在回调方法中直接返回闭包而不是直接返回闭包,您可以在回调处理类中创建公共方法,并在callbacks
方法返回的数组中引用这些方法
class CallbackHandler { public function callbacks(Callback $callback) { return [ ['000', 'sendSms'], ['101', ['notifyAdmin', 'sendSms']] ['always', 'log'], ]; } public function notifyAdmin(Callback $callback) { // Notify admin... } public function sendSms(Callback $callback) { // } public function log(Callback $callback) { // } }
编写回调处理类后,只需将其传递给process方法即可
// Do not forget to import the class from it namespace use App\Helpers\CallbackHandler; $callback = new Callback; $callback->process(CallbackHandler::class);
日志记录
本地日志记录
您可以为事务自动记录提供日志文件夹。
$callback->setLogFolder($path);
如果没有设置文件夹,则将在YOUR_PROJECT_ROOT_FOLDER/storage/logs/sevotransact/
创建默认日志文件夹。
您可以使用环境变量来禁用本地日志(默认启用)
SEVOTRANSACT_LOCAL_LOG_ENABLED=false
记录到SLACK
您可以在您的.env
文件中提供SLACK webhook,以自动将事务记录到SLACK。
SEVOTRANSACT_SLACK_LOG_WEBHOOK=https://
您可以在.env
中禁用记录到SLACK
SEVOTRANSACT_SLACK_LOG_ENABLED=false
默认启用。
禁用日志
要禁用整个日志系统,请在您的.env
文件中设置
SEVOTRANSACT_LOG_ENABLED=false
贡献
给仓库星标⭐,分叉它,修复错误,添加新功能,编写测试,纠正文档,并提交拉取请求。