oephpopen/allinpay-syb

Allinpay SYB (通联收银宝) payment SDK. Supports unified pay / query / refund / cancel / close, H5 cashier (onepay) & H5 unionorder with RSA (SHA1) / RSA2 (SHA256) / SM2 signing and SM4 sensitive-field encryption. Zero framework dependency, PHP 7.2+ compatible.

Maintainers

Package info

github.com/oephp-open/allinpay

pkg:composer/oephpopen/allinpay-syb

Transparency log

Statistics

Installs: 2

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.0 2026-08-24 03:27 UTC

This package is auto-updated.

Last update: 2026-08-24 03:37:52 UTC


README

通联收银宝(Allinpay SYB)聚合收单 SDK — PHP 7.2+,零框架依赖,可独立发布 Composer。

支持接口:统一支付(微信/支付宝/云闪付/数字人民币 扫码、JS、APP、微信小程序)、统一查询统一退款统一撤销统一交易关单聚合收银台(onepay)H5 收银台(unionorder)异步结果通知验签

签名算法:RSA(SHA1WithRSA)与 RSA2(SHA256WithRSA)开箱即用;SM2 与 SM4 已预留(SM4 已含纯 PHP 实现,SM2 需第三方国密实现)。

官方入口

对接、开通账号请访问:

环境要求

  • PHP >= 7.2
  • ext-openssl、ext-json(必须)
  • ext-curl(可选,默认 CurlHttpClient 使用;可自行实现 HttpClientInterface 替换)

安装

发布到 Packagist 后:

composer require oephpopen/allinpay-syb

统一返回(ret / msg / data)

业务方法(pay / query / refund / cancel / close / onepay / unionOrder / handleNotify)统一返回:

[
    'ret'  => 1,        // 1 = 成功,0 = 失败
    'msg'  => 'ok',     // 对外提示语
    'data' => [...],    // 成功 = 网关返回字段;失败 = ['errcode' => 内部错误码, 'errmsg' => 内部详因]
]
  • ret = 1:接口调用成功(网关 retcode = SUCCESS)。交易是否成功看 data.trxstatus0000=已支付,2000/2008=处理中,其余=交易失败。
  • ret = 0:调用失败,可能来自配置/参数不完整、签名/验签/网络异常或网关通信失败(retcode != SUCCESS)。
  • msg 为对外提示语;errcode / errmsg 为内部错误码与详因,用于日志与排查。

业务方法不抛出异常;底层方法 execute() 返回 ApiResponse 并可抛出 SDK 异常(ApiException / SignException / AllinpayException),如需原始响应可自行调用。

错误码(OephpOpen\AllinpaySyb\ResultCode

errcode 常量 含义 msg
CONFIG_INCOMPLETE 关键配置缺失(密钥/cusid/appid/sign_type) 支付配置不完整
ENV_INVALID 环境值非法 支付环境配置非法
PARAM_INVALID 业务参数不合法 请求参数不合法
SIGN_FAILED 请求签名失败(商户私钥问题) 请求签名失败
VERIFY_FAILED 响应/通知验签失败 签名校验失败
RESPONSE_INVALID 网关响应非法(非 JSON 等) 支付服务响应异常
NETWORK_ERROR 传输层失败(网络/cURL) 网络请求失败,请稍后重试
GATEWAY_REJECTED 网关返回业务失败(retcode != SUCCESS) 支付服务处理失败
INTERNAL_ERROR 未知异常 系统繁忙,请稍后再试

快速开始

1. 配置

凭证从后台/数据库注入(不要写死在代码里,尤其商户私钥):

use OephpOpen\AllinpaySyb\Config;
use OephpOpen\AllinpaySyb\Environment;
use OephpOpen\AllinpaySyb\SignType;

$config = (new Config([
    'cusid'                => 'CUSID',       // 商户号
    'appid'                => 'APPID',              // 平台分配 appid
    'orgid'                => '',                      // 集团/代理商商户号(单商户模式留空)
    'sign_type'            => SignType::RSA,           // RSA | RSA2 | SM2
    'merchant_private_key' => '-----BEGIN PRIVATE KEY-----\n...',  // 商户私钥 PEM
    'allinpay_public_key'  => '-----BEGIN PUBLIC KEY-----\n...',   // 通联平台公钥 PEM(验签)
    'sm4_key'              => '',                      // SM4 密钥(32 位 hex,敏感字段加密用)
    'env'                  => Environment::SANDBOX,    // sandbox | production
    'notify_url'           => 'https://example.com/notify.php/allinpay/paycall',
]));

2. 客户端

use OephpOpen\AllinpaySyb\AllinpayClient;

$client = new AllinpayClient($config); // 可选:new AllinpayClient($config, $myHttpClient)

3. 下单(统一支付)

// 微信小程序支付(W06)
$result = $client->pay([
    'reqsn'      => 'M202608240001',   // 商户唯一单号
    'trxamt'     => 100,               // 金额:分
    'paytype'    => 'W06',
    'body'       => '会员服务',
    'acct'       => $wxOpenid,         // 小程序 openid
    'sub_appid'  => 'wx1234567890',    // 微信小程序 appid
    'notify_url' => 'https://example.com/notify.php/allinpay/paycall',
]);

if ($result['ret'] !== 1) {
    // 失败:$result['msg'] 对外提示;$result['data']['errcode'] / ['errmsg'] 内部排查
    return $result;
}
$payInfo = $result['data']['payinfo'] ?? '';   // 小程序调起支付参数(JSON 字符串)
$trxid   = $result['data']['trxid'] ?? '';

常用 paytype:

  • W01 微信扫码 / A01 支付宝扫码 / U01 云闪付扫码 / S01 数字人民币
  • W02 微信公众号 JS / A02 支付宝 JS / U02 云闪付 JS
  • W03 微信 APP / A03 支付宝 APP / S03 数字人民币 APP
  • W06 微信小程序 / W11 微信订单

4. 聚合收银台(PC / H5)

$result = $client->onepay([
    'reqsn'      => 'M202608240002',
    'trxamt'     => 100,
    'body'       => '会员服务',
    'front_url'  => 'https://example.com/ret',          // 同步跳转(https、无参数)
    'notify_url' => 'https://example.com/notify.php/allinpay/paycall',
]);
if ($result['ret'] !== 1) {
    return $result;
}
// 网关重定向:跳转 http_build_query($result['data']) 或按需拼接支付链接

H5 自动选支付方式使用 $client->unionOrder([...])

5. 查询 / 退款 / 撤销 / 关单

$result = $client->query(['reqsn' => 'M202608240001']);          // 或 ['trxid' => $trxid]
$result = $client->refund([
    'reqsn'    => 'R202608240001',   // 退款单号(商户唯一)
    'trxamt'   => 100,
    'oldreqsn' => 'M202608240001',   // 原单号(与 oldtrxid 二选一)
]);
$result = $client->cancel(['reqsn' => 'C202608240001', 'trxamt' => 100, 'oldreqsn' => 'M202608240001']); // 当日全额
$result = $client->close(['oldreqsn' => 'M202608240001']);  // 关未支付单

判断交易结果统一看 data.trxstatus

$status = $result['data']['trxstatus'] ?? '';
// '0000'        -> 交易成功(已支付)
// '2000'/'2008' -> 交易处理中
// 其它          -> 交易失败

6. 异步通知

// $raw = file_get_contents('php://input'); // 表单编码的原始 body
$params = []; parse_str($raw, $params);

$result = $client->handleNotify($params);   // 验签失败:ret=0、errcode=VERIFY_FAILED
if ($result['ret'] !== 1) {
    echo 'fail';    // 返回非 success,通联会重发
    return;
}

$orderNo = $result['data']['cusorderid'];   // 下单时的 reqsn
$trxid   = $result['data']['trxid'];
$amt     = $result['data']['trxamt'];       // 分
// ... 幂等更新本地订单(先判断 trxstatus=0000)...

echo 'success';  // 必须返回 success,否则通联重发(15s/15s/5m/... 共 8 次)

通知字段均做了 UTF-8 urlencode;用 web 容器接收会自动解码,读原始流需自行 urldecode。

敏感字段加密(SM4)

use OephpOpen\AllinpaySyb\Crypto\Sm4Cipher;

$name = Sm4Cipher::encrypt('张三李四', $config->getSm4Key());
// => 3IUFstZ1CNyG1D/nRprv/A==(官方测试向量一致)
$plain = Sm4Cipher::decrypt($name, $config->getSm4Key());

签名规范(对应官方「接口安全规范」)

  1. 取除 sign 外的所有非空字段;
  2. 按字段名 ASCII 升序排序;
  3. 拼接为 key1=value1&key2=value2
  4. RSA:用商户私钥 SHA1WithRSA 签名后 base64(RSA2 用 SHA256WithRSA);SM2:SM3WithSM2(预留);
  5. 响应与异步通知用通联平台公钥验签,失败一律不处理。

测试

php tests/run.php   # 无外部依赖的自测脚本(35 项),退出码 0 = 全部通过
php tests/run_all.php  # 依次运行下面 4 个主流程测试脚本
php tests/pay_test.php     # 统一支付主流程
php tests/cashier_test.php # 聚合收银台 onepay + H5 收银台 unionOrder
php tests/tranx_test.php   # 查询 / 退款 / 撤销 / 关单
php tests/notify_test.php  # 异步通知验签 + SM4 敏感字段加密

主流程测试脚本共享 tests/bootstrap.php(自动加载 SDK、生成临时 RSA 密钥对、用 FakeHttp 模拟网关完成 签名→请求→验签 全链路,不发起真实网络请求)。

接口清单

方法 接口 生产地址
pay() 统一支付 https://vsp.allinpay.com/apiweb/unitorder/pay
query() 统一查询 https://vsp.allinpay.com/apiweb/tranx/query
refund() 统一退款 https://vsp.allinpay.com/apiweb/tranx/refund
cancel() 统一撤销 https://vsp.allinpay.com/apiweb/tranx/cancel
close() 统一交易关单 https://vsp.allinpay.com/apiweb/tranx/close
onepay() 聚合收银台 https://syb.allinpay.com/apiweb/h5unionpay/onepay
unionOrder() H5 收银台 https://syb.allinpay.com/apiweb/h5unionpay/unionorder

测试环境统一走 https://syb-test.allinpay.com

License

MIT