divergent/bkash

bKash支付网关用于Laravel。

v1.2.0 2022-07-05 06:41 UTC

This package is auto-updated.

Last update: 2024-09-05 13:02:58 UTC


README

安装与配置

进入项目目录并打开终端。然后运行以下命令

composer require divergent/bkash

对于低于5.5版本的Laravel,打开config/app文件并在providers数组中添加以下行

如果你使用的是大于5.5版本的Laravel,则跳过此部分

Divergent\Bkash\BkashServiceProvider::class,

然后在命令行/终端中运行以下命令

php artisan vendor:publish --provider="Divergent\Bkash\BkashServiceProvider"

成功发布后,更新你的.env文件。以下是一个示例ENV文件

你还会看到位于config文件夹中的bkash.php文件。在成功发布后,以下内容将出现在bkash.php文件中。

return [
    'intent' => env('BKASH_INTENT', 'sale'),
    'checkout' => [
        'sandbox' => env('BKASH_CHECKOUT_SANDBOX', 'true'),
        'version' => env('BKASH_CHECKOUT_VERSION', 'v1.2.0-beta'),
        'app_key' => env('BKASH_CHECKOUT_APP_KEY', ''),
        'app_secret' => env('BKASH_CHECKOUT_APP_SECRET', ''),
        'username' => env('BKASH_CHECKOUT_USER_NAME', ''),
        'password' => env('BKASH_CHECKOUT_PASSWORD', ''),
        'sandbox_script' => env('BKASH_CHECKOUT_SANDBOX_SCRIPT', ''),
        'production_script' => env('BKASH_CHECKOUT_PRODUCTION_SCRIPT', ''),
    ],
    'tokenized' => [
        'sandbox' => env('BKASH_TOKENIZED_SANDBOX', 'true'),
        'version' => env('BKASH_TOKENIZED_VERSION', 'v1.2.0-beta'),
        'app_key' => env('BKASH_TOKENIZED_APP_KEY', ''),
        'app_secret' => env('BKASH_TOKENIZED_APP_SECRET', ''),
        'username' => env('BKASH_TOKENIZED_USER_NAME', ''),
        'password' => env('BKASH_TOKENIZED_PASSWORD', ''),
        'call_back_url' => env('BKASH_TOKENIZED_CALL_BACK_URL', '')
    ],
    'recurring' => [
        'merchant_short_code' => env('BKASH_RECURRING_MERCHANT_SHORT_CODE'),
        'api_key' => env('BKASH_RECURRING_API_KEY', ''),
        'redirect_url' => env('BKASH_RECURRING_REDIRECT_URL', ''),
        'version' => env('BKASH_RECURRING_VERSION', ''),
        'channelId' => env('BKASH_CHANNEL_ID_VERSION', ''),
        'amountQueryUrl' => env('BKASH_AMOUNT_QUERY_URL', null),
        'serviceId' => env('BKASH_RECURRING_SERVICE_ID', ''),
        'maxCapAmount' => env('BKASH_RECURRING_MAX_CAP_AMOUNT', null),
        'maxCapRequired' => env('BKASH_RECURRING_MAX_CAP_REQUIRED', false),
        'payer' => env('BKASH_RECURRING_PAYER', null),
        'payerType' => env('BKASH_RECURRING_PAYER_TYPE', 'CUSTOMER'),
        'paymentType' => env('BKASH_RECURRING_PAYMENT_TYPE', 'FIXED'),
    ]
];

最后,只需运行以下命令

php artisan migrate

此命令将生成一些必要的数据库表,使商家能够更有效地使用此包。

注意:你可以向这些表中添加或删除任何字段(如果有需要)。

使用方法

结账

标记化

周期性

Webhook

结账支付

调用Checkout Payment方法之前,首先需要创建CheckoutApi类的实例。

别忘了在文件顶部导入use Divergent\Bkash\Apis\Checkout\CheckoutApi;

注意:配置将来自你在.env文件中之前设置的配置。请记住,你需要设置用于授权的令牌。

$checkout = new CheckoutApi();

//you can get token by calling getToken() method.
$token = $checkout->getToken();

//you can set token by calling setToken() method.
$checkout->setToken($token['token']);

创建支付(销售或捕获)

$amount = 'your product amount';
$invoice_no = 'any unique number used in marchant side';
$intent = env('BKASH_INTENT'); //intent will be 'sale' or 'authorization' which you have defined in .env file.

$checkout->create($amount, $invoice_no, $intent);

$merchantAssociationInfo是可选字段。默认的$currencyBDT

执行支付

$checkout->execute($paymentID);

你将从创建支付中获取$paymentID

查询支付

$checkout->queryPayment($paymentID);

你将从执行支付中获取$paymentID

捕获支付

$checkout->capture($paymentID);

你将从执行支付中获取$paymentID

注意:Capture Payment将用于具有authorization意图的支付。

取消支付

$checkout->void($paymentID);

你将从执行支付中获取$paymentID

注意:Void Payment将用于具有authorization意图的支付。

结账支付出

结账B2C支付出

$amount = 'payout amount';
$merchantInvoiceNumber = 'any unique number used in marchant side';
$receiverMSISDN = 'receiver wallet number';

$checkout->b2cPayment($amount, $merchantInvoiceNumber, $receiverMSISDN);

结账B2B支付出

$amount = 'payout amount';
$merchantInvoiceNumber = 'any unique number used in marchant side';
$receiverMSISDN = 'receiver wallet number';

$initPayout = $checkout->initiatPayout();
$payoutID = $initPayout['payoutID'];
$checkout->b2bPayout($payoutID, $amount, $merchantInvoiceNumber, $receiverMSISDN);

首先,你必须调用initiatPayout方法,这将返回一个payoutID。然后你可以调用b2bPayout来执行B2B支付。

结账B2B查询支付出

$checkout->queryPayout($payoutID);

你将从结账B2B支付出中获取$payoutID

结账支持的操作

搜索交易

$checkout->searchTransaction($trxID);

你将从执行支付中获取$trxID

查询组织余额

$checkout->queryOrgBalance();

账户间转账

$amount = 'amount to transfer';
$transferType = 'transfer type'; //It can be either 'Collection2Disbursement' or 'Disbursement2Collection'.

$checkout->intraAccountTransfer($amount, $transferType);

结账退款

退款交易

$paymentID = 'payment ID';
$amount = 'refund amount';
$trxID = 'transaction ID';
$sku = 'product unique code';
$reason = 'reason for refund';

$checkout->refundTransaction($paymentID, $amount, $trxID, $sku, $reason);

$sku$reason是可选字段。你将从执行支付中获取$paymentID$trxID

退款状态

$checkout->refundStatus($paymentID, $trxID);

你将从执行支付中获取$paymentID$trxID

标记化协议

调用Tokenized Agreement方法之前,首先需要创建TokenizedApi类的实例。

别忘了在文件顶部导入use Divergent\Bkash\Apis\Tokenized\TokenizedApi;

注意:配置将来自你在.env文件中之前设置的配置。请记住,你需要设置用于授权的令牌。

$tokenized = new TokenizedApi();

//you can get token by calling getToken() method.
$token = $tokenized->getToken();

//you can set token by calling setToken() method.
$tokenized->setToken($token['token']);

创建协议

$payerReference = 'any related reference value';

$tokenized->createAgreement(BkashConstant::CREATE_AGREEMENT, $payerReference);

要创建协议,首先需要传递BkashConstant::CREATE_AGREEMENT参数,它允许回调URL知道要重定向到哪个页面。以下是可能的常量列表及其定义,以便更好地理解——

Bkash常量定义

  • BkashConstant::CREATE_AGREEMENT - 用于创建协议。
  • BkashConstant::WITHOUT_AGREEMENT_PAYMENT - 用于不使用协议进行支付。
  • BkashConstant::WITH_AGREEMENT_PAYMENT - 用于使用协议进行支付。
  • BkashConstant::PAYMENT - 用于仅创建支付。

注意:**商户方必须维护数据库表以了解用户是否已创建协议。**

执行协议

$tokenized->executeAgreement($paymentID);

您将从创建协议中获取$paymentID

协议状态

$tokenized->status($agreementID);

您将从创建协议中获取$agreementID

协议取消

$tokenized->cancel($agreementID);

您将从创建协议中获取$agreementID

令牌化支付

令牌化创建支付(销售或捕获)

$intent = 'sale or authorization'; //better to get data from ENV.
$payerReference = 'any related reference value';
$amount = 'your product amount';
$invoice_no = 'any unique number used in marchant side';

//create payment with agreement
$tokenized->createAgreement(BkashConstant::WITH_AGREEMENT_PAYMENT, $payerReference, $amount, $invoice_no, '');

//create payment without agreement
$tokenized->create($intent, BkashConstant::WITHOUT_AGREEMENT_PAYMENT, $payerReference, $amount, $invoice_no, '');

要创建支付,首先需要传递BkashConstant::PAYMENT参数,它允许回调URL知道要重定向到哪个页面。此常量还定义您将要调用的操作。您可以在此处了解更多信息这里。您将从创建协议中获取$agreementID$merchantAssociationInfo是可选字段。默认$currency是**BDT**。

令牌化执行支付

$tokenized->execute($paymentID);

您将从创建支付中获取$paymentID

令牌化查询支付

$tokenized->queryPayment($paymentID);

您将从执行支付中获取$paymentID

令牌化捕获支付

$tokenized->capture($paymentID);

您将从执行支付中获取$paymentID

注意:**令牌化捕获支付**将用于带有**授权**意图的支付。

令牌化取消支付

$tokenized->void($paymentID);

您将从执行支付中获取$paymentID

注意:**令牌化取消支付**将用于带有**授权**意图的支付。

令牌化支付

令牌化账户间转账

$amount = 'amount to transfer';
$transferType = 'transfer type'; //It can be either 'Collection2Disbursement' or 'Disbursement2Collection'.

$initPayout = $tokenized->initiatePayout("INTRA");
$payoutID = $initPayout['payoutID'];
$tokenized->intraAccountTransfer($amount, $transferType);

令牌化B2C支付

$amount = 'payout amount';
$merchantInvoiceNumber = 'any unique number used in marchant side';
$receiverMSISDN = 'receiver wallet number';

$initPayout = $tokenized->initiatPayout("B2C");
$payoutID = $initPayout['payoutID'];
$tokenized->b2cPayout($payoutID, $amount, $merchantInvoiceNumber, $receiverMSISDN);

令牌化B2B支付

$amount = 'payout amount';
$merchantInvoiceNumber = 'any unique number used in marchant side';
$receiverMSISDN = 'receiver wallet number';

$initPayout = $tokenized->initiatPayout("B2B");
$payoutID = $initPayout['payoutID'];
$tokenized->b2bPayout($payoutID, $amount, $merchantInvoiceNumber, $receiverMSISDN);

首先,你必须调用initiatPayout方法,这将返回一个payoutID。然后你可以调用b2bPayout来执行B2B支付。

令牌化B2B查询支付

$tokenized->queryPayout($payoutID);

您将从令牌化B2B支付中获取$payoutID

令牌化退款

退款交易

$paymentID = 'payment ID';
$amount = 'refund amount';
$trxID = 'transaction ID';
$sku = 'product unique code';
$reason = 'reason for refund';

$tokenized->refundTransaction($paymentID, $amount, $trxID, $sku, $reason);

$sku$reason是可选字段。您将从执行支付中获取$paymentID$trxID

退款状态

$tokenized->refundStatus($paymentID, $trxID);

您将从执行支付中获取$paymentID$trxID

周期性订阅

要调用**周期性订阅**方法,首先需要创建**Subscription**类的实例。

别忘了在文件顶部导入use Divergent\Bkash\Apis\Recurring\Subscription;

注意:配置将从前面的**.env**文件中获取。

$subscription = new Subscription();

创建订阅

$data = [
            "subscriptionRequestId" => "System generated unique id",
            "serviceId" => "Provided by bKash",
            "paymentType" => "FIXED",
            "subscriptionType" => "BASIC - indicates only scheduled payment and WITH_PAYMENT - indicates a  mandatory immediate payment for subscription creation",
            "amountQueryUrl" => null,
            "amount" => "Amount that will be recurrently paid",
            "firstPaymentAmount" => "Amount needs to be paid when subscription is created for the first time",
            "currency" => "BDT",
            "firstPaymentIncludedInCycle" => "If subscription has first payment during registration",
            "maxCapAmount" => "Maximum value of a payment",
            "maxCapRequired" => false,
            "frequency" => "Cycles for each subscriptions",
            "startDate" => "From this date, payment deduction will take place",
            "expiryDate" => "After this date, no payment will take place",
            "payerType" => " Whether it is Customer or any partner organization",
            "payer" => "Wallet ID of a customer",
            "subscriptionReference" => "subscription reference shared by merchant",
            "extraParams" => "Optional parameter if needed (should be key value pair)",
            "redirectUrl" => "fetch from env file",
            "merchantShortCode" => "fetch from env file"
        ];

$subscription->create($data);

以下列出了可用的周期性周期——

  • DAILY
  • WEEKLY
  • FIFTEEN_DAYS
  • THIRTY_DAYS
  • NINETY_DAYS
  • ONE_EIGHTY_DAYS
  • CALENDAR_MONTH
  • CALENDAR_YEAR

通过请求ID查询订阅

$subscription->queryBySubscriptionRequestID($requestId);

您将从创建订阅中获取$requestId

通过订阅ID查询订阅

$subscription->queryBySubscriptionID($subscriptionID);

您将从通过请求ID查询订阅中获取$subscriptionID

取消订阅

$subscription->cancelSubscription($subscriptionID, $reason);

您将从通过请求ID查询订阅中获取$subscriptionID。**$reason**是可选值,包含字符串值。

订阅列表

$subscription->subscriptionList($page, $size);

$page 表示您想要查看的订阅列表的起始页面,$size 表示您想要显示的行数。

周期性付款

在调用 周期性付款 方法之前,您首先需要创建 Payment 类的实例。

请别忘了在文件顶部导入 use Divergent\Bkash\Apis\Recurring\Payment;

注意:配置将从前面的**.env**文件中获取。

$payment = new Payment();

按订阅ID获取付款列表

$payment->paymentListBySubscriptionID($subscriptionID);

您将从通过请求ID查询订阅中获取$subscriptionID

按付款ID获取付款信息

$payment->paymentInfoByPaymentID($paymentId);

您可以从 按订阅ID获取付款列表 获取 $paymentId

付款计划

$payment->schedule($frequency, $startDate, $expiryDate);

$frequency 定义了每个订阅的周期。以下是可用的周期性周期:

  • DAILY
  • WEEKLY
  • FIFTEEN_DAYS
  • THIRTY_DAYS
  • NINETY_DAYS
  • ONE_EIGHTY_DAYS
  • CALENDAR_MONTH
  • CALENDAR_YEAR

$startDate$expiryDate 表示付款计划的有效期,即付款的起始和结束日期。

付款退款

$payment->refund($paymentId, $amount);

您可以从 按订阅ID获取付款列表 获取 $paymentId。要退款的金额为 $amount

Webhook

要将 webhook 集成到您的网站中,您需要创建 两个 URL(路由)。

  • 通用 webhook URL
  • 周期性 webhook URL

一个用于接收来自 结账令牌化 操作的通知,另一个用于 周期性 产品。

在调用 Webhook 方法之前,您首先需要创建 Webhook 类的实例。

请别忘了在文件顶部导入 use Divergent\Bkash\Apis\Webhook\Webhook;

$webhook = new Webhook();

通用Webhook

$webhook->processWebhookRequest();

周期性Webhook

$webhook->processRecurringWebhookRequest();

如果您在阅读此文档时发现实施过程中存在复杂性,请不要担心。这里 是一个示例项目。您可以自由使用此代码。❤️

支持

此版本支持 Laravel 5.0 或更高版本。

  • 如有任何问题,请在 问题 部分创建一个问题。
  • 您可以通过电子邮件 laravelpgw.support@bkash.com 获取支持。