按签约号扣款
建议超时 15000ms。幂等键:商户号 + out_trade_no。按 contract_no 查询可用协议并扣款;可同步返回结果,并在配置 notify_url 时推送异步通知。
接口说明
请求方式:【POST】/v1/wallet/deduct/pay
请求域名:【主域名】https://api.baofu.com
请求参数
Header 参数
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| Authorization | string | true | 请参考【开发指引-整体说明】生成认证信息 |
| Accept | string | true | 请设置为 application/json |
| Content-Type | string | true | 请设置为 application/json |
Body 参数
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| out_trade_no | string | true | 商户订单号;最长 64 |
| contract_no | string | true | 签约号;最长 32 |
| agreement_no | string | false | 指定扣款协议;未传则按顺序尝试;最长 64 |
| payment_amount | integer | true | 扣款金额;>0;单位分 |
| goods_info | string | true | 商品/消费信息说明;最长 256 |
| biz_type | string | false | 业务类型(预留);最长 32 |
| notify_url | string | false | 扣款终态异步通知地址;最长 256 |
| risk_control_info | object | true | 风控参数 JSON 对象 |
| risk_control_info.goods_category | string | false | 商品类目 |
| risk_control_info.user_register_dt | string | false | 用户注册时间 |
| risk_control_info.user_login_method | string | false | 用户登录方式 |
| risk_control_info.user_ip | string | false | 用户 IP |
| risk_control_info.user_device_id | string | false | 用户设备 ID |
请求示例
{
"out_trade_no": "DED202505250001",
"contract_no": "C20250525000001",
"payment_amount": 1990,
"goods_info": "会员月卡",
"notify_url": "https://merchant.example.com/callback/wallet/deduct",
"risk_control_info": {
"goods_category": "02",
"user_register_dt": "20220101000000",
"user_login_method": "1",
"user_ip": "192.168.1.1",
"user_device_id": "device_001"
}
}
应答参数
200 OK
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| trade_no | string | true | 平台交易号 |
| out_trade_no | string | true | 商户订单号 |
| trade_status | string | true | 成功时固定 SUCCESS |
| success_agreement_no | string | true | 扣款成功的协议绑定号 |
| payment_amount | integer | true | 扣款金额(分) |
| successful_payment_time | string | true | 扣款成功时间,ISO 8601 |
| bank_code | string | false | 银行编码 |
| bank_card_type | string | false | 卡类型,如 D/C |
| bank_card_no_masked | string | false | 脱敏卡号,如 ****5661 |
应答示例
200 OK
{
"trade_no": "4101010120250525120000000001",
"out_trade_no": "DED202505250001",
"trade_status": "SUCCESS",
"success_agreement_no": "AGR20250525000001",
"payment_amount": 1990,
"successful_payment_time": "2026-05-25T15:10:01+08:00",
"bank_code": "ICBC",
"bank_card_type": "D",
"bank_card_no_masked": "****5661"
}
错误码
公共错误码
| 状态码 | 错误码 | 描述 | 解决方案 |
|---|---|---|---|
| 401 | SIGN_ERROR | 验证不通过 | 请参阅【开发指引-整体说明】排查签名 |
| 400 | PARAM_ERROR | 参数错误 | 请根据错误提示正确传入参数 |
| 500 | SYSTEM_ERROR | 系统异常,请稍后重试 | 请稍后重试 |
业务错误码
| 状态码 | 错误码 | 描述 | 解决方案 |
|---|---|---|---|
| 非 200 | USER_PAYING | 处理中 | 轮询扣款查询或等通知;勿用相同 out_trade_no 重试 |
| 非 200 | TRADE_ERROR | 无可用协议;协议不匹配;全部失败 | 读 message;查协议列表;失败须换单 |
| 非 200 | ORDER_DUPLICATED | 幂等命中处理中/历史失败 | 查扣款结果;失败换单 |
| 非 200 | INVALID_PARAMETER | 参数错误;risk_control_info 为空 | 修正参数 |
| 非 200 | UPSTREAM_TIMEOUT | 上游异常 | 查扣款结果确认是否已受理 |
应答示例
失败
{
"code": "TRADE_ERROR",
"message": "协议号全部扣款失败"
}
应答示例
失败
{
"code": "USER_PAYING",
"message": "扣款处理中,请勿重复提交"
}
应答示例
失败
{
"code": "ORDER_DUPLICATED",
"message": "交易失败"
}
应答示例
失败
{
"code": "INVALID_PARAMETER",
"message": "交易失败"
}
应答示例
失败
{
"code": "UPSTREAM_TIMEOUT",
"message": "交易失败"
}
应答示例
失败
{
"code": "SYSTEM_ERROR",
"message": "交易失败"
}