njoguamos / laravel-jenga
用于设置和交互Jenga V3 API的Laravel包。
Requires
- php: ^8.0 | ^8.1 | ^8.2 | ^8.3
- guzzlehttp/guzzle: ^7.5
- illuminate/contracts: ^9.0 | ^10.0 | ^11.0
- spatie/crypto: ^2.0
- spatie/laravel-package-tools: ^1.13.0
Requires (Dev)
- larastan/larastan: ^2.9
- laravel/pint: ^1.0
- nunomaduro/collision: ^6.0 | ^v7.10 | ^v8.1
- orchestra/testbench: ^7.0 | ^8.0 | ^9.0
- pestphp/pest: ^1.21 | ^2.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- spatie/pest-plugin-test-time: ^1.1 | ^2.1
README
Laravel 9+ 的 Jenga API 包装器
1. 使用此包的原因
- 在给定时间段后(例如每15分钟)生成 jenga api
access_token的一种方式 - 提供一种流畅的生成 jenga api 密钥对的
private key和public key的方式 - 自动生成 jenga api
Bearer Token - 提供与 Jenga API 交互的无缝网关
信息 准备开始吗?我已经准备了一个 沙箱,您可以克隆并开始使用。它将帮助您测试凭据,同时向您展示如何将此包与您的 Laravel 应用程序集成。
2. 文档
2.1 安装
使用 Composer 包管理器将此包安装到您的 Laravel 项目中
composer require njoguamos/laravel-jenga
2.2 更新 .env 变量
此包假定您有一个 JengaHQ 账户,并且您有来自 Jenga 的 Api Key、Merchant Code 和 Consumer Secret(https://developer.jengaapi.io/docs/developer-quickstart)。
复制相应的密钥并将它们放置在以下示例中。
JENGA_LIVE_MODE=false JENGA_MERCHANT_CODE= JENGA_API_KEY= JENGA_CONSUMER_SECRET= # Optional JENGA_DEFAULT_ACC= JENGA_DEFAULT_WALLET= JENGA_COUNTRY_CODE=
注意 对于
JENGA_LIVE_MODE,在测试时使用false,在运行实时交易时使用true
2.3 初始化包
您必须运行安装命令,该命令将发布 jenga.php 配置文件和 create_jenga_tokens 迁移
php artisan jenga:install
注意 由于安全原因,
access_token和refresh_token将使用您的application key进行加密。您可以从 Laravel 文档 中了解有关加密的更多信息
您现在可以迁移数据库了。
php artisan migrate
2.4 生成 Bearer Token
一旦您有有效的凭据,请运行以下命令。
php artisan jenga:auth
此命令将从 Jenga API 获取 access_token 令牌并将其添加到 jenga 表中的新记录。
此命令可能会失败
- 当您未连接到互联网时
- 当
Api Key或Consumer Secret或Merchant无效时 - Jenga API 端点存在问题
2.5 生成 Bearer Token 频繁
生成的 access_token 在特定时间段后过期,通常在 一小时 后。要自动生成新的 access_token,请在控制台内核中安排 jenga:auth 命令。安排的时间应少于 15 分钟。
// app/Console/Kernel.php protected function schedule(Schedule $schedule) { # ... $schedule->command(command: 'jenga:auth')->everyThirtyMinutes(); }
2.6 清除过期令牌
为了定期删除过期的 Bearer Token,请在控制台内核中安排 model:prune 命令。
// app/Console/Kernel.php use NjoguAmos\Jenga\Models\JengaToken; protected function schedule(Schedule $schedule) { # ... $schedule->command(command: 'model:prune', parameters: [ '--model' => [JengaToken::class], ])->everyFiveMinutes(); }
2.7 生成私钥和公钥
要生成一对私钥和公钥,请运行以下命令。
php artisan jenga:keys
此命令将在您的 Laravel 应用程序存储文件夹中创建 jenga.key 和 jenga.pub.key 文件。您可以使用 JENGA_KEYS_PATH 变量自定义目录。
# ./yourapplication/storage/jenga.key
-----BEGIN PRIVATE KEY-----
<private key here>
-----END RSA PRIVATE KEY-----
# ./yourapplication/storage/jenga.pub.key
-----BEGIN PUBLIC KEY-----
<public key here>
-----END PUBLIC KEY-----
您可以使用 --force 标志替换现有密钥。默认密钥大小为 4096
警告 生成的密钥文件 绝对不应该 存储在源代码管理中。请确保您将它们添加到您的 gitignore 文件中。
注意 在生成密钥时,需要使用
bcmath、gmp、libsodium和openssl等扩展。
2.8 确保您已订阅API服务
如果您尝试访问API并收到“未授权访问API”的提示,请确认您的账户已订阅您尝试访问的服务。您可以通过前往JengaAPI设置 -> 订阅,然后进行 subscribe 或 unsubscribe 来完成此操作。
3. 使用方法
3.1 生成签名
要手动生成签名,请使用您要签名的数据调用`JengaSignature`类中的`getSignature`方法。
信息 数据将按照传递的顺序进行签名。
use NjoguAmos\Jenga\JengaSignature; $data = [ "accountId" => "0011547896523", "countryCode" => "KE", "date" => "2022-01-01" ]; $signature = (new JengaSignature(data: $data))->getSignature(); // This will return signature for "0011547896523KE2022-01-01' // "NCgbapJwPIt+203eyADfPSvPX6uWPPVwMbFdrW+3XoT7oQC2+IaS6srFIGGdMrwrTH ..."
3.2 支付网关结账
要使用支付网关,请使用后端准备数据并将其传递到浏览器表单。
<?php use NjoguAmos\Jenga\Models\JengaToken; return view(view: 'check-out', data: [ 'token' => JengaToken::query()->latest()->first()?->access_token, // Token generated via auth API 'checkOutUrl' => config(key: 'jenga.checkout'), // Check our url. Don't modify 'merchantCode' => config(key: 'jenga.merchant'), // The merchant code provided at registration. 'wallet' => config(key: 'jenga.wallet'), // The wallet to be used for the transaction 'orderAmount' => '', // The value of the transaction 'orderReference' => '', // The merchant order reference. Min8 characters and It has to be alphanumeric 'productType' => '', // Product category 'productDescription' => '' // A brief summary of the product. Max 200 characters. Alphanumeric only., 'customerFirstName' => '', // The customer's First Name 'customerLastName' => '', // The customer's Last Name 'customerEmail' => '', // Customer email 'customerPhone' => '', // Customer phone number e.g 700325008 'countryCode' => config(key: 'jenga.country'), // Country code 'customerPostalCodeZip' => '', // Customer’s postal code 'customerAddress' => '', // Customer’s address 'callbackUrl' => '' // Merchant callback url 'extraData' => '', // This data will be echoed back during callback url ]);
配置您的前端表单。
<form id="submitcheckout" action="{{ $checkOutUrl }}" method="POST">
@csrf
<input type="hidden" id="token" name="token" value="{{ $token }}">
<input type="hidden" id="merchantCode" name="merchantCode" value="{{ $merchantCode }}">
<input type="hidden" id="wallet" name="wallet" value="{{ $wallet }}">
<input type="hidden" id="orderAmount" name="orderAmount" autofocus value="{{ $orderAmount }}">
<input type="hidden" id="orderReference" name="orderReference" value="{{ $orderReference }}">
<input type="hidden" id="productType" name="productType" value="{{ $productType }}">
<input type="hidden" id="productDescription" name="productDescription" value="{{ $productDescription }}">
<input type="hidden" id="customerFirstName" name="customerFirstName" value="{{ $customerFirstName }}">
<input type="hidden" id="customerLastName" name="customerLastName" value="{{ $customerLastName }}">
<input type="hidden" id="customerEmail" name="customerEmail" value="{{ $customerEmail }}">
<input type="hidden" id="customerPhone" name="customerPhone" value="{{ $customerPhone }}">
<input type="hidden" id="countryCode" name="countryCode" value="{{ $countryCode }}">
<input type="hidden" id="customerPostalCodeZip" name="customerPostalCodeZip" value="{{ $customerPostalCodeZip }}">
<input type="hidden" id="customerAddress" name="customerAddress" value="{{ $customerAddress }}">
<input type="hidden" id="callbackUrl" name="callbackUrl" value="{{ $callbackUrl }}">
<input type="hidden" id="extraData" name="extraData" value="{{ $extraData }}">
<button type="submit">Subscribe</button>
</form>
成功的响应应如下所示。
{
"responseStatus": "true",
"transactionStatus": "SUCCESS",
"orderReference": "226151",
"extraData": "pmQgkBuepzSaiNdRh1rghq2ldPzdq0gQ",
"transactionReference": "RBF2PJILMC",
"transactionDate": "Wed Feb 15 2023",
"transactionAmount": "1",
"transactionCurrency": "KES",
"message": "Transaction completed successfully",
"paymentChannel": "MOBILE",
"orderItems": "undefined",
"secureResponse": "320396408033f540f6c9bcc426d6e3d1206d584984d72da4017cace6337e4e10d1729ed98ee326d5d0c403c298c789a9YhubIYK7B+WE0Bij2XWxn3iOL+MAyfWU3RruohGTfdB9t5j9lmNTqcmIeY8RL5M\/xenV+hIKvdweVIyzqX333PFgFGd4wV3+LwQpx9LGCxDsj0NFC+ouRdFZ0VADWbnCbZbHlBSO8kxIP8urAXuP1JM21DhTPqzbs8TB763IYmqVHCicmalkDdegDwo+BDQ0HJaf0ia3FektL2v\/Hj3nM9RkmNyA59VH0p5gUhRUhioMxNdFjai9TKZ3CwOZ6O75h5sc7L+Z8w3ucpvYOtuaTV5fxKIfSPkfi3mIvuGQEw7QDJeu3333BRDHt3XobtxZv9GW9\/eey1dRnNW9zplMBxQupJAn98fSKSC0VkSByqt5KKibQFAZxCOYjcvIJ0kea8MkBRwA\/z1YRdeQ+TmQmdLFoe3V3jWyE5SsN6EPU4k="
}
客户也应收到如下短信。
Your transaction of Kshs. 1.00 has successfully been
credited to Finserve Africa Limited-E Commerce Collection
Account with Ref. Number INVDRT and MPESA Tran Ref
RBF2PJILMC. Thank you
3.3 账户服务
- 账户余额
- 账户MINI对账单
- 账户完整对账单
- 开户和结账账户余额
3.3.5 账户查询 - 银行账户
要获取账户详情,请调用 AccountInquiry 并传入账户号码和国家代码。如果没有传递参数,将使用在 配置 中配置的默认账户和国家。
use NjoguAmos\Jenga\Api\AccountInquiry; $search = (new AccountInquiry()) ->search( countryCode: $data['countryCode'], accountNumber: $data['accountNumber'] );
响应应如下所示
{
"status": true,
"code": 0,
"message": "success",
"data": {
"account": {
"branchCode": "145",
"number": "1450160649886",
"currency": "KES",
"status": "Active"
},
"customer": [
{
"name": "CATHERINE MURANDITSI MUKABWA",
"id": "54307789658",
"type": "Retail"
}
]
}
}
3.4 发送资金
- 在Equity Bank内
- 到移动钱包
- 实时全额结算 (RTGS)
- 环球银行金融电信协会 (SWIFT)
- Pesalink - 到银行账户
- Pesalink - 到手机号码
3.5 发送资金 - IMT
- IMT 在Equity Bank内
- IMT 到移动钱包
- IMT Pesalink - 到银行账户
- IMT Pesalink - 到银行手机
3.6 接收资金
- 接收支付 - 账单支付
- 接收支付 - 商户支付
- 账单验证
3.6 接收资金查询
- 获取所有EazzyPay商户
- 查询交易详情
- 获取所有账单方
3.8 充值话费
- 购买话费
3.9 汇率
获取Equity Bank对主要货币的每日货币兑换率。
use NjoguAmos\Jenga\Api\ForexExchangeRates; use NjoguAmos\Jenga\Dto\ExchangeRatesDto; // Convert 1042 USD into KES using Equity Bank Kenya rate. $data = new ExchangeRatesDto( amount: 1042, currencyCode: "USD", toCurrency: "KES", accountNumber: '1450160649886', countryCode: 'KE' ); $rates = (new ForexExchangeRates())->convert($data);
示例成功响应
{
"status": true,
"code": 0,
"message": "success",
"data": {
"convertedAmount": 127749.2,
"rate": 122.6,
"fromAmount": 1042,
"rateCode": "TTB"
}
}
请参阅外汇API参考
支持货币
3.10 身份搜索与验证
查询东非各国各种人员注册机构。
use NjoguAmos\Jenga\Api\IDVerification; use NjoguAmos\Jenga\Dto\IDVerificationDto; $data = new IDVerificationDto( documentNumber: '555555', firstName: 'John', lastName: 'Doe', dateOfBirth: '20 June 1985', documentType: 'ID', countryCode: 'KE', ); $search = (new IDVerification())->search($data);
示例成功响应
{
"status": true,
"code": 0,
"message": "success",
"data": {
"identity": {
"customer": {
"firstName": "JOHN",
"lastName": "DOE",
"occupation": "",
"gender": "M",
"nationality": "Kenyan",
"deathDate": "",
"fullName": "JOHN JOHN DOE DOE",
"middlename": "JOHN DOE",
"ShortName": "JOHN",
"birthCityName": "",
"birthDate": "1985-06-20T12:00:00",
"faceImage": ""
},
"documentType": "NATIONAL ID",
"documentNumber": "555555",
"documentSerialNumber": "55555555555",
"documentIssueDate": "2011-12-08T12:00:00",
"documentExpirationDate": "",
"IssuedBy": "REPUBLIC OF KENYA",
"additionalIdentityDetails": [
{
"documentType": "",
"documentNumber": "",
"issuedBy": ""
}
],
"address": {
"locationName": "",
"districtName": "",
"subLocationName": "",
"provinceName": "",
"villageName": ""
}
}
}
}
请参阅ID搜索与验证API参考
3.11 MPGS直接集成
- MPGS验证支付
- MPGS验证支付
- MPGS授权支付
- MPGS查询支付
- MPGS退款支付
4. 测试
composer test
5. 更新日志
请参阅RELEASES 获取更多信息。
6. 贡献
请参阅CONTRIBUTING 获取详细信息。
7. 安全
如果您发现任何与安全相关的问题,请通过电子邮件njoguamos@gmail.com联系,而不是使用问题跟踪器。
8. 致谢
9. 许可证
MIT许可证(MIT)。请参阅许可证文件 获取更多信息。
