支付结果通知
支付通知
接口描述:当订单支付成功时,支付网关会向商户系统发起回调通知。如果商户系统没有正确返回,支付网关会延迟再次通知。
接口说明
适用对象:普通商户 特约商户
请求URL:该链接是通过统一下单接口提交的参数notifyUrl设置,如果无法访问链接,商户系统将无法接收到支付中心的通知。
请求方式:POST
请求类型:application/x-www-form-urlencoded
通知参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 支付订单号 | payOrderId | 是 | String(30) | P12021022311124442600 | 返回支付系统订单号 |
| 商户号 | mchNo | 是 | String(64) | M1621873433953 | 商户号 |
| 应用ID | appId | 是 | String(64) | 60cc09bce4b0f1c0b83761c9 | 应用ID |
| 商户订单号 | mchOrderNo | 是 | String(64) | 20160427210604000490 | 返回商户传入的订单号 |
| 支付接口 | ifCode | 是 | String(30) | wxpay | 支付接口编码 |
| 支付方式 | wayCode | 是 | String(30) | WX_LITE | 支付方式,微信小程序WX_LITE |
| 支付金额 | amount | 是 | int | 100 | 支付金额,单位分 |
| 货币代码 | currency | 是 | String(3) | cny | 三位货币代码,人民币:cny |
| 订单状态 | state | 是 | int | 2 | 支付订单状态 0-订单生成 1-支付中 2-支付成功 3-支付失败 4-已撤销 5-已退款 6-订单关闭 |
| 客户端IP | clientIp | 否 | String(32) | 210.73.10.148 | 客户端IPV4地址 |
| 商品标题 | subject | 是 | String(128) | 店来宝商品标题测试 | 商品标题 |
| 商品描述 | body | 是 | String(256) | 店来宝商品描述测试 | 商品描述 |
| 渠道订单号 | channelOrderNo | 否 | String | 20160427210604000490 | 对应渠道的订单号 |
| 渠道错误码 | errCode | 否 | String | 1002 | 渠道下单返回错误码 |
| 渠道错误描述 | errMsg | 否 | String | 134586944573118714 | 渠道下单返回错误描述 |
| 扩展参数 | extParam | 否 | String(512) | 134586944573118714 | 商户扩展参数 |
| 支付成功时间 | successTime | 否 | long | 1622016572190 | 订单支付成功时间,13位时间戳 |
| 创建时间 | createdAt | 是 | long | 1622016572190 | 订单创建时间,13位时间戳 |
| 通知请求时间 | reqTime | 是 | String(30) | 1622016572190 | 通知请求时间,,13位时间戳 |
| 签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 |
以下扩展参数如需同步传递需在商户后台配置
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 商户门店ID | storeId | 否 | int | 商户门店ID | |
| 经度 | lng | 否 | String | 商户门店ID | |
| 纬度 | at | 否 | String | 商户门店ID | |
| 码牌ID | qrcId | 否 | int | 商户门店ID | |
| 支付方式代码分类 | wayCodeType | 否 | String | 商户门店ID | |
| 商户手续费费率 | mchFeeRate | 否 | String | 商户门店ID | |
| 商户手续费 | mchFeeAmount | 否 | int | 商户手续费,单位分 | |
| 渠道用户标识 | channelUser | 否 | String | 渠道用户标识,如微信openId,支付宝账号 | |
| 订单分账模式 | divisionMode | 否 | int | 订单分账模式:0-该笔订单不允许分账, 1-支付成功按配置自动完成分账, 2-商户手动分账(解冻商户金额) | |
| 订单分账状态 | divisionState | 否 | int | 订单分账状态:0-未分账, 1-待分账, 2-分账中, 3-已分账, 4-完结中, 5-已完结, 6-已分账完结失败 | |
| 买家备注 | buyerRemark | 否 | String | 买家备注 | |
| 卖家备注 | sellerRemark | 否 | String | 卖家备注 | |
| 订单失效时间 | expiredTime | 否 | long | 订单失效时间 | |
| 支付凭证交易单号 | platformOrderNo | 否 | String | 支付凭证交易单号 | |
| 支付凭证商户单号 | platformMchOrderNo | 否 | String | 支付凭证商户单号 |
返回结果
业务系统处理后同步返回给支付中心,返回字符串 success 则表示成功,返回非success则表示处理失败,支付中心会再次通知业务系统。(通知频率为0/30/60/90/120/150,单位:秒)
注意:返回的字符串必须是小写,且前后不能有空格和换行符。
通知示例数据JSON
{
"amount": 5,
"body": "商品描述",
"clientIp": "192.166.1.132",
"createdAt": "1622016572190",
"currency": "cny",
"extParam": "",
"ifCode": "wxpay",
"mchNo": "M1621873433953",
"appId": "60cc09bce4b0f1c0b83761c9",
"mchOrderNo": "mho1621934803068",
"payOrderId": "20210525172643357010",
"state": 3,
"subject": "商品标题",
"wayCode": "WX_BAR",
"sign": "C380BEC2BFD727A4B6845133519F3AD6"
}
SDK验签代码示例
@RequestMapping("/mchJeepayPayOrderNotify")
public void mchJeepayPayOrderNotify(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 获取到请求参数
PayOrderNotifyResModel payOrderNotifyResModel = JeepayNotifyKit.convertNotifyResModel(request);
// 获取到jeepay回调参数中的: mchNo 和 appId
String mchNo = payOrderNotifyResModel.getMchNo();
String appId = payOrderNotifyResModel.getAppId();
String mchOrderNo = payOrderNotifyResModel.getMchOrderNo(); // 商户订单编号
String mchAppSecret = ""; // TODO 根据[mchNo,appId]自行查询配置的秘钥
// 验签失败
if(!payOrderNotifyResModel.checkSign(mchAppSecret)){
response.getWriter().print("sign fail");
return;
}
// 以下为验签成功
// TODO 商户业务逻辑处理。。。。。。。。。。。
// 响应jeepay SUCCESS字样
response.getWriter().print("SUCCESS");
}