订阅支付
2026/10/9大约 9 分钟
订阅支付说明
订阅支付基于银行卡(VISA/Mastercard)支付,支持商户按订阅周期向用户发起扣款,适用于会员订阅、周期性缴费等场景。订阅支付通过 wayCode=CARD_H5 发起,涉及 CIT 与 MIT 两种交易模式:
| 交易模式 | 说明 | 发起方 | 用户是否参与 | channelExtra 参数 |
|---|---|---|---|---|
| CIT(Customer Initiated Transaction,客户发起交易) | 首次订阅支付,用户在支付页面完成银行卡支付,并授权商户后续按订阅周期扣款 | 用户 | 是 | isRebilling=0 |
| MIT(Merchant Initiated Transaction,商户发起交易) | 后续订阅扣款,商户基于首次订阅支付返回的支付凭证发起扣款,无需用户参与 | 商户 | 否 | isRebilling=1 |
isRebilling 置空表示普通支付,不涉及订阅支付。
订阅支付支付方式:CARD_H5(VISA/MC 银行卡 H5,支持 CIT/MIT 订阅支付)
订阅支付流程
下图展示了订阅支付的完整流程,包含首次订阅支付(CIT)与后续订阅扣款(MIT)两个阶段:
流程说明:
- 用户在商户系统发起首次订阅,商户系统调用统一下单接口发起首次订阅支付(CIT)
- 支付网关向渠道发起首次订阅支付,返回支付跳转链接
- 商户系统引导用户跳转支付页面,用户完成银行卡支付并授权后续扣款
- 支付成功后,支付网关通过支付通知或查询订单接口向商户系统返回支付结果及
channelUserPaymentOptionId - 商户系统保存
channelUserPaymentOptionId与首次订阅订单的payOrderId,用于后续订阅扣款 - 订阅周期到期时,商户系统调用统一下单接口发起后续订阅扣款(MIT),无需用户参与
- 支付网关向渠道发起扣款,并通过支付通知或查询订单接口返回扣款结果,商户按订阅周期重复执行
统一下单(订阅支付)
商户业务系统通过统一下单接口发起订阅支付订单,支付网关根据 channelExtra 中的订阅参数区分首次订阅支付(CIT)与后续订阅扣款(MIT)。
接口说明
请求URL:/api/pay/unifiedOrder
请求方式:POST
请求类型:application/json 或 application/x-www-form-urlencoded
请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 |
| 应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID |
| 商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 商户生成的订单号 |
| 支付方式 | wayCode | 是 | String(30) | CARD_H5 | 支付方式,订阅支付固定:CARD_H5 |
| 支付金额 | amount | 是 | int | 100 | 支付金额,单位分 |
| 货币代码 | currency | 是 | String(3) | HKD | 三位货币代码,港币:HKD |
| 客户端IP | clientIp | 否 | String(32) | 210.73.10.148 | 客户端IPV4地址 |
| 商品标题 | subject | 是 | String(64) | 商品标题测试 | 商品标题 |
| 商品描述 | body | 是 | String(256) | 商品描述测试 | 商品描述 |
| 异步通知地址 | notifyUrl | 否 | String(256) | https://www.gnete.com.hk/notify.htm | 支付结果异步回调URL,只有传了该值才会发起回调 |
| 跳转通知地址 | returnUrl | 否 | String(256) | https://www.gnete.com.hk/return.htm | 支付结果同步跳转通知URL |
| 失效时间 | expiredTime | 否 | int | 3600 | 订单失效时间,单位秒,默认2小时.订单在(创建时间+失效时间)后失效 |
| 渠道参数 | channelExtra | 否 | String(256) | {"userTokenId": "user_10001"} | 特定渠道发起的额外参数,json格式字符串.订阅支付参数见下方channelExtra订阅参数说明 |
| 扩展参数 | extParam | 否 | String(512) | 134586944573118714 | 商户扩展参数,回调时会原样返回 |
| 请求时间 | reqTime | 是 | long | 1622016572190 | 请求接口时间,13位时间戳 |
| 接口版本 | version | 是 | String(3) | 1.0 | 接口版本号,固定:1.0 |
| 签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 |
| 签名类型 | signType | 是 | String(32) | MD5 | 签名类型,目前只支持MD5方式 |
请求示例数据(首次订阅支付 CIT)
{
"amount": 100,
"extParam": "",
"mchOrderNo": "mho1624005107281",
"subject": "月度会员订阅",
"wayCode": "CARD_H5",
"sign": "84F606FA25A6EC4783BECC08D4FDC681",
"reqTime": "1624005107",
"body": "月度会员订阅",
"version": "1.0",
"channelExtra": "{\"userTokenId\":\"user_10001\",\"isRebilling\":\"0\",\"rebillExpiry\":\"20271231\",\"rebillFrequency\":\"30\"}",
"appId": "60cc09bce4b0f1c0b83761c9",
"clientIp": "192.166.1.132",
"notifyUrl": "https://www.gnete.com.hk/notify.html",
"signType": "MD5",
"currency": "HKD",
"returnUrl": "",
"mchNo": "M1623984572"
}请求示例数据(后续订阅扣款 MIT)
{
"amount": 100,
"extParam": "",
"mchOrderNo": "mho1624005107282",
"subject": "月度会员订阅",
"wayCode": "CARD_H5",
"sign": "84F606FA25A6EC4783BECC08D4FDC681",
"reqTime": "1624005107",
"body": "月度会员订阅",
"version": "1.0",
"channelExtra": "{\"userTokenId\":\"user_10001\",\"isRebilling\":\"1\",\"userPaymentOptionId\":\"384902353\",\"relatedTargetOrderId\":\"P202106181104177050002\"}",
"appId": "60cc09bce4b0f1c0b83761c9",
"clientIp": "192.166.1.132",
"notifyUrl": "https://www.gnete.com.hk/notify.html",
"signType": "MD5",
"currency": "HKD",
"returnUrl": "",
"mchNo": "M1623984572"
}返回参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 返回状态 | code | 是 | int | 0 | 0-处理成功,其他-处理有误,详见错误码 |
| 返回信息 | msg | 否 | String(128) | 签名失败 | 具体错误原因,例如:签名失败、参数格式校验错误 |
| 签名信息 | sign | 否 | String(32) | CCD9083A6DAD9A2DA9F668C3D4517A84 | 对data内数据签名,如data为空则不返回 |
| 返回数据 | data | 否 | String(512) | {} | 返回下单数据,json格式数据 |
data数据格式
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 支付订单号 | payOrderId | 是 | String(30) | U12021022311124442600 | 返回支付系统订单号 |
| 商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 返回商户传入的订单号 |
| 订单状态 | orderState | 是 | int | 2 | 支付订单状态 0-订单生成 1-支付中 2-支付成功 3-支付失败 4-已撤销 5-已退款 6-订单关闭 |
| 支付数据类型 | payDataType | 是 | String | payUrl | 支付参数类型,订阅支付为: payUrl-跳转链接的方式 |
| 支付数据 | payData | 否 | String | http://www.gnete.com.hk/pay.html | 发起支付用到的支付参数,首次订阅支付(CIT)时引导用户跳转该链接完成支付 |
| 渠道错误码 | errCode | 否 | String | ACQ.PAYMENT_AUTH_CODE_INVALID | 上游渠道返回的错误码 |
| 渠道错误描述 | errMsg | 否 | String | Business Failed 失败 | 上游渠道返回的错误描述 |
返回示例数据
{
"code": 0,
"data": {
"mchOrderNo": "mho1624005107281",
"orderState": 1,
"payDataType": "payUrl",
"payData": "http://www.gnete.com.hk/pay.html",
"payOrderId": "P202106181642329900002"
},
"msg": "SUCCESS",
"sign": "F4DA202C516D1F33A12F1E547C5004FD"
}channelExtra订阅参数说明
当 wayCode=CARD_H5 时,channelExtra传订阅支付相关参数:
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 用户标识ID | userTokenId | 否 | String(64) | user_10001 | 用户标识ID,订阅支付时涉及(暂时仅部分渠道支持) |
| 订阅支付标识 | isRebilling | 否 | String(1) | 0 | 置空-不涉及订阅支付;0-首次订阅支付(CIT);1-非首次订阅支付(MIT) |
| 订阅支付到期日 | rebillExpiry | 否 | String(8) | 20271231 | 订阅支付到期日,格式:YYYYMMDD,当isRebilling=0时必填 |
| 订阅支付频率 | rebillFrequency | 否 | String | 30 | 订阅支付(扣款)频率,单位:天,如30表示每30天扣款一次,当isRebilling=0时必填 |
| 用户支付选项ID | userPaymentOptionId | 否 | String(64) | 384902353 | 首次订阅支付成功返回的channelUserPaymentOptionId,当isRebilling=1时必填 |
| 关联交易订单号 | relatedTargetOrderId | 否 | String(30) | P202106181104177050002 | 关联首次订阅支付(CIT)成功订单的支付订单号payOrderId,当isRebilling=1时必填 |
订阅支付返回字段
首次订阅支付(CIT)成功后,渠道会返回用户支付选项ID。支付网关在查询订单接口(/api/pay/query)与支付通知中新增返回如下字段:
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 渠道用户支付选项ID | channelUserPaymentOptionId | 否 | String(64) | 384902353 | 订阅支付成功后渠道返回的用户支付选项ID(部分渠道返回),商户需保存,后续订阅扣款(MIT)时作为userPaymentOptionId传入 |
查询订单返回示例数据
{
"code": 0,
"data": {
"amount": 100,
"appId": "60cc09bce4b0f1c0b83761c9",
"body": "月度会员订阅",
"channelOrderNo": "2021061822001423031419593035",
"channelUserPaymentOptionId": "384902353",
"createdAt": 1623985457705,
"currency": "HKD",
"extParam": "",
"ifCode": "inetpay",
"mchNo": "M1623984572",
"mchOrderNo": "mho1624005107281",
"payOrderId": "P202106181104177050002",
"state": 2,
"subject": "月度会员订阅",
"successTime": 1623985459000,
"wayCode": "CARD_H5"
},
"msg": "SUCCESS",
"sign": "9548145EA12D0CD8C1628BCF44E19E0D"
}CIT/MIT 使用说明
首次订阅支付(CIT)
- 调用统一下单接口,
wayCode=CARD_H5,channelExtra传isRebilling=0,并传userTokenId、rebillExpiry、rebillFrequency - 获取返回的
payData(支付跳转链接),引导用户跳转支付页面,用户完成银行卡支付并授权后续扣款 - 支付成功后,通过支付通知或查询订单接口获取
channelUserPaymentOptionId与payOrderId,并妥善保存:channelUserPaymentOptionId:后续订阅扣款(MIT)时作为userPaymentOptionId传入payOrderId:后续订阅扣款(MIT)时作为relatedTargetOrderId传入
后续订阅扣款(MIT)
- 订阅周期到期时,调用统一下单接口,
wayCode=CARD_H5,channelExtra传isRebilling=1,并传userTokenId、userPaymentOptionId(首次订阅支付返回的channelUserPaymentOptionId)、relatedTargetOrderId(首次订阅支付订单的payOrderId) - 无需用户参与,支付网关直接向渠道发起扣款
- 通过支付通知或查询订单接口获取扣款结果,之后按订阅周期重复执行扣款
注意事项
isRebilling置空表示普通支付,不涉及订阅支付isRebilling只能为空、0或1,其他值下单失败isRebilling=0时rebillExpiry、rebillFrequency必填,rebillExpiry必须为YYYYMMDD格式的8位数字isRebilling=1时userPaymentOptionId、relatedTargetOrderId必填relatedTargetOrderId传首次订阅支付(CIT)成功订单的支付订单号(payOrderId),支付网关据此关联渠道交易订单,未找到对应订单时下单失败- 每次订阅扣款均为独立的支付订单,需分别处理支付通知与对账
- 订阅支付涉及的银行卡扣款,退款请参考退款接口文档