prinx/sevotransact

Sevotransact 支付网关 SDK。

v2.1.0 2021-05-24 06:22 UTC

This package is auto-updated.

Last update: 2024-09-24 14:31:09 UTC


README

Build Status Latest Stable Version License StyleCI

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类实现了流畅接口。您几乎可以以任何顺序链式调用其大多数方法(如onsuccessfailure方法)。

回调将按注册顺序执行。

有效负载

将有效负载发送到回调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);
});

使用类处理回调

您可以直接将回调闭包传递给successfailureon方法,而不是将所有回调移动到类中,并将类传递给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) {
                //
            }],
        ];
    }
}

您可以传递自定义条件successfailurealways

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

贡献

给仓库星标⭐,分叉它,修复错误,添加新功能,编写测试,纠正文档,并提交拉取请求。

许可

MIT