签名算法 1.0
1. 协议规则
| 传输方式 | 采用 HTTP 传输 |
|---|---|
| 提交方式 | 采用 POST / GET 方式提交 |
| 内容类型 | application/x-www-form-urlencoded |
| 字符编码 | UTF-8 |
| 签名算法 | MD5 |
1.1 参数规范
交易金额:默认为人民币交易,单位为分,参数值不能带小数。
1.2 安全规范 · 签名算法
签名生成的通用步骤如下:
-
第一步
设所有发送或者接收到的数据为集合 M,将集合 M 内非空参数值的参数按照参数名 ASCII 码从小到大排序(字典序),使用 URL 键值对的格式(即 key1=value1&key2=value2…)拼接成字符串 stringA。
特别注意- 参数名 ASCII 码从小到大排序(字典序)
- 如果参数的值为空不参与签名
- 参数名区分大小写
- 验证调用返回或支付中心主动通知签名时,传送的 sign 参数不参与签名
- 支付中心接口可能增加字段,验证签名时必须支持增加的扩展字段
-
第二步
在 stringA 最后拼接上 key(即
StringA + "&key=" + 私钥)得到 stringSignTemp 字符串,并对 stringSignTemp 进行 MD5 运算,再将得到的字符串所有字符转换为大写,得到 sign 值 signValue。
下单接口
1.1 统一下单接口 · 标准
接口流程:机构调用预下单接口生成跳转支付订单页面。
/cashier/apply/appCreateOrder请求参数
| 字段名称 | 标识 | 必填 | 示例值 | 备注 |
|---|---|---|---|---|
| 交易商户号 | orgMerCode | M | 10000000 | 商户号 |
| 应用ID | APPID | O | aad3f9ac7cff4ccf8235b4ed30c12b51 | 应用 APPID |
| 交易终端号 | orgTermNo | M | 0000 | 终端号 |
| 交易订单号 | orgTrace | M | 202412020020070001 | 下游商户生成的订单号 |
| 交易金额 | transAmt | M | 100 | 支付金额,单位分 |
| 交易设备IP | orgDeviceIp | M | 203.214.26.222 | 上送用户真实交易设备 IP |
| 交易设备 | orgdevice | O | Android | 交易设备端 |
| 商品标题 | tite | M | 网络购物 | 商品标题 |
| 商品描述 | subject | M | 网络购物 | 商品描述信息 |
| 异步回调地址 | notifyUrl | M | http://shop.xx.com/notify.htm | 支付结果异步回调 URL |
| 请求时间 | timeoutMinutes | M | 20240515121300 | yyyyMMddHHmmss 格式 |
| 接口版本 | orgBasestation | M | 2.7 | 固定:2.7 |
| 签名 | sign | M | 2B8C85E8… | 详见签名算法 |
响应参数
| 字段名称 | 标识 | 必填 | 示例值 | 备注 |
|---|---|---|---|---|
| 返回状态码 | retCode | M | 0 | 0-处理成功,其他-处理有误 |
| 返回信息 | retMsg | O | 签名失败 | 具体错误原因 |
以下字段在 retCode=0 时有返回
| 字段名称 | 标识 | 必填 | 示例值 | 备注 |
|---|---|---|---|---|
| 交易订单号 | prodTrace | M | LF8202412020020070001 | 电商场景系统订单号 |
| 支付表单地址 | payUrl | M | https://h5.alipay.com/… | 返回支付表单内容 |
| 交易商户号 | orgMerCode | O | 10000000 | 返回交易商户号 |
| 交易金额 | transAmt | O | 100 | 返回交易金额 |
| 签名 | sign | M | 2B8C85E8… | 签名信息 |
响应示例
{
"prodTrace": "LF8202412020020070001",
"payUrl": "http://170.33.8.116:8182/payurl?orgTrace=Pnull2024021211314049724732&transAmt=888.99",
"retCode": "0",
"sign": "3251661E4B84AAB6BAA1A6A025F40036"
}
1.2 查询订单接口 · 标准
接口流程:业务系统通过查询支付订单接口获取最新的支付订单状态,并根据状态结果进一步处理业务逻辑。
/cashier/trade/appCreatequery请求参数
| 字段名称 | 标识 | 必填 | 示例值 | 备注 |
|---|---|---|---|---|
| 交易商户号 | orgMerCode | M | 10000000 | 分配的商户号 |
| 电商订单号 | prodTrace | M | LF8202412020020070001 | 与 orgTrace 二者传一即可 |
| 商户订单号 | orgTrace | M | 20160427210604000490 | 与 prodTrace 二者传一即可 |
| 是否执行回调 | executeNotify | O | true | true 则支付中心会再次向商户发起回调 |
| 接口版本 | orgBasestation | M | 2.7 | 固定:2.7 |
| 请求时间 | timeoutMinutes | M | 20240515121300 | yyyyMMddHHmmss 格式 |
| 签名 | sign | M | 2B8C85E8… | 详见签名算法 |
响应参数(retCode=0 时)
| 字段名称 | 标识 | 必填 | 示例值 | 备注 |
|---|---|---|---|---|
| 交易商户号 | orgMerCode | M | 10000000 | 拉单分配商户号 |
| 应用ID | appId | M | aad3f9ac… | 应用 APPID |
| 交易终端号 | orgTermNo | M | 0000 | 拉单分配的终端号 |
| 电商订单号 | prodTrace | M | LF8202412020020070001 | 系统订单号 |
| 交易订单号 | orgTrace | M | 202412020020070001 | 下游商户订单号 |
| 交易金额 | transAmt | M | 100 | 单位分 |
| 订单状态 | status | M | 2 | -2 已关闭, 0 生成, 1 支付中, 2 成功, 3 业务完成, 4 已退款 |
| 签名 | Sign | M | 2B8C85E8… | 详见签名算法 |
响应示例
{
"retCode": "0",
"sign": "35CD50041BCC2D6D4F445C2F6F22D36B",
"orgMerCode": "20000010",
"appId": "aad3f9ac7cff4ccf8235b4ed30c12b51",
"orgTermNo": "8045",
"prodTrace": "LF8202412070454420001",
"orgTrace": "TEST1733518477095",
"transAmt": "100",
"status": "2",
"paySuccTime": "1733518845000"
}
1.3 支付结果通知
当订单支付成功时,支付中心会向商户的 notifyUrl 地址发起回调。该链接通过统一下单接口的 notifyUrl 参数设置。
通知参数
| 字段名称 | 标识 | 必填 | 示例值 | 备注 |
|---|---|---|---|---|
| 交易商户号 | orgMerCode | M | 10000000 | 拉单分配商户号 |
| 应用ID | appId | M | aad3f9ac… | 应用 APPID |
| 交易终端号 | orgTermNo | M | 0000 | 终端号 |
| 电商订单号 | prodTrace | M | LF8202412020020070001 | 系统订单号 |
| 交易订单号 | orgTrace | M | 202412020020070001 | 商户订单号 |
| 交易金额 | transAmt | M | 100 | 单位分 |
| 付款金额 | income | O | 100 | 用户实际付款金额,单位分 |
| 订单状态 | status | M | 2 | 同查询接口状态说明 |
| 支付成功时间 | paySuccTime | M | 1733518845000 | 精确到毫秒 |
| 通知类型 | backType | M | 1 | 1-前台通知,2-后台通知 |
| 请求时间 | timeoutMinutes | M | 20240515121300 | yyyyMMddHHmmss |
| 签名 | sign | M | 2B8C85E8… | 详见签名算法 |
业务系统处理后同步返回给支付中心,返回字符串 success 表示成功,返回非 success 则处理失败,支付中心会再次通知(频率 60/120/180/240/300 秒)。返回字符串必须是小写,且前后不能有空格。
代付接口
1. 申请代付
商户通过代付接口发起代付申请,支付系统收到请求后同步返回申请结果,申请成功并不代表代付成功。确定代付结果的方式:
- 发起代付时传递代付结果回调地址,支付系统处理完成后向该地址发起通知
- 商户系统主动发起代付查询,以查询到的最终结果确定代付是否成功
注意:商户访问该接口需要申请 IP 白名单。
{payUrl}/agentpay/apply请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 商户ID | mchId | 是 | String(30) | 1000000010 | 支付中心分配的商户号 |
| 商户代付单号 | mchOrderNo | 是 | String(30) | A201907011234 | 商户代付单号 |
| 代付金额 | amount | 是 | int | 1000 | 单位分 |
| 账户属性 | accountAttr | 否 | String(2) | 0 | 0-对私, 1-对公,默认对私 |
| 银行名称 | bankName | 是 | String(128) | 中国工商银行 | 收款卡银行名称 |
| 收款人姓名 | accountName | 是 | String(64) | 张三 | 收款人姓名 |
| 收款人卡号 | accountNo | 是 | String(64) | 622848… | 收款人卡号 |
| 开户行省份 | province | 否 | String(32) | 北京市 | 开户行所在省份 |
| 开户行市 | city | 否 | String(32) | 北京市 | 开户行所在市 |
| 联行号 | bankNumber | 否 | String(64) | 联行号 | |
| 代付回调URL | notifyUrl | 否 | String(128) | 代付结果回调 URL | |
| 备注 | remark | 否 | String(128) | 备注 | |
| 扩展域 | extra | 否 | String(128) | 扩展域 | |
| 请求时间 | reqTime | 是 | String(30) | 20190723141000 | yyyyMMddHHmmss |
| 接口版本 | version | 是 | String(3) | 1.0 | 固定:1.0 |
| 签名 | sign | 是 | String(32) | C380BEC2… | 详见签名算法 |
响应参数(retCode=0 时)
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 代付订单号 | agentpayOrderId | 是 | String(32) | T201990131313 | 代付订单号 |
| 状态 | status | 是 | String(2) | 2 | 0-待处理, 1-处理中, 2-成功, 3-失败, 4-待人工处理 |
| 手续费 | fee | 是 | String(30) | 10 | 单位分 |
| 转账提示 | transMsg | 否 | String(128) | 转账提示 | |
| 扩展域 | extra | 否 | String(128) | 扩展域 | |
| 签名 | sign | 是 | String(32) | C380BEC2… | 详见签名算法 |
2. 代付确认
当商户通过接口发起代付请求后,如果商户开启代付二次确认,支付平台会向商户配置的代付确认地址发起请求,等待商户系统返回确认结果。
商户配置的二次确认地址请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 商户订单号 | mchOrderNo | 是 | String(32) | M201990131313 | 商户订单号 |
| 金额 | amount | 是 | int | 10 | 代付发起金额,单位分 |
返回 ok 表示确认该代付订单正确存在;返回 fail 表示确认不存在;返回其他或无响应则支付平台每延迟 10 秒再发请求(最多 3 次)。返回字符串必须小写,前后不能有空格和换行。返回 ok 则继续执行代付,否则代付退回商户。
3. 查询代付订单
商户通过该接口查询代付订单结果,并根据状态结果进一步处理业务逻辑。
{payUrl}/agentpay/query_order请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 商户ID | mchId | 是 | String(30) | 1000000010 | 商户号 |
| 商户订单号 | mchOrderNo | 否 | String(32) | M1000000010 | 与代付订单号二选一 |
| 代付订单号 | agentpayOrderId | 否 | String(32) | T1000000010 | 与商户订单号二选一 |
| 请求时间 | reqTime | 是 | String(30) | 20190723141000 | yyyyMMddHHmmss |
| 接口版本 | version | 是 | String(3) | 1.0 | 固定:1.0 |
| 签名 | sign | 是 | String(32) | C380BEC2… | 详见签名算法 |
响应参数(retCode=0 时)
| 字段名 | 变量名 | 必填 | 类型 | 描述 |
|---|---|---|---|---|
| 代付订单号 | agentpayOrderId | 是 | String(32) | 代付订单号 |
| 商户订单号 | mchOrderNo | 是 | String(32) | 商户订单号 |
| 代付金额 | amount | 是 | int | 单位分 |
| 手续费 | fee | 是 | int | 单位分 |
| 状态 | status | 是 | String(2) | 0-待处理, 1-处理中, 2-成功, 3-失败, 4-待人工处理 |
| 转账提示 | transMsg | 否 | String(128) | 转账提示 |
| 签名 | sign | 是 | String(32) | 详见签名算法 |
4. 查询余额
商户可通过该接口查询代付账户余额。
{payUrl}/agentpay/query_balance请求参数
| 字段名 | 变量名 | 必填 | 类型 | 描述 |
|---|---|---|---|---|
| 商户ID | mchId | 是 | String(30) | 商户号 |
| 请求时间 | reqTime | 是 | String(30) | yyyyMMddHHmmss |
| 接口版本 | version | 是 | String(3) | 固定:1.0 |
| 签名 | sign | 是 | String(32) | 详见签名算法 |
响应参数(retCode=0 时)
| 字段名 | 变量名 | 必填 | 类型 | 描述 |
|---|---|---|---|---|
| 代付余额 | agentpayBalance | 是 | int | 代付余额 |
| 可用代付余额 | availableAgentpayBalance | 是 | int | 可用代付余额 |
| 签名 | sign | 是 | String(32) | 详见签名算法 |
5. 代付结果通知
当代付处理完成后,支付系统会通过该接口向商户发起通知。链接由代付申请接口的 notifyUrl 参数设置。
通知参数
| 字段名 | 变量名 | 必填 | 类型 | 描述 |
|---|---|---|---|---|
| 代付订单号 | agentpayOrderId | 是 | String(32) | 代付订单号 |
| 商户订单号 | mchOrderNo | 是 | String(32) | 商户订单号 |
| 状态 | status | 是 | String(2) | 0-待处理, 1-处理中, 2-成功, 3-失败, 4-待人工处理 |
| 手续费 | fee | 是 | int | 单位分 |
| 转账提示 | transMsg | 否 | String(128) | 转账提示 |
| 扩展域 | extra | 否 | String(128) | 扩展域 |
| 通知请求时间 | reqTime | 是 | String(30) | yyyyMMddHHmmss |
| 签名 | sign | 是 | String(32) | 详见签名算法 |
返回 success 表示成功,返回非 success 则失败并重试(60/120/180/240/300 秒)。字符串必须小写,前后不能有空格和换行。
6. 错误码
| RetCode | 描述 |
|---|---|
0 | 成功 |
9999 | 业务异常,具体错误详见 RetMsg 字段 |
0100 | 商户签名异常 |
0010 | 系统错误 |
0011 | 请使用 post 方法 |
0012 | post 数据为空 |
0013 | 签名错误 |
0014 | 参数错误 |
0015 | 商户不存在 |
0110 | 第三方超时 |
0111 | 第三方异常 |
0112 | 订单不存在 |
0113 | 订单已支付 |
0114 | 商品不存在 |
0115 | 价格不对 |
0116 | 物品数量不对 |
0117 | 过程返回 255 |
0118 | DB 错误 |
0119 | 支付中心没有对应的渠道 |
0120 | 修改订单状态失败 |