聚合支付平台开放平台 · 开发文档 V2
/

接口说明及规范

本文档面向接入 聚合支付平台 的商户开发者,覆盖签名规则、支付、退款、订单查询、异步通知、商户信息与代付等全部公开接口。所有接口采用统一的签名与返回结构,建议先阅读「签名规则」再对接业务接口。

提交格式 application/x-www-form-urlencoded 返回格式 JSON 字符编码 UTF-8 签名算法 SHA256WithRSA

协议规则#

提交数据格式application/x-www-form-urlencoded
返回数据格式JSON
字符编码UTF-8
签名算法SHA256WithRSA

V2 升级说明

  1. V2 接口全面使用 RSA 签名算法;V1 接口使用 MD5 签名算法。
  2. V2 接口改用全新的接口地址,支持退款、代付等功能;V1 接口使用 submit.php 和 mapi.php 提交订单。
  3. V2 接口新增 timestamp 入参和返回值用于校验时间戳。

获取 RSA 密钥对

在 商户后台 → 个人资料 → API 信息 页面,点击【生成商户 RSA 密钥对】,生成后注意保存【商户私钥】。对接接口时只需要用到 平台公钥 与 商户私钥。

请妥善保管商户私钥。私钥仅用于本地签名,切勿上传、外发或写入前端代码;一旦泄露请立即在后台重新生成密钥对。

签名规则#

签名步骤

  1. 获取请求报文所有非空请求参数(不包括数组、字节类型参数,如文件、字节流),剔除 sign、sign_type 字段,并按第一个字符的键值 ASCII 码递增排序(字母升序),若遇到相同字符则按第二个字符递增排序,以此类推。
  2. 将排序后的参数和对应值组合成 参数=参数值 的格式,并用 & 连接,生成待签名字符串。
  3. 使用商户私钥对待签名字符串计算 RSA 签名(SHA256WithRSA),得到 sign。

验签步骤

  1. 参照签名步骤第 1~2 步,得到待签名字符串。
  2. 使用平台公钥,根据签名字符串 sign 对待签名字符串进行 RSA 验签(SHA256WithRSA)。

签名示例

/**
 * 生成待签名字符串并按 ASCII 升序排序
 * @param array $params 业务参数(不含 sign / sign_type)
 */
function buildSignSource(array $params): string
{
    // 1. 剔除 sign、sign_type 与空值
    unset($params['sign'], $params['sign_type']);
    $params = array_filter($params, function ($v) {
        return $v !== '' && $v !== null;
    });

    // 2. 按键名 ASCII 升序排序
    ksort($params, SORT_STRING);

    // 3. 拼接成 参数=参数值&参数=参数值
    $pairs = [];
    foreach ($params as $k => $v) {
        $pairs[] = $k . '=' . $v;
    }
    return implode('&', $pairs);
}

/** SHA256WithRSA 签名,返回 Base64 字符串 */
function rsaSign(array $params, string $merchantPrivateKey): string
{
    $source = buildSignSource($params);
    openssl_sign($source, $sign, $merchantPrivateKey, OPENSSL_ALGO_SHA256);
    return base64_encode($sign);
}

/** 平台公钥验签 */
function rsaVerify(array $params, string $sign, string $platformPublicKey): bool
{
    $source = buildSignSource($params);
    return openssl_verify($source, base64_decode($sign), $platformPublicKey, OPENSSL_ALGO_SHA256) === 1;
}
商户私钥(private key)需填写到代码中供签名时使用,请妥善保管;平台公钥(public key)用于接口返回数据与异步通知回调数据的验签。具体发起支付流程的完整示例可下载 SDK 查看。

支付方式列表#

接口中的 type、refund 等字段取值如下;type 不传时跳转到收银台,由用户自行选择。

调用值描述图标
alipay支付宝
wxpay微信支付
qqpayQQ 钱包
bank云闪付 / 银联
jdpay京东支付
ecny数字人民币
douyinpay抖音支付

实际可用支付方式以商户后台「支付通道」中已开通的为准;未开通的方式调用后会返回对应错误码。V1 旧版接口使用同一套取值(另有 paypal,不含 ecny),详见 V1 支付方式与设备类型。

页面跳转支付#

此接口可用于用户前台直接发起支付,使用 form 表单跳转或拼接成 URL 跳转。

POST https://pay.ya92.com/api/pay/submit 亦支持 GET(推荐 POST,不容易被劫持)

请求参数

字段名变量名必填类型示例值描述
商户 IDpid是Int1001
支付方式type是Stringalipay见支付方式列表
商户订单号out_trade_no是String20160806151343349商户侧唯一
异步通知地址notify_url是Stringhttp://www.pay.com/notify_url.php服务器异步通知地址
跳转通知地址return_url是Stringhttp://www.pay.com/return_url.php页面跳转通知地址
商品名称name是StringVIP会员超过 127 个字节会自动截取
商品金额money是String1.00单位:元,最大 2 位小数
业务扩展参数param否String没有请留空支付后原样返回
自定义进件商户 IDmerchant_id否Int对应进件商户列表的 ID,未进件请勿传
自定义通道 IDchannel_id否Int对应自定义子通道的 ID
买家身份证号cert_no否String可限制指定买家,仅支持支付宝官方接口
买家真实姓名cert_name否String可限制指定买家,仅支持支付宝官方接口
买家最小年龄min_age否Int可限制买家年龄,仅支持支付宝官方接口
手续费承担方fee_mode否Int0 / 10:商家承担,1:买家承担;不传以商户后台配置为准
当前时间戳timestamp是String172120607210 位整数,单位秒
签名字符串sign是String参考签名规则
签名类型sign_type是StringRSA默认为 RSA

示例代码

<!-- 页面跳转支付:表单自动提交 -->
<form id="payForm" action="https://pay.ya92.com/api/pay/submit" method="post">
    <input type="hidden" name="pid" value="1001">
    <input type="hidden" name="type" value="alipay">
    <input type="hidden" name="out_trade_no" value="20160806151343349">
    <input type="hidden" name="notify_url" value="http://www.pay.com/notify_url.php">
    <input type="hidden" name="return_url" value="http://www.pay.com/return_url.php">
    <input type="hidden" name="name" value="VIP会员">
    <input type="hidden" name="money" value="1.00">
    <input type="hidden" name="timestamp" value="1721206072">
    <input type="hidden" name="sign" value="商户私钥签名结果">
    <input type="hidden" name="sign_type" value="RSA">
</form>
<script>document.getElementById('payForm').submit();</script>

其他说明

  • 支付方式(type)不传会跳转到收银台支付。
  • 该接口为浏览器跳转型接口,无 JSON 返回值,提交后直接进入收银台。

统一下单接口#

此接口可用于服务器后端发起支付请求,返回支付二维码链接、支付跳转 URL 等。代码需根据返回的 pay_type 展示对应支付页面。

POST https://pay.ya92.com/api/pay/create

请求参数

字段名变量名必填类型示例值描述
商户 IDpid是Int1001
接口类型method是Stringweb见接口类型列表
设备类型device否Stringpc仅通用网页支付需要传,见设备类型列表
支付方式type是Stringalipay见支付方式列表
商户订单号out_trade_no是String20160806151343349
异步通知地址notify_url是Stringhttp://www.pay.com/notify_url.php服务器异步通知地址
跳转通知地址return_url否Stringhttp://www.pay.com/return_url.php页面跳转通知地址
商品名称name是StringVIP会员超过 127 个字节会自动截取
商品金额money是String1.00单位:元,最大 2 位小数
用户 IP 地址clientip是String192.168.1.100用户发起支付的 IP 地址
业务扩展参数param否String没有请留空支付后原样返回
被扫支付授权码auth_code否String仅被扫支付需要传
用户 Openidsub_openid否String仅 JSAPI 支付需要传
应用 AppIdsub_appid否String仅 JSAPI 支付(微信)需要传
是否小程序is_applet否Int1仅 JSAPI 支付需要传,1:是小程序
自定义进件商户 IDmerchant_id否Int对应进件商户列表的 ID,未进件请勿传
自定义通道 IDchannel_id否Int对应自定义子通道的 ID
买家身份证号cert_no否String可限制指定买家,仅支持支付宝官方接口
买家真实姓名cert_name否String可限制指定买家,仅支持支付宝官方接口
买家最小年龄min_age否Int可限制买家年龄,仅支持支付宝官方接口
手续费承担方fee_mode否Int0 / 10:商家承担,1:买家承担
当前时间戳timestamp是String172120607210 位整数,单位秒
签名字符串sign是String参考签名规则
签名类型sign_type是StringRSA默认为 RSA

返回参数

字段名变量名类型示例值描述
返回状态码codeInt00 为成功,其它值为失败
错误信息msgString失败时返回原因
平台订单号trade_noString20160806151343349平台内部的订单号
发起支付类型pay_typeStringjump见发起支付类型说明
发起支付参数pay_infoStringweixin://wxpay/bizpayurl?pr=04IPMKM根据不同的发起支付类型,返回内容也不一样
当前时间戳timestampString172120607210 位整数,单位秒
签名字符串signString参考签名规则
签名类型sign_typeStringRSA默认为 RSA

返回示例

{
    "code": 0,
    "trade_no": "20160806151343349",
    "pay_type": "qrcode",
    "pay_info": "weixin://wxpay/bizpayurl?pr=04IPMKM"
}

示例代码

$params = [
    'pid'          => 1001,
    'method'       => 'jump',          // 直接返回跳转 url,最简单
    'type'         => 'alipay',
    'out_trade_no' => '20160806151343349',
    'notify_url'   => 'http://www.pay.com/notify_url.php',
    'return_url'   => 'http://www.pay.com/return_url.php',
    'name'         => 'VIP会员',
    'money'        => '1.00',
    'clientip'     => '192.168.1.100',
    'timestamp'    => (string) time(),
];
$params['sign']      = rsaSign($params, $merchantPrivateKey);
$params['sign_type'] = 'RSA';

$ch = curl_init('https://pay.ya92.com/api/pay/create');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => http_build_query($params),
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 15,
]);
$resp = curl_exec($ch);
curl_close($ch);

$result = json_decode($resp, true);
if (($result['code'] ?? -1) === 0 && rsaVerify($result, $result['sign'], $platformPublicKey)) {
    header('Location: ' . $result['pay_info']);   // pay_type = jump
    exit;
}
exit('下单失败:' . ($result['msg'] ?? '未知错误'));

接口类型列表

调用值描述
web通用网页支付(会根据 device 判断,自动返回跳转 url / 二维码 / 小程序跳转 url 等)
jump跳转支付(仅会返回跳转 url)
jsapiJSAPI 支付(小程序内支付使用,仅返回 JSAPI 参数,需传入 sub_openid 和 sub_appid)
appAPP 支付(iOS/安卓 APP 内支付使用,仅返回 APP 支付参数,或 APP 拉起微信小程序参数)
scan付款码支付(需传入 auth_code 参数,支付成功后返回订单信息)
applet小程序支付(微信小程序内使用,返回微信小程序插件参数或跳转小程序参数)

设备类型列表

调用值描述
pc电脑浏览器(默认)
mobile手机浏览器
qq手机 QQ 内浏览器
wechat微信内浏览器
alipay支付宝客户端
douyin抖音 APP

发起支付类型说明

发起支付类型描述
jump返回支付跳转 url
html返回 html 代码,用于支付跳转
qrcode返回支付二维码
urlscheme返回微信/支付宝小程序跳转 url scheme
jsapi返回用于发起 JSAPI 支付的参数
app返回用于发起 APP 支付的参数
scan付款码支付成功,返回支付订单信息
wxplugin返回要拉起的微信小程序插件参数,用于未开通支付能力的小程序发起支付
wxapp返回要拉起的微信小程序和路径,用于 APP 内拉起微信小程序支付

其他说明

  • 代码中需根据接口返回的 pay_type 值来展示具体的支付页面(如扫码页面)。若不想自行处理,可在 method 传入 jump,此时 pay_type 只会返回 jump,直接跳转支付即可。
  • 付款码支付可不传支付类型 type 字段,会根据 auth_code 的数字自动判断支付类型。
  • 微信小程序插件支付,不同支付平台拉起支付的方式不一样,可联系客服获取对接小程序插件的文档。

订单查询#

POST https://pay.ya92.com/api/pay/query

请求参数

字段名变量名必填类型示例值描述
商户 IDpid是Int1001
平台订单号trade_no二选一String20160806151343349与商户订单号必传其一
商户订单号out_trade_no二选一String20160806151343351与平台订单号必传其一
当前时间戳timestamp是String172120607210 位整数,单位秒
签名字符串sign是String参考签名规则
签名类型sign_type是StringRSA默认为 RSA

返回参数

字段名变量名类型示例值描述
返回状态码codeInt00 为成功,其它值为失败
错误信息msgString失败时返回原因
平台订单号trade_noString20160806151343349
商户订单号out_trade_noString20160806151343351
接口订单号api_trade_noString40001249985198893微信/支付宝返回的单号
支付方式typeStringalipay见支付方式列表
支付状态statusInt1见支付状态列表
商户 IDpidInt1001
订单创建时间addtimeString2024-07-01 16:47:32
订单完成时间endtimeString2024-07-01 16:49:24仅完成才返回
商品名称nameString
商品金额moneyString1.00
已退款金额refundmoneyString仅部分退款情况才返回
业务扩展参数paramString
支付用户标识buyerString一般为 openid
支付用户 IPclientipString
当前时间戳timestampString172120607210 位整数,单位秒
签名字符串signString参考签名规则
签名类型sign_typeStringRSA默认为 RSA

支付状态列表

状态值描述
0未支付
1已支付
2已退款
3已冻结
4预授权

示例代码

$params = [
    'pid'          => 1001,
    'out_trade_no' => '20160806151343349',
    'timestamp'    => (string) time(),
];
$params['sign']      = rsaSign($params, $merchantPrivateKey);
$params['sign_type'] = 'RSA';

$ch = curl_init('https://pay.ya92.com/api/pay/query');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => http_build_query($params),
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 15,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);

if ($result['code'] === 0 && $result['status'] == 1) {
    // 订单已支付,可在此发货
    echo '已支付,金额:' . $result['money'];
}

支付结果通知#

支付成功后,平台会向商户提交订单时传入的 notify_url 推送异步通知,同时向 return_url 发起页面跳转通知。

GET {商户 notify_url} 平台 → 商户

通知参数

字段名变量名类型示例值描述
商户 IDpidInt1001
平台订单号trade_noString20160806151343349
商户订单号out_trade_noString20160806151343351
接口订单号api_trade_noString40001249985198893微信/支付宝返回的单号
支付方式typeStringalipay见支付方式列表
交易状态trade_statusStringTRADE_SUCCESS固定为 TRADE_SUCCESS
订单创建时间addtimeString2024-07-01 16:47:32
订单完成时间endtimeString2024-07-01 16:49:24仅完成才返回
商品名称nameString
商品金额moneyString1.00
业务扩展参数paramString
支付用户标识buyerString一般为 openid
当前时间戳timestampString172120607210 位整数,单位秒
签名字符串signString参考签名规则
签名类型sign_typeStringRSA默认为 RSA
返回内容:收到异步通知并处理完成后,必须向平台输出 success(纯文本),否则平台会按策略重复推送。

notify_url 处理示例

// notify_url.php —— 必须校验签名与 trade_status
$params = $_GET;                          // 平台以 GET 推送
$sign   = $params['sign'] ?? '';
unset($params['sign'], $params['sign_type']);

if (!rsaVerify($params, $sign, $platformPublicKey)) {
    exit('sign error');                   // 验签失败,不处理
}
if (($params['trade_status'] ?? '') !== 'TRADE_SUCCESS') {
    exit('success');                      // 非成功状态直接应答,避免重复推送
}

// 幂等:以 out_trade_no 为准,重复通知只处理一次
$order = findOrderByOutTradeNo($params['out_trade_no']);
if ($order && $order['status'] != 1 && $order['money'] == $params['money']) {
    markOrderPaid($params['out_trade_no'], $params['trade_no']);
}

exit('success');                          // 关键:必须输出 success

其他说明

  • 商户系统代码内务必对返回的签名 sign 进行校验,并且判断 trade_status 的值是否等于 TRADE_SUCCESS。
  • 支付平台可能会增加回调字段,验证签名时必须支持增加的扩展字段(即验签时不要写死字段白名单)。
  • 异步通知需保证幂等:同一 out_trade_no 可能收到多次通知。

订单退款#

需要先在商户后台开启「订单退款 API 接口」开关,才能调用该接口发起订单退款。

POST https://pay.ya92.com/api/pay/refund

请求参数

字段名变量名必填类型示例值描述
商户 IDpid是Int1001
平台订单号trade_no二选一String20160806151343349与商户订单号必传其一
商户订单号out_trade_no二选一String20160806151343351与平台订单号必传其一
退款金额money是String1.00单位:元
商户退款单号out_refund_no否String20160806151343391可避免出现重复请求退款
当前时间戳timestamp是String172120607210 位整数,单位秒
签名字符串sign是String参考签名规则
签名类型sign_type是StringRSA默认为 RSA

返回参数

字段名变量名类型示例值描述
返回状态码codeInt00 为成功,其它值为失败
返回信息msgString失败或成功时返回提示
平台退款单号refund_noString20160806151343349
商户退款单号out_refund_noString20160806151343351
平台订单号trade_noString20160806151343349
退款金额moneyString
扣减商户余额reducemoneyString
当前时间戳timestampString172120607210 位整数,单位秒
签名字符串signString参考签名规则
签名类型sign_typeStringRSA默认为 RSA
少数插件对接的第三方平台不支持部分金额退款,此时只允许全额退款。

订单退款查询#

POST https://pay.ya92.com/api/pay/refundquery
字段名变量名必填类型示例值描述
商户 IDpid是Int1001
平台退款单号refund_no二选一String20160806151343349与商户退款单号必传其一
商户退款单号out_refund_no二选一String20160806151343351与平台退款单号必传其一
当前时间戳timestamp是String172120607210 位整数,单位秒
签名字符串sign是String参考签名规则
签名类型sign_type是StringRSA默认为 RSA

返回参数

字段名变量名类型示例值描述
返回状态码codeInt00 为成功,其它值为失败
错误信息msgString失败时返回提示
平台退款单号refund_noString20160806151343349
商户退款单号out_refund_noString20160806151343351
平台订单号trade_noString20160806151343349
商户订单号out_trade_noString20160806151343351
退款金额moneyString
扣减商户余额reducemoneyString
退款状态statusInt10:失败,1:成功
退款时间addtimeString2024-07-01 16:47:32
当前时间戳timestampString172120607210 位整数,单位秒
签名字符串signString参考签名规则
签名类型sign_typeStringRSA默认为 RSA

订单关闭#

POST https://pay.ya92.com/api/pay/close
字段名变量名必填类型示例值描述
商户 IDpid是Int1001
平台订单号trade_no二选一String20160806151343349与商户订单号必传其一
商户订单号out_trade_no二选一String20160806151343351与平台订单号必传其一
当前时间戳timestamp是String172120607210 位整数,单位秒
签名字符串sign是String参考签名规则
签名类型sign_type是StringRSA默认为 RSA

返回参数

字段名变量名类型示例值描述
返回状态码codeInt00 为成功,其它值为失败
返回信息msgString失败或成功时返回提示
当前时间戳timestampString172120607210 位整数,单位秒
签名字符串signString参考签名规则
签名类型sign_typeStringRSA默认为 RSA

只有部分支付插件支持关闭订单操作。

查询商户信息#

POST https://pay.ya92.com/api/merchant/info
字段名变量名必填类型示例值描述
商户 IDpid是Int1001
当前时间戳timestamp是String172120607210 位整数,单位秒
签名字符串sign是String参考签名规则
签名类型sign_type是StringRSA默认为 RSA

返回参数

字段名变量名类型示例值描述
返回状态码codeInt00 为成功,其它值为失败
返回信息msgString失败或成功时返回提示
商户 IDpidInt1001
商户状态statusInt10:已封禁,1:正常,2:待审核
支付状态pay_statusInt10:关闭,1:开启
结算状态settle_statusInt10:关闭,1:开启
商户余额moneyString50.00单位:元
结算方式settle_typeInt1见结算方式列表
结算账户settle_accountStringalipay@alipay.com
结算账户姓名settle_nameString张三
订单总数量order_numInt10
今日订单数量order_num_todayInt3
昨日订单数量order_num_lastdayInt2
今日订单收入order_money_todayString45.00单位:元
昨日订单收入order_money_lastdayString35.00单位:元
当前时间戳timestampString172120607210 位整数,单位秒
签名字符串signString参考签名规则
签名类型sign_typeStringRSA默认为 RSA

结算方式列表

状态值描述
1支付宝
2微信
3QQ 钱包
4银行卡

查询订单列表#

查询订单列表可用于对账或同步订单状态等。

POST https://pay.ya92.com/api/merchant/orders
字段名变量名必填类型示例值描述
商户 IDpid是Int1001
查询偏移offset是Int0从 0 开始
每页条数limit是Int50最大不能超过 50
过滤订单状态status否Int10:未支付,1:已支付
当前时间戳timestamp是String172120607210 位整数,单位秒
签名字符串sign是String参考签名规则
签名类型sign_type是StringRSA默认为 RSA

返回参数

字段名变量名类型示例值描述
返回状态码codeInt00 为成功,其它值为失败
返回信息msgString失败或成功时返回提示
订单列表dataArray具体参数可参考订单查询
当前时间戳timestampString172120607210 位整数,单位秒
签名字符串signString参考签名规则
签名类型sign_typeStringRSA默认为 RSA

转账发起#

平台需开通代付功能,且在商户后台开启「代付 API 接口」开关,才能调用本接口发起转账。

POST https://pay.ya92.com/api/transfer/submit
字段名变量名必填类型示例值描述
商户 IDpid是Int1001
转账方式type是Stringalipay见转账方式列表
收款方账号account是Stringalipay@alipay.com支付宝账号 / 微信 OpenId / 银行卡号
收款方姓名name否String张三传入则校验账号与该姓名是否匹配
转账金额money是String1.00单位:元
转账备注remark否String
转账交易号out_biz_no否String2016080615134334917传入后可避免出现重复请求转账
安全发账本 IDbookid否String仅支付宝安全发转账可以传入
当前时间戳timestamp是String172120607210 位整数,单位秒
签名字符串sign是String参考签名规则
签名类型sign_type是StringRSA默认为 RSA

返回参数

字段名变量名类型示例值描述
返回状态码codeInt00 为成功,其它值为失败
错误信息msgString失败时返回转账失败原因
转账状态statusInt10:正在处理,1:转账成功
系统交易号biz_noString2016080615134334917
商户交易号out_biz_noString2016080615134334917可用于后续转账查询
接口转账单号orderidString40001283951815782支付宝/微信返回的转账单号
转账完成时间paydateString2024-07-01 16:47:32
转账花费金额cost_moneyString从商户可用余额扣减的金额
当前时间戳timestampString172120607210 位整数,单位秒
签名字符串signString参考签名规则
签名类型sign_typeStringRSA默认为 RSA

转账方式列表

状态值描述
alipay支付宝
wxpay微信支付
qqpayQQ 钱包
bank银行卡

如果返回的转账状态 status=0,则需稍后调用转账查询接口查询转账状态。

转账查询#

POST https://pay.ya92.com/api/transfer/query
字段名变量名必填类型示例值描述
商户 IDpid是Int1001
系统交易号biz_no二选一String2016080615134334919与商户交易号必传其一
商户交易号out_biz_no二选一String2016080615134334919与系统交易号必传其一
当前时间戳timestamp是String172120607210 位整数,单位秒
签名字符串sign是String参考签名规则
签名类型sign_type是StringRSA默认为 RSA

返回参数

字段名变量名类型示例值描述
返回状态码codeInt00 为成功,其它值为失败
返回信息msgString成功或失败时返回提示
转账状态statusInt10:正在处理,1:转账成功,2:转账失败
转账失败原因errmsgString收款方账户异常status=2 时才返回
系统交易号biz_noString2016080615134334917
商户交易号out_biz_noString2016080615134334917
接口转账单号orderidString40001283951815782支付宝/微信返回的转账单号
转账完成时间paydateString2024-07-01 16:47:32
转账金额amountString单位:元
转账花费金额cost_moneyString从商户可用余额扣减的金额
转账备注remarkString
当前时间戳timestampString172120607210 位整数,单位秒
签名字符串signString参考签名规则
签名类型sign_typeStringRSA默认为 RSA

可用余额查询#

POST https://pay.ya92.com/api/transfer/balance
字段名变量名必填类型示例值描述
商户 IDpid是Int1001
当前时间戳timestamp是String172120607210 位整数,单位秒
签名字符串sign是String参考签名规则
签名类型sign_type是StringRSA默认为 RSA

返回参数

字段名变量名类型示例值描述
返回状态码codeInt00 为成功,其它值为失败
返回信息msgString成功或失败时返回提示
商户可用余额available_moneyString1.00单位:元
转账手续费率transfer_rateString3%
当前时间戳timestampString172120607210 位整数,单位秒
签名字符串signString参考签名规则
签名类型sign_typeStringRSA默认为 RSA

V1 协议规则与签名#

V1 是旧版接口。使用 MD5 签名,接口地址形如 /submit.php、/mapi.php、/api.php,仅覆盖支付与查询类功能。新接入请直接使用 V2 接口(RSA 签名,支持退款、代付等完整能力)。
请求数据格式application/x-www-form-urlencoded
返回数据格式JSON
字符编码UTF-8
签名算法MD5

MD5 签名算法

  1. 将发送或接收到的所有参数按照参数名 ASCII 码从小到大排序(a-z);sign、sign_type 和空值不参与签名。
  2. 将排序后的参数拼接成 URL 键值对格式,例如 a=b&c=d&e=f,参数值不要进行 URL 编码。
  3. 再将拼接好的字符串与商户密钥 KEY 进行 MD5 加密,得出 sign:sign = md5(拼接字符串 + KEY)。

公式里的「+」是各语言的字符串拼接符,不是字面量字符;MD5 结果取小写。具体签名与发起支付的完整示例可下载 SDK 查看。

/** V1 旧版 MD5 签名 */
function epaySign(array $params, string $key): string
{
    // 1. 剔除 sign / sign_type 与空值
    unset($params['sign'], $params['sign_type']);
    $params = array_filter($params, function ($v) {
        return $v !== '' && $v !== null;
    });

    // 2. 键名 ASCII 升序
    ksort($params, SORT_STRING);

    // 3. 拼接成 k=v&k=v(值不做 URL 编码)后与密钥一起 md5
    $pairs = [];
    foreach ($params as $k => $v) {
        $pairs[] = $k . '=' . $v;
    }
    return strtolower(md5(implode('&', $pairs) . $key));
}

V1 页面跳转支付#

此接口可用于用户前台直接发起支付,使用 form 表单跳转或拼接成 URL 跳转。

POST https://pay.ya92.com/submit.php 亦支持 GET(推荐 POST,不容易被劫持或屏蔽)

请求参数

字段名变量名必填类型示例值描述
商户 IDpid是Int1001
支付方式type否Stringalipay见V1 支付方式列表;不传会跳转到收银台
商户订单号out_trade_no是String20160806151343349
异步通知地址notify_url是Stringhttp://www.pay.com/notify_url.php服务器异步通知地址
跳转通知地址return_url是Stringhttp://www.pay.com/return_url.php页面跳转通知地址
商品名称name是StringVIP会员超过 127 个字节会自动截取
商品金额money是String1.00单位:元,最大 2 位小数
业务扩展参数param否String没有请留空支付后原样返回
签名字符串sign是String202cb962ac59075b964b07152d234b70见MD5 签名算法
签名类型sign_type是StringMD5默认为 MD5

示例代码

<!-- V1 页面跳转支付:表单自动提交 -->
<form id="payForm" action="https://pay.ya92.com/submit.php" method="post">
    <input type="hidden" name="pid" value="1001">
    <input type="hidden" name="type" value="alipay">
    <input type="hidden" name="out_trade_no" value="20160806151343349">
    <input type="hidden" name="notify_url" value="http://www.pay.com/notify_url.php">
    <input type="hidden" name="return_url" value="http://www.pay.com/return_url.php">
    <input type="hidden" name="name" value="VIP会员">
    <input type="hidden" name="money" value="1.00">
    <input type="hidden" name="sign" value="MD5 签名结果">
    <input type="hidden" name="sign_type" value="MD5">
</form>
<script>document.getElementById('payForm').submit();</script>

V1 API 接口支付#

此接口可用于服务器后端发起支付请求,会返回支付二维码链接或支付跳转 URL。

POST https://pay.ya92.com/mapi.php

请求参数

字段名变量名必填类型示例值描述
商户 IDpid是Int1001
支付方式type是Stringalipay见V1 支付方式列表
商户订单号out_trade_no是String20160806151343349
异步通知地址notify_url是Stringhttp://www.pay.com/notify_url.php服务器异步通知地址
跳转通知地址return_url否Stringhttp://www.pay.com/return_url.php页面跳转通知地址
商品名称name是StringVIP会员超过 127 个字节会自动截取
商品金额money是String1.00单位:元,最大 2 位小数
用户 IP 地址clientip是String192.168.1.100用户发起支付的 IP 地址
设备类型device否Stringpc根据用户浏览器 UA 判断,见V1 设备类型列表;默认为 pc
业务扩展参数param否String没有请留空支付后原样返回
签名字符串sign是String202cb962ac59075b964b07152d234b70见MD5 签名算法
签名类型sign_type是StringMD5默认为 MD5

返回结果(JSON)

字段名变量名类型示例值描述
返回状态码codeInt11 为成功,其它值为失败
返回信息msgString失败时返回原因
订单号trade_noString20160806151343349支付订单号
支付跳转 URLpayurlStringhttps://pay.ya92.com/pay/wxpay/202010903/若返回该字段,则直接跳转到该 URL 支付
二维码链接qrcodeStringweixin://wxpay/bizpayurl?pr=04IPMKM若返回该字段,则根据该 URL 生成二维码
小程序跳转 URLurlschemeStringweixin://dl/business/?ticket=xxx若返回该字段,则使用 JS 跳转,可发起微信小程序支付

payurl、qrcode、urlscheme 三个参数只会返回其中一个。

$params = [
    'pid'          => '1001',
    'type'         => 'alipay',
    'out_trade_no' => '20160806151343349',
    'notify_url'   => 'http://www.pay.com/notify_url.php',
    'return_url'   => 'http://www.pay.com/return_url.php',
    'name'         => 'VIP会员',
    'money'        => '1.00',
    'clientip'     => '192.168.1.100',
];
$params['sign']      = epaySign($params, $merchantKey);
$params['sign_type'] = 'MD5';

$ch = curl_init('https://pay.ya92.com/mapi.php');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => http_build_query($params),
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 15,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);

if (($result['code'] ?? 0) == 1) {
    if (!empty($result['payurl'])) {
        header('Location: ' . $result['payurl']);        // 直接跳转支付
    } elseif (!empty($result['qrcode'])) {
        // 用 $result['qrcode'] 生成二维码给用户扫
    } elseif (!empty($result['urlscheme'])) {
        // 小程序场景:用 JS 跳转 $result['urlscheme']
    }
} else {
    exit('下单失败:' . ($result['msg'] ?? '未知错误'));
}

V1 支付结果通知#

通知类型:服务器异步通知(notify_url)、页面跳转通知(return_url)。

GET {商户 notify_url} 平台 → 商户

通知参数

字段名变量名必填类型示例值描述
商户 IDpid是Int1001
平台订单号trade_no是String20160806151343349021支付系统侧订单号
商户订单号out_trade_no是String20160806151343349商户系统内部的订单号
支付方式type是Stringalipay见V1 支付方式列表
商品名称name是StringVIP会员
商品金额money是String1.00
支付状态trade_status是StringTRADE_SUCCESS只有 TRADE_SUCCESS 表示成功
业务扩展参数param否String
签名字符串sign是String202cb962ac59075b964b07152d234b70见MD5 签名算法
签名类型sign_type是StringMD5默认为 MD5
返回内容:收到异步通知后,需返回 success(纯文本)以表示服务器已正确接收订单通知,否则平台会重复推送。

notify_url 处理示例

// V1 回调:先验签,再判断 trade_status
$params = $_GET;
$sign   = $params['sign'] ?? '';
if (!hash_equals(epaySign($params, $merchantKey), $sign)) {
    exit('sign error');
}
if (($params['trade_status'] ?? '') !== 'TRADE_SUCCESS') {
    exit('success');
}
// 幂等处理:同一 out_trade_no 可能收到多次通知
markOrderPaid($params['out_trade_no'], $params['trade_no']);
exit('success');

V1 支付方式与设备类型#

支付方式列表

调用值描述
alipay支付宝
wxpay微信支付
qqpayQQ 钱包
bank银联支付
jdpay京东支付
paypalPayPal
douyinpay抖音支付

设备类型列表

调用值描述
pc电脑浏览器
mobile手机浏览器
qq手机 QQ 内浏览器
wechat微信内浏览器
alipay支付宝客户端
douyin抖音 APP
jump仅返回支付跳转 URL

V1 查询商户信息#

GET https://pay.ya92.com/api.php?act=query&pid={商户ID}&key={商户密钥}

请求参数

字段名变量名必填类型示例值描述
操作类型act是Stringquery此 API 固定值
商户 IDpid是Int1001
商户密钥key是String89unJUB8HZ54Hj7x4nUj56HN4nUzUJ8i

返回结果

字段名变量名类型示例值描述
返回状态码codeInt11 为成功,其它值为失败
商户 IDpidInt1001
商户密钥keyString(32)89unJUB8HZ54Hj7x4nUj56HN4nUzUJ8i
商户状态activeInt11 为正常,0 为封禁
商户余额moneyString0.00商户所拥有的余额
结算方式typeInt11:支付宝,2:微信,3:QQ,4:银行卡
结算账号accountStringadmin@pay.com结算账号
结算姓名usernameString张三结算姓名
订单总数ordersInt30订单总数统计
今日订单order_todayInt15今日订单数量
昨日订单order_lastdayInt15昨日订单数量

V1 查询结算记录#

GET https://pay.ya92.com/api.php?act=settle&pid={商户ID}&key={商户密钥}

请求参数

字段名变量名必填类型示例值描述
操作类型act是Stringsettle此 API 固定值
商户 IDpid是Int1001
商户密钥key是String89unJUB8HZ54Hj7x4nUj56HN4nUzUJ8i

返回结果

字段名变量名类型示例值描述
返回状态码codeInt11 为成功
返回信息msgString查询结算记录成功!
结算记录dataArray结算记录列表

V1 查询单个订单#

GET https://pay.ya92.com/api.php?act=order&pid={商户ID}&key={商户密钥}&out_trade_no={商户订单号}

也可用 trade_no 传系统订单号。

请求参数

字段名变量名必填类型示例值描述
操作类型act是Stringorder此 API 固定值
商户 IDpid是Int1001
商户密钥key是String89unJUB8HZ54Hj7x4nUj56HN4nUzUJ8i
系统订单号trade_no二选一String20160806151343312
商户订单号out_trade_no二选一String20160806151343349

系统订单号与商户订单号二选一传入即可;若都传入,以系统订单号为准。

返回结果

字段名变量名类型示例值描述
返回状态码codeInt11 为成功,其它值为失败
返回信息msgString查询订单号成功!
平台订单号trade_noString2016080622555342651支付系统侧订单号
商户订单号out_trade_noString20160806151343349商户系统内部的订单号
第三方订单号api_trade_noString20160806151343349支付宝、微信等接口方订单号
支付方式typeStringalipay见V1 支付方式列表
商户 IDpidInt1001发起支付的商户 ID
创建订单时间addtimeString2016-08-06 22:55:52
完成交易时间endtimeString2016-08-06 22:55:52
商品名称nameStringVIP会员
商品金额moneyString1.00
支付状态statusInt01 为支付成功,0 为未支付
业务扩展参数paramString默认留空
支付者账号buyerString默认留空

V1 批量查询订单#

GET https://pay.ya92.com/api.php?act=orders&pid={商户ID}&key={商户密钥}

请求参数

字段名变量名必填类型示例值描述
操作类型act是Stringorders此 API 固定值
商户 IDpid是Int1001
商户密钥key是String89unJUB8HZ54Hj7x4nUj56HN4nUzUJ8i
查询订单数量limit否Int20最大 50
页码page否Int1当前查询的页码

返回结果

字段名变量名类型示例值描述
返回状态码codeInt11 为成功
返回信息msgString查询结算记录成功!
订单列表dataArray订单列表,字段可参考V1 查询单个订单

V1 提交订单退款#

需要先在商户后台开启「订单退款 API」开关,才能调用该接口发起订单退款。

POST https://pay.ya92.com/api.php?act=refund

请求参数

字段名变量名必填类型示例值描述
商户 IDpid是Int1001
商户密钥key是String89unJUB8HZ54Hj7x4nUj56HN4nUzUJ8i
平台订单号trade_no二选一String20160806151343349021与 out_trade_no 不能同时为空;都传时以本字段为准
商户订单号out_trade_no二选一String20160806151343349下单时传入的商户订单号,须在商家系统中唯一
退款金额money是String1.50少数通道需要与原订单金额一致

返回结果

字段名变量名类型示例值描述
返回状态码codeInt00 为成功,其它为失败
返回信息msgString退款成功

SDK 下载与示例#

官方提供现成的接入示例包,内含完整的签名、下单、异步通知验签、订单查询、退款实现,可直接对照改造。下载地址为平台官方公开发布的资源,本站直接引用,不做二次转载。

示例包里通常包含

  • 签名工具类:待签名字符串拼装、排序、加密 / 验签(V2 为 RSA,V1 为 MD5)。
  • 下单示例:页面跳转支付(表单提交)与统一下单(接口返回支付地址 / 二维码)。
  • 异步通知处理:验签 + 判断交易状态 + 输出 success 的完整回调样例。
  • 查询与退款:订单查询、退款、退款查询的请求封装。
接入过程中可先用 测试支付 页面发一笔小额订单,确认签名、下单、回调链路是否打通。若 SDK 中的接口地址与本文档不一致,请以后台「站点设置 → 接口文档」中配置的接口域名为准。

常见问题#

签名总是验签失败怎么办?
  • 确认剔除了 sign、sign_type 以及所有空值参数后再拼接。
  • 拼接顺序必须是键名的 ASCII 升序,且区分大小写,不要用 locale 排序。
  • 待签名字符串不要做 URL 编码(编码只在最终发起 HTTP 请求时对参数做一次)。
  • 确认使用的是商户私钥签名、平台公钥验签,不要用反。
  • 密钥需为完整 PEM 格式(含 -----BEGIN...----- 头尾)。
异步通知收不到,或收到多次?
  • notify_url 必须是公网可直接访问的地址,不能是 localhost 或内网 IP。
  • 处理完必须输出纯文本 success,否则平台判定失败并重推。
  • 收到多次属正常现象,业务侧必须做幂等(按 out_trade_no 去重)。
  • 务必以异步通知为准,return_url 跳转可能因用户关闭浏览器而丢失。
返回 code 非 0 如何排查?
  • 先看返回的 msg 文案,多数情况下已说明原因(如余额不足、通道维护、金额超限)。
  • 检查 timestamp 是否为 10 位秒级时间戳,与服务器时间偏差过大会被拒绝。
  • 确认 pid 与签名用的密钥属于同一商户。
如何快速自测?

可在测试支付页面直接发起一笔小额测试订单,验证通道是否可用(测试订单不支持退款)。

聚合支付平台 开放平台接口文档 · V2
签名算法 SHA256WithRSA · UTF-8