微信支付宝类接口¶
自2019年5月5日起上线的新商户,完成入驻后商户需继续完成微信官方实名认证后才能进行交易,请参考 商户实名认证指引 完成实名认证。
209 扫码支付接口¶
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本号 | version | 定长2位String | 必须 | 目前固定为10 |
消息类型 | cmd_id | 定长3位String | 必须 | 209 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16位String | 可选 | 付款客户号 |
订单日期 | order_date | 定长8位String | 必须 | 格式为YYYYMMDD,例如:20160307 |
订单号 | order_id | 变长20位String | 必须 | 由商户生成,必须保证唯一, 20位内的字母或数字组合 |
商品描述 | goods_desc | 变长127位String | 必须 | |
二维码支付类型 | pay_type | 定长2位String | 必须 | 04 : 微信 05 : 支付宝 |
请求类型 | request_type | 定长2位String | 必须 | 00 : PC端(汇付页面显示二维码) 01 : 移动端(汇付页面显示二维码) 如果需要直接返回二维码地址,请对接APP支付接口(218) |
交易金额 | trans_amt | 变长14位String | 必须 | 金额格式是###.00 |
分账账户串 | div_detail | 变长String | 必须 | 该参数表示分账对象,将金额分给不同用户的账户中;分账串定义可参照下表 |
数据格式:[{‘divCustId’:‘6666000000025350’,’divAcctId’:‘78276’,’divAmt’:‘50.00’,’divFreezeFg’:‘00’}],可分给多个对象,每个对象大括号{}用逗号隔开 | ||||
divCustId和divAcctId即为开户接口返回的user_cust_id和acct_id,若分给商户平台自己,可通过上线邮件中查找商户客户号和子账号信息 | ||||
操作员 | oper_user_Id | 变长32位String | 可选 | |
商品类型 | goods_type | 变长32位String | 可选 | |
设备号 | device_info | 变长32位String | 可选 | |
商户前台应答地址 | ret_url | 变长128位的String | 可选 | 请求类型为后端时,必须输入 |
商户后台应答地址 | bg_ret_url | 变长128位的String | 必须 | 通过后台异步通知结果 注意: 1) 使用时不要包含中文 2) 必须是外网地址 |
商户私有域 | mer_priv | 变长120位的String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位的String | 可选 | 用于扩展请求参数 |
二级商户号 | secondary_mer_id | 定长10位的String | 可选 | 对于开启二级商户模式的商户,必须输入其配下的二级商户号 |
是否支持贷记卡 | limit_pay | 定长1位String | 可选 | 1为禁用,否则可不填 |
设备信息 | dev_info_json | 变长1024位String | 必须 | 参见 设备静态信息 。 |
分账账户串(div_detail )内容:
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
分账客户号 | divCustId | 变长16位String | 必须 | div_detail参数下的二级参数 分账客户号 |
分账账户号 | divAcctId | 变长9位String | 必须 | div_detail参数下的二级参数 分账账户号 |
分账金额 | divAmt | 变长14位String | 必须 | div_detail参数下的二级参数 分账金额,保留两位小数 |
是否冻结标志 | divFreezeFg | 定长2位String | 必须 | div_detail参数下的二级参数 冻结标志 01:冻结; 00:不冻结 |
返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 209 |
应答返回码 | resp_code | 定长6位String | 必须 | 209000–调用成功,其他见返回码 |
应答返回描述 | resp_desc | 变长String | 必须 | 返回码的对应中文描述 |
银行返回码 | bg_bank_code | 变长32位String | 可选 | |
银行返回描述 | bg_bank_message | 变长200位String | 可选 | |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16位String | 可选 | 付款客户号 |
订单日期 | order_date | 定长8位String | 必须 | 格式为YYYYMMDD,例如:20160307 |
订单号 | order_id | 变长20位String | 必须 | 由商户生成,必须保证唯一, 20位内的字母或数字组合 |
本平台交易唯一标识号 | platform_seq_id | 定长18位String | 必须 | 组成规则:8位本平台日期+ 10位系统流水号 |
商品描述 | goods_desc | 变长1024位String | 必须 | |
二维码支付类型 | pay_type | 定长2位String | 必须 | 04 : 微信 05 : 支付宝 |
请求类型 | request_type | 定长2位String | 必须 | 00 : PC端(汇付页面显示二维码) 01 : 移动端(汇付页面显示二维码) |
交易金额 | trans_amt | 变长14位String | 必须 | 金额格式是###.00 |
分账账户串 | div_detail | 变长String | 必须 | 业务类型为支付时必传,分账账户必须是入账客户的账户 数据格式: [{‘divCustId’:‘6666000000025350’,’divAcctId’:‘78276’,’divAmt’:‘50.00’,’divFreezeFg’:‘00’},{‘divCustId’:‘6666000000025666’,’divAcctId’:‘78841’,’divAmt’:‘50.00’,’divFreezeFg’:‘01’}] |
二维码链接 | qrcode_url | 变长128位String | 可选 | |
操作员 | oper_user_id | 变长32位String | 可选 | |
商品类型 | goods_type | 变长32位String | 可选 | |
设备号 | device_info | 变长32位String | 可选 | |
外部订单流水号 | out_trans_id | 变长64位String | 可选 | 外部订单流水号,指支付宝、微信、银联流水号 |
商户前台应答地址 | ret_url | 变长128位的String | 可选 | 请求类型为后端时,必须输入 |
商户后台应答地址 | bg_ret_url | 变长128位的String | 必须 | 通过后台异步通知结果 注意: 1) 使用时不要包含中文 2) 必须是外网地址 |
商户私有域 | mer_priv | 变长120位的String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位的String | 可选 | 用于扩展请求参数 |
手续费金额 | fee_amt | 变长14位String | 可选 | 手续费金额,格式为###.00 |
手续费扣款客户号 | fee_cust_id | 定长16位String | 可选 | 手续费扣款客户号 |
手续费子账户号 | fee_acct_id | 变长9位String | 可选 | 手续费扣款子账户号 |
返回码¶
返回码 | 返回描述 |
209000 | 交易成功 |
209002 | 请求已受理 |
209003 | 交易失败 |
209004 | 交易关闭 |
209098 | 系统超时 |
209099 | 系统异常 |
209100 | 请求参数非法 |
209101 | 商户无此接口权限 |
209102 | 验证签名失败 |
209103 | 商户状态异常 |
209104 | 用户状态异常 |
209107 | 消息类型与签名内容不一致 |
209108 | 商户客户号与签名内容不一致 |
209109 | 版本号与签名内容不一致 |
209110 | 商户号不存在 |
209104 | 用户状态异常 |
209105 | 账户状态异常 |
209727 | 分账信息异常 |
209721 | 分账串内容不能超过五个 |
209722 | 分账串部分字段为空 |
209723 | 分账串金额格式错误 |
209728 | 分账串账户信息格式错误 |
209729 | 分账串账户异常 |
209726 | 分账信息账户状态异常 |
209725 | 分账信息用户状态异常 |
209741 | 分账串内容重复 |
209732 | 分账串客户号信息格式错误 |
209724 | 分账串累计金额不等于订单金额 |
209202 | 交易订单号重复 |
209744 | 商户不支持扫码支付 |
209204 | 商户配置异常 |
209303 | 商户支付基础信息未配置 |
209321 | 支付手续费未配置 |
209323 | 支付手续费只能向商户收取 |
209314 | 支付手续费账户状态不正常 |
209215 | 请补录身份信息 |
209804 | 商户超限额或限次 |
209805 | 商户未开通该功能权限 |
209806 | 商户交易限制 |
209341 | 订单已关闭 |
209342 | 已支付成功 |
209343 | 已支付失败 |
209344 | 订单信息不匹配 |
209345 | 未获取二维码链接 |
代码示例¶
java
String valueObj = "{
"version": "10",
"cmd_id": "209",
"mer_cust_id": "6666000000026086",
"user_cust_id": "6666000000026190",
"order_id": "209017108",
"order_date": "20170829",
"trans_amt": "0.03",
"bg_ret_url": "http://192.168.0.74:8001/npayCallBack/asyncHandle.json",
"mer_priv": "*1erwer.868@",
"ret_url": "",
"extension": "u",
"div_detail": "[{'divCustId':'6666000000026185','divAcctId':'79704','divAmt':'0.02','divFreezeFg':'01'},{'divCustId':'6666000000026086','divAcctId':'79506','divAmt':'0.01','divFreezeFg':'00'}]",
"device_info": "测试测qq",
"goods_desc": "分账串,有冻结",
"goods_type": "试测试试qq",
"oper_user_id": "试试qq",
"order_expire_time": "9900",
"pay_type": "04",
"request_type": "01"
}";
String testUrl = "http://192.168.3.170:8083/npay/merchantRequest";
String checkValue = sign(valueObj);
String cmdId = "209";
String merCustId = "6666000000026086";
String version = "10";
httpServletResponse.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
PrintWriter out = httpServletResponse.getWriter();
out.println();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>sender</TITLE></HEAD>");
out.println(" <BODY style=\"display: none\">");
out.println("<form name=\"submitForm\" action=\"" + url + "\" method=\"post\">");
out.println("<input type=\"hidden\" name=\"cmd_id\" value=\"" + cmd_id + "\"/>");
out.println("<input type=\"hidden\" name=\"version\" value=\"" + version + "\"/>");
out.println("<input type=\"hidden\" name=\"mer_cust_id\" value=\"" + merCustId + "\"/>");
out.println("<input type=\"hidden\" name=\"check_value\" value=\"" + checkValue + "\"/>");
out.println("</from>");
out.println("<script>window.document.submitForm.submit();</script>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
成功响应:
200
{
"cmd_id": "209",
"resp_code": "209000",
"resp_desc": "交易成功",
"mer_cust_id" : "6666000000026086",
"order_date": "20180327",
"order_id": "10000000001",
.......
}
失败响应:
200
{
"cmd_id": "209",
"resp_code": "209099",
"resp_desc": "交易失败",
"mer_cust_id" : "6666000000026086",
"order_date": "20180327",
"order_id": "10000000001",
.......
}
页面展示¶
218 APP 支付(支付宝、微信、银联云闪付)¶
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本号 | Version | 定长2位String | 必须 | 目前固定为10 |
消息类型 | cmd_id | 定长3位String | 必须 | 218 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16位String | 可选 | 付款客户号 |
订单日期 | order_date | 定长8位String | 必须 | 格式为YYYYMMDD,例如:20160307 |
订单号 | order_id | 变长20位String | 必须 | 由商户生成,必须保证唯一, 20位内的字母或数字组合 |
支付类型 | pay_type | 定长2位String | 必须 | 04:微信正扫; 05:支付正扫; 10 : 微信APP支付; 12:支付宝统一下单; 13:微信公众号; 14: APPLE支付; 18: 银联正扫; 19: 小程序支付 |
交易金额 | trans_amt | 变长14位String | 必须 | 金额格式是###.00 |
入账客户号 | in_cust_id | 定长16位String | 可选 | (入账客户号、入账账户号) 和 分账串 两者必填一项,且只能填一项 |
入账账户号 | in_acct_id | 变长9位String | 可选 | 开户返回的acct_id,若是分给平台自己,可以通过邮件查找商户客户号和子账号信息。(in_cust_id同理) |
分账账户串 | div_detail | 变长String | 可选 | div_detail和上方的(in_cust_id,in_acct_id)两者必填一项,且只能填一项;分账串定义可参照下表;注:如果不需要分账给多个人的话,就不要传分账账户串,直接传入账客户号和入账账户号 |
数据格式:[{‘divCustId’:‘6666000000025350’,’divAcctId’:‘78276’,’divAmt’:‘50.00’,’divFreezeFg’:‘00’}],可分给多个对象,每个对象大括号{}用逗号隔开 | ||||
该参数表示分账对象,将金额分给虚拟用户的账户中,divCustId和divAcctId即为开户接口返回的user_cust_id和acct_id,若分给平台自己,可通过上线邮件中查找商户客户号和子账号信息 | ||||
是否原生态 | is_raw | 定长1位String | 可选 | 微信公众号支付时的参数 是否原生态 是:1 否:0 注:为空时,默认1 |
APPID | app_id | 变长32位String | 可选 | 商户在微信申请的APPID; 支付类型为微信APP支付、微信公众号支付、微信小程序支付时不能为空 |
买家用户ID | buyer_id | 变长100位String | 可选 | 支付宝统一下单时必填;微信公众号支付、微信小程序支付时: 联调环境下传空 生产环境下不能为空 |
商品描述 | goods_desc | 变长127位String | 必须 | |
商品类型 | goods_type | 定长4位String | 可选 | |
附加信可选息 | attach_info | 变长128位String | 可选 | 微信公众号支付的参数 |
商品标记 | good_tag | 变长32位String | 可选 | 微信公众号支付的参数 商品标记,优惠标志等 |
设备号 | device_info | 变长32位String | 可选 | |
IP地址 | ip_addr | 变长20位String | 可选 | |
经纬度 | location_val | 变长30位String | 可选 | 参数格式:116.538799,39.983523 |
支付返回地址 | ret_url | 变长128位的String | 可选 | 微信公众号支付时,必须输入 用于微信支付成功后跳转的页面; 支付宝统一下单时,必须输入 ; 微信小程序时,必须输入 |
商户后台应答地址 | bg_ret_url | 变长128位的String | 必须 | 通过后台异步通知商户开户结果 注意: 1) 使用时不要包含中文 2) 必须是外网地址 |
商户私有域 | mer_priv | 变长120位的String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位的String | 可选 | 用于扩展请求参数,数据格式:{“province”:”31”,”city”:”310000”} 参考说明 |
二级商户号 | secondary_mer_id | 定长10位的String | 可选 | 对于开启二级商户模式的商户,必须输入其配下的二级商户号 |
是否支持贷记卡 | limit_pay | 定长1位的String | 可选 | 1为禁用,否则可不填 |
设备信息 | dev_info_json | 变长1024位String | 必须 | 参见 设备静态信息 。 |
订单超时时间 | order_expire_time | 定长14位String | 可选 | 单位秒 格式为YYYYMMDDHHmmss |
分账账户串(div_detail )内容:
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
分账客户号 | divCustId | 变长16位String | 必须 | div_detail参数下的二级参数 分账客户号 |
分账账户号 | divAcctId | 变长9位String | 必须 | div_detail参数下的二级参数 分账账户号 |
分账金额 | divAmt | 变长14位String | 必须 | div_detail参数下的二级参数 分账金额,保留两位小数 |
是否冻结标志 | divFreezeFg | 定长2位String | 必须 | div_detail参数下的二级参数 冻结标志 01:冻结; 00:不冻结 |
注:如果支付时不需要分账给多个人的话,就不要传分账账户串,直接传入账客户号和入账账户号
同步返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
应答返回码 | resp_code | 定长6位String | 必须 | 218002–调用成功,其他见返回码 |
应答返回描述 | resp_desc | 变长String | 必须 | 返回码的对应中文描述 |
银行返回码 | bg_bank_code | 变长32位String | 可选 | |
银行返回描述 | bg_bank_message | 变长200位String | 可选 | |
本平台交易唯一标识号 | platform_seq_id | 定长18位String | 必须 | 组成规则:8位本平台日期+ 10位系统流水号 |
支付地址 | pay_url | 变长64位String | 可选 | 微信扫码、支付宝扫码、银联扫码交易可通过该url自行生成二维码进行扫码支付 |
支付宝统一下单时,在支付宝浏览器下直接用此链接请求支付宝支付 | ||||
动态口令 | token_id | 变长64位String | 可选 | 微信公众号参数 根据token_id组装如下url地址,在微信下可直接唤起支付 https://pay.swiftpass.cn/pay/jspay?token_id=9a0610bc519e782e6275e8c7dd94a445&showwxtitle=1 |
支付信息 | pay_info | 变长String | 可选 | 微信公众号支付时,可通过该参数调微信公众号接口,详看下方 微信公众号开发示例 ,数据格式为: {“appId”:”wx1f87d44db95cba7a”,”timeStamp”:”1514459875237”,”status”:”0”,”signType”:”RSA”,”package”:”prepay_id=wx20171228191755dff683fea20032942684”,”callback_url”:”https://www.baidu.com”,”nonceStr”:”1514459875237”,”paySign”:”5DEE76A6C0CB7BE924BDB11945D591CA”},注:使用pay_info里的调微信公众号时,任何一个参数都不要改,就用返回的参数去调微信公众号 |
微信APP支付时,可通过该参数调微信app接口,详看下方 微信APP支付商户端开发示例 ,数据格式为: {“sign”:”F21465FEAE87F4C02E639D846B2CFCC2”,”timestamp”:”1504863344”,”noncestr”:”1504863344725”,”partnerid”:”12723495”,”prepayid”:”wx20170908173544b0662982990254372413”,”package”:”Sign=WXPay”,”appid”:”324125”} ,注:使用pay_info里的调微信app支付时,任何一个参数都不要改,就用返回的参数去调微信app支付 | ||||
订单日期 | order_date | 定长8位String | 必须 | 格式为YYYYMMDD,例如:20160307 |
订单号 | order_id | 变长20位String | 必须 | 由商户生成,必须保证唯一, 20位内的字母或数字组合 |
手续费金额 | fee_amt | 变长14位String | 可选 | 手续费金额,格式为###.00 |
手续费扣款客户号 | fee_cust_id | 定长16位String | 可选 | 手续费扣款客户号 |
手续费子账户号 | fee_acct_id | 变长9位String | 可选 | 手续费扣款子账户号 |
内外扣标志 | fee_flag | 定长1位String | 可选 | 0 : 内扣; 1 : 外扣 |
异步返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 218 |
应答返回码 | resp_code | 定长6位String | 必须 | 218000—交易成功,其他见返回码 |
应答返回描述 | resp_desc | 变长String | 必须 | 返回码的对应中文描述 |
银行返回码 | bg_bank_code | 变长32位String | 可选 | |
银行返回描述 | bg_bank_message | 变长200位String | 可选 | |
本平台交易唯一标识号 | platform_seq_id | 定长18位String | 必须 | 组成规则:8位本平台日期+ 10位系统流水号 |
支付地址 | pay_url | 变长64位String | 可选 | |
动态口令 | token_id | 变长64位String | 可选 | |
支付信息 | pay_info | 变长String | 可选 | |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16位String | 可选 | 付款客户号 |
订单日期 | order_date | 定长8位String | 必须 | 格式为YYYYMMDD,例如:20160307 |
订单号 | order_id | 变长20位String | 必须 | 由商户生成,必须保证唯一, 20位内的字母或数字组合 |
支付类型 | pay_type | 定长2位String | 必须 | 04:微信正扫 05:支付宝正扫 10: 微信APP支付 12:支付宝统一下单 13:微信公众号 |
交易金额 | trans_amt | 变长14位String | 必须 | 金额格式是###.00 |
入账客户号 | in_cust_id | 定长16位String | 可选 | (入账客户号、入账账户号) 和 分账账户串必填一项 |
入账账户号 | in_acct_id | 变长9位String | 可选 | |
分账账户串 | div_detail | 变长String | 可选 | (入账客户号、入账账户号) 和 分账账户串必填一项; |
是否原生态 | is_raw | 定长1位String | 可选 | 微信公众号支付时的参数 是否原生态 是:1 否:0 注:为空时,默认1 |
APPID | app_id | 变长32位String | 可选 | 商户在微信的APPID |
买家用户ID | buyer_id | 变长100位String | 可选 | |
商品描述 | goods_desc | 变长127位String | 必须 | |
商品类型 | goods_type | 定长4位String | 可选 | |
附加信可选息 | attach_info | 变长128位String | 可选 | 微信公众号支付的参数 |
商品标记 | good_tag | 变长32位String | 可选 | 微信公众号支付的参数 商品标记,优惠标志等 |
设备号 | device_info | 变长32位String | 可选 | |
IP地址 | ip_addr | 变长20位String | 可选 | |
经纬度 | location_val | 变长30位String | 可选 | |
外部订单流水号 | out_trans_id | 变长64位String | 可选 | 外部订单流水号,指支付宝、微信、银联流水号 |
支付返回地址 | ret_url | 变长128位的String | 可选 | 微信公众号支付时,必须输入 用于微信支付成功后跳转的页面 支付宝统一下单时,必须输入 |
商户后台应答地址 | bg_ret_url | 变长128位的String | 必须 | 通过后台异步通知商户开户结果 注意: 1) 使用时不要包含中文 2) 必须是外网地址 |
商户私有域 | mer_priv | 变长120位的String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位的String | 可选 | 用于扩展请求参数 |
手续费金额 | fee_amt | 变长14位String | 可选 | 手续费金额,格式为###.00 |
手续费扣款客户号 | fee_cust_id | 定长16位String | 可选 | 手续费扣款客户号 |
手续费子账户号 | fee_acct_id | 变长9位String | 可选 | 手续费扣款子账户号 |
内外扣标志 | fee_flag | 定长1位String | 可选 | 0 : 内扣; 1 : 外扣 |
微信 APP 支付商户端开发示例¶
ios调起支付主要方法:
java
//注册APPID:
//商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:
[WXApi registerApp:\\@"wxd930ea5d5a258f4f"
withDescription:\\@"demo 2.0"];
//唤起微信APP:
PayReq \*request = [[[PayReq alloc] init] autorelease];
request.partnerId = \\@"10000100";
request.prepayId= \\@"1101000000140415649af9fc314aa427";
request.package = \\@"Sign=WXPay";
request.nonceStr= \\@"a462b76e7436e98e0ed6e13c64b4fd1c";
request.timeStamp= \\@"1397527777";
request.sign= \\@"582282D72DD2B03AD892830965F428CB16E7A256";
[WXApi sendReq:request];
Android调起支付主要方法:
java
//注册APPID:
//商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 将该app注册到微信
msgApi.registerApp("wxd930ea5d5a258f4f");
//唤起微信APP:
IWXAPI api;
PayReq request = new PayReq();
request.appId = "wxd930ea5d5a258f4f";
request.partnerId = "1900000109";
request.prepayId= "1101000000140415649af9fc314aa427",;
request.packageValue = "Sign=WXPay";
request.nonceStr= "1101000000140429eb40476f8896f4c9";
request.timeStamp= "1398746574";
request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";
api.sendReq(request);
注:以上参数值来源于同步返回参数pay_info中
微信公众号开发示例¶
公众号原生态js支付接口(推荐使用)
- 使用示例
需要注意: 所有传入参数都是字符串类型! 使用 JavaScript、 PHP等弱类型语言需要关注一下。示例代码如下:
java
WeixinJSBridge.invoke('getBrandWCPayRequest',{
"appId" : "wx2421b1c4370ec43b", //公众号名称, 由商户传入
"timeStamp":" 1395712654", //时间戳, 自 1970 年以来的秒数
"nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串
"package" : "prepay\_id=u802345jgfjsdfgsdg888",
"signType" : "MD5", //微信签名方式:
"paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
},function(res){
if(res.err\_msg == "get\_brand\_wcpay\_request:ok" ) {}
// 使用以上方式判断前端返回,微信团队郑重提示: res.err\_msg将在用户支付成功后返回 ok, 但并不保证它绝对可靠。
});
如有疑惑请参照 微信官网公众号支付
交互模式
请求: 后台请求交互模式 返回结果+通知: 后台请求交互模式+后台通知交互模式
请求参数
字段名 | 变量名 | 必填 | 类型 | 说明 |
---|---|---|---|---|
公众号 id | appId | 是 | String | 对应接口3.3中返回的payInfo信息 |
时间戳 | timeStamp | 是 | String | 对应接口3.3中返回的payInfo信息 |
随机字符串 | nonceStr | 是 | String | |
订单详情扩展字符串 | Package | 是 | String | 对应接口3.3中返回的payInfo信息 |
签名方式 | signType | 是 | String | 对应接口3.3中返回的payInfo信息 |
签名 | paySign | 是 | String | 对应接口3.3中返回的payInfo信息 |
- 返回结果:
返回值 | 说明 |
---|---|
err_msg | get_brand_wcpay_request:ok 支付成功 |
get_brand_wcpay_request:cancel 支付过程中用户取消 | |
get_brand_wcpay_request:fail 支付失败 |
注:JS API 的返回结果 get_brand_wcpay_request:ok仅在用户成功完成支付时返回。由于前端交互复杂,get_brand_wcpay_request:cancel 或者get_brand_wcpay_request:fail 可以统一处理为用户遇到错误或者主动放弃, 不必细化区分。
获取当前微信版本号
由于微信 5.0 版本后才加入微信支付模块,低版本用户调用微信支付功能将无效。 因此,建议商户通过 user agent 来确定用户当前的版本号后再调用支付接口。 以 iPhone 版本为例,可以通过 user agent 可获取如下微信版本示例信息:
"Mozilla/5.0(iphone;CPU iphone OS 5\_1\_1 like Mac OS X)
AppleWebKit/534.46(KHTML,likeGeocko) Mobile/9B206 MicroMessenger/5.0"
公众号非原生支付
接口功能
初始化 JSAPI 请求, 通过生成 token_id 来进行交互验证。 如调用时是用的原生态 js 支付, 此接口可以忽略
交互模式
请求: 后台请求交互模式
返回结果+通知: 后台请求交互模式+后台通知交互模式
显示微信安全支付标题
对于商户具有支付权限且需要调用微信支付的页面,为了让用户增加购买信心,确认交易环境安全, 微信强烈建议商户使用“微信安全支付” 标题。安全支付标题的如下图。

显示支付安全标题, 需将原始链接添加上”showwxpaytitle=1”的尾串。
通过这种方式,商户的页面将出现微信安全支付的标识。 例如,原始 URL 为:htp://weixin.qq.com 显示安全支付标题的 URL 为:htp://weixin.qq.com?showwxpaytitle=1。
当用户在微信里打开 http://weixin.qq.com 不会直接出现微信安全支付的标题,而打开htp://weixin.qq.com?showwxpaytitle=1 后将出现微信安全支付标题。
请求参数
请求 url: https://pay.swiftpass.cn/pay/jspay
请求参数为 http queryString, 即: https://pay.swiftpass.cn/pay/jspay?token_id=xxx
如 https://pay.swiftpass.cn/pay/jspay?token_id=9a0610bc519e782e6275e8c7dd94a445&showwxtitle=1
在服务号中点击这个链接就可调起支付(用户点击页面中的微信支付按钮时实际上就是点击的这个链接,此种方式无需配置支付授权目录,也不用像原生态 jsapi 支付那样获取那些参数后续的操作, 测试时可以将组装好的这个链接放到手机微信端文件传输助手点击调起支付界面)
序号 | 字段 | 说明 | 必填 | 备注 |
---|---|---|---|---|
业务参数 | ||||
1 | token_id | VARCHAR(64) | 是 | 动态口令 |
2 | showwxpaytitle | CHAR(1) | 是 | 取值 1 或 0, 请填写: 1, 用于页面显示微信 安全支付 |
返回码¶
返回码 | 返回描述 |
218000 | 交易成功 |
218002 | 请求已受理 |
218003 | 交易失败 |
218004 | 交易关闭 |
218098 | 系统超时 |
218099 | 系统异常 |
218100 | 请求参数非法 |
218101 | 商户无此接口权限 |
218102 | 验证签名失败 |
218103 | 商户状态异常 |
218104 | 用户状态异常 |
218107 | 消息类型与签名内容不一致 |
218108 | 商户客户号与签名内容不一致 |
218109 | 版本号与签名内容不一致 |
218110 | 商户号不存在 |
218104 | 用户状态异常 |
218331 | 微信APP和支付宝APP支付时,APPID不能为空 |
218332 | 支付宝统一下单时,买家用户ID不能为空 |
218232 | 出账用户状态异常 |
218228 | (入账客户号、入账账户号)与分账串信息必须输入一项 |
218230 | 入账客户号和入账账户号必须同时输入 |
218231 | 入账用户状态异常 |
218229 | (入账客户号、入账账户号)与分账串信息不可同时输入 |
218112 | 账号不存在 |
218114 | 入账账户类型错误 |
218727 | 分账信息异常 |
218721 | 分账串内容不能超过五个 |
218722 | 分账串部分字段为空 |
218723 | 分账串金额格式错误 |
218728 | 分账串账户信息格式错误 |
218729 | 分账串账户异常 |
218726 | 分账信息账户状态异常 |
218725 | 分账信息用户状态异常 |
218741 | 分账串内容重复 |
218732 | 分账串客户号信息格式错误 |
218724 | 分账串累计金额不等于订单金额 |
218330 | 商户没有入驻 |
218202 | 交易订单号重复 |
218204 | 商户配置异常 |
218303 | 商户支付基础信息未配置 |
218321 | 支付手续费未配置 |
218323 | 支付手续费只能向商户收取 |
218314 | 支付手续费账户状态不正常 |
218215 | 请补录身份信息 |
218804 | 商户超限额或限次 |
218805 | 商户未开通该功能权限 |
218806 | 商户交易限制 |
218746 | 支付成功,分账失败 |
218341 | 订单已关闭 |
218342 | 已支付成功 |
218343 | 已支付失败 |
218344 | 订单信息不匹配 |
218345 | 未获取二维码链接 |
218346 | 未获取支付信息 |
代码示例¶
java
String valueObj = "{"version":"10","cmd_id":"218","mer_cust_id":"6666000000217291",
"user_cust_id":"","order_date":"20170921","order_id":"210014670","pay_type":"13",
"trans_amt":"0.02","div_detail":"[
{'divCustId':'6666000000307920','divAcctId':'310545','divAmt':'0.01','divFreezeFg':'00'},
{'divCustId':'6666000000217291','divAcctId':'219871','divAmt':'0.01','divFreezeFg':'00'}]",
"in_cust_id":"","in_acct_id":"","app_id":"000","is_raw":"1","buyer_logon_id":"quxiangzhen@21cn.com",
"buyer_id":"000","goods_desc":"商品描述","goods_type":"5812","attch_info":"attch_info",
"good_tag":"good_tag","device_info":"device_info","ip_addr":"ip_addr","location_val":"location_val",
"order_expire_time":"","ret_url":"https://www.baidu.com/index.php?tn=monline_3_dg",
"bg_ret_url":"http://192.168.0.74:8001/npayCallBack/asyncHandle.json","mer_priv":"","extension":""
}";
String testUrl = "http://192.168.3.170:8083/npay/merchantRequest";
String checkValue = sign(valueObj);
String cmdId = "218";
String merCustId = "6666000000026086";
String version = "10";
String contentType = "application/x-www-form-urlencoded";
String charset = "UTF-8";
String postStr = "cmd_id=" + cmdId + "&version=" + version + "&mer_cust_id=" + merCustId + "&check_value=" + checkValue;
jodd.http.HttpRequest httpRequest = jodd.http.HttpRequest.post(testUrl).charset(charset);
jodd.http.HttpResponse httpResponse = httpRequest.contentType(contentType).body(postStr).send();
String body = httpResponse.bodyText();
String resultObj = parseResult(body);//解密
成功响应:
200
{
"cmd_id": "218",
"resp_code": "218000",
"resp_desc": "交易成功",
"mer_cust_id" : "6666000000026086",
"order_date": "20180327",
"order_id": "10000000001",
.......
}
失败响应:
200
{
"cmd_id": "218",
"resp_code": "218099",
"resp_desc": "交易失败",
"mer_cust_id" : "6666000000026086",
"order_date": "20180327",
"order_id": "10000000001",
.......
}
219 H5 收银台¶
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本号 | version | 定长2位String | 必须 | 目前固定为10 |
消息类型 | cmd_id | 定长3位String | 必须 | 219 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16位String | 可选 | 付款客户号 |
订单日期 | order_date | 定长8位String | 必须 | 格式为YYYYMMDD,例如:20160307 |
订单号 | order_id | 变长20位String | 必须 | 由商户生成,必须保证唯一, 20位内的字母或数字组合 |
交易金额 | trans_amt | 变长14位String | 必须 | 金额格式是###.00 |
入账客户号 | in_cust_id | 定长16位String | 可选 | (入账客户号、入账账户号) 和 分账串必填一项,且只能填一项 |
入账账户号 | in_acct_id | 变长9位String | 可选 | |
分账串 | div_detail | 变长String | 可选 | (入账客户号、入账账户号) 和 分账串必填一项,且只能填一项; 分账串定义可参照下表; |
商品描述 | goods_desc | 变长127位String | 必须 | |
商品类型 | goods_type | 定长4位String | 可选 | |
页面返回URL | ret_url | 变长128位的String | 可选 | 用于支付完成跳转的结果页面 |
商户后台应答地址 | bg_ret_url | 变长128位的String | 必须 | 通过后台异步通知商户开户结果 注意: 1) 使用时不要包含中文 2) 必须是外网地址 |
商户私有域 | mer_priv | 变长120位的String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | Extension | 变长512位的String | 可选 | 用于扩展请求参数 |
网站名字 | app_name | 变长64位String | 必须(微信H5支付)其他可选 | APP:app的名字WAP:网站名字 |
应用唯一标识 | appInfo_id | 变长64位String | 必须(微信H5支付)其他可选 | 苹果APP:IOS应用唯一标识 安卓APP:APP包名WAP:网站首页URL,须保证公网能正常访问到 |
扫码设备号 | device_info | 变长32位String | 必须(微信H5支付)其他可选 | 苹果APP:1 安卓APP:2 IOS手机网站: 3 ANDROID手机网站:4 |
设备IP地址 | ip_addr | 变长20位的String | 可选 | 微信必传 |
设备信息 | dev_info_json | 变长1024位的String | 必须 | 参见 设备静态信息 。 |
分账账户串(div_detail )内容:
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
分账客户号 | divCustId | 变长16位String | 必须 | div_detail参数下的二级参数 分账客户号 |
分账账户号 | divAcctId | 变长9位String | 必须 | div_detail参数下的二级参数 分账账户号 |
分账金额 | divAmt | 变长14位String | 必须 | div_detail参数下的二级参数 分账金额,保留两位小数 |
是否冻结标志 | divFreezeFg | 定长2位String | 必须 | div_detail参数下的二级参数 冻结标志 01:冻结; 00:不冻结 |
注:如果支付时不需要分账给多个人的话,就不要传分账账户串,直接传入账客户号和入账账户号
同步返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 219、208、218 如果用户在收银台页面选择了快捷支付,则返回的cmdId是208; 如果用户选择了微信支付,则返回的cmdId是218 |
应答返回码 | resp_code | 定长6位String | 必须 | 208002、218002–处理中,其他见返回码 |
应答返回描述 | resp_desc | 变长String | 必须 | 返回码的对应中文描述 |
本平台交易唯一标识号 | platform_seq_id | 定长18位String | 必须 | 组成规则:8位本平台日期+ 10位系统流水号 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 商户的唯一标识 |
订单日期 | order_date | 定长8位String | 必须 | 格式为YYYYMMDD,例如:20160307 |
订单号 | order_id | 变长20位String | 必须 | 由商户生成,必须保证唯一, 20位内的字母或数字组合 |
用户客户号 | user_cust_id | 定长16位String | 可选 | 付款人汇付客户号; 快捷支付时,如果用户未在汇付开过户的话,会自动开户,并返回当前付款人在汇付的客户号 |
动态口令 | token_id | 变长64位String | 可选 | 动态口令, 用于后续接口调用中使用(微信支付时的返回参数) |
支付信息 | pay_info | 变长String | 可选 | json格式字符串,作用于原生态 js 支付时的参数; (微信支付时的返回参数) |
开户银行代号 | bank_id | 变长8位String | 必须 | 付款人快捷支付时的银行卡所属银行代号(快捷支付时的返回参数) |
银行卡号 | card_no | 变长32位String | 必须 | 付款人快捷支付时的银行卡掩码 (快捷支付时的返回参数) |
绑定银行卡ID | bind_card_id | 变长20位String | 必须 | 付款人快捷支付时的快捷绑卡的ID (快捷支付时的返回参数) |
借贷标记 | dc_flag | 定长1位String | (快捷支付时的返回参数) |
异步返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 208、218 如果用户在收银台页面选择了快捷支付,则返回的cmdId是208; 如果用户选择了微信支付,则返回的cmdId是218 |
应答返回码 | resp_code | 定长6位String | 必须 | 208000、218000—交易成功,其他见返回码 |
应答返回描述 | resp_desc | 变长String | 必须 | 返回码的对应中文描述 |
本平台交易唯一标识号 | platform_seq_id | 定长18位String | 必须 | 组成规则:8位本平台日期+10位系统流水号 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16位String | 可选 | 付款客户号 |
订单日期 | order_date | 定长8位String | 必须 | 格式为YYYYMMDD,例如:20160307 |
订单号 | order_id | 变长20位String | 必须 | 由商户生成,必须保证唯一,20位内的字母或数字组合 |
交易金额 | trans_amt | 变长14位String | 必须 | 金额格式是###.00 |
开户银行代号 | bank_id | 变长8位String | 必须 | 具体见附件:开户银行代号 (快捷支付时的返回参数) |
银行卡号 | card_no | 变长32位String | 必须 | 返回银行卡号掩码 (快捷支付时的返回参数) |
绑定银行卡ID | bind_card_id | 变长20位String | 必须 | 本次快捷绑卡的ID (快捷支付时的返回参数) |
借贷标记 | dc_flag | 定长1位String | 必须 | 0–借记,储蓄卡 1–贷记,信用卡 (快捷支付时的返回参数) |
是否原生态 | is_raw | 定长1位String | 可选 | (微信支付时的返回参数) |
动态口令 | token_id | 变长64位String | 可选 | (微信支付时的返回参数) |
支付信息 | pay_info | 变长String | 可选 | (微信支付时的返回参数) |
买家用户ID | buyer_id | 变长100位String | 可选 | (微信支付时的返回参数) |
商品描述 | goods_desc | 变长127位String | 必须 | (微信支付时的返回参数) |
商品类型 | goods_type | 定长4位String | 可选 | (微信支付时的返回参数) |
附加信可选息 | attach_info | 变长128位String | 可选 | (微信支付时的返回参数) |
入账客户号 | in_cust_id | 定长16位String | 可选 | |
入账账户号 | in_acct_id | 变长9位String | 可选 | |
分账账户串 | div_detail | 变长String | 可选 | |
支付返回地址 | ret_url | 变长128位的String | 可选 | |
商户后台应答地址 | bg_ret_url | 变长128位的String | 必须 | 通过后台异步通知商户开户结果 注意:1) 使用时不要包含中文 2) 必须是外网地址 |
商户私有域 | mer_priv | 变长120位的String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | Extension | 变长512位的String | 可选 | 用于扩展请求参数 |
返回码¶
返回码 | 返回描述 |
208000 | 支付成功 |
208001 | 支付请求受理中 |
208099 | 系统异常 |
218000 | 交易成功 |
218002 | 请求已受理 |
218003 | 交易失败 |
218099 | 系统异常 |
219003 | 交易失败 |
219099 | 系统异常 |
219100 | 请求参数非法 |
219101 | 商户无此接口权限 |
219102 | 验证签名失败 |
219110 | 商户号不存在 |
219103 | 商户状态异常 |
219201 | 页面数据被篡改 |
219202 | 交易订单号重复 |
219232 | 出账用户状态异常 |
219228 | (入账客户号、入账账户号)与分账串信息必须输入一项 |
219230 | 入账客户号和入账账户号必须同时输入 |
219231 | 入账用户状态异常 |
219229 | (入账客户号、入账账户号)与分账串信息不可同时输入 |
219112 | 账号不存在 |
219114 | 入账账户类型错误 |
219727 | 分账信息异常 |
219721 | 分账串内容不能超过五个 |
219722 | 分账串部分字段为空 |
219723 | 分账串金额格式错误 |
219728 | 分账串账户信息格式错误 |
219729 | 分账串账户异常 |
219726 | 分账信息账户状态异常 |
219725 | 分账信息用户状态异常 |
219741 | 分账串内容重复 |
219732 | 分账串客户号信息格式错误 |
219724 | 分账串累计金额不等于订单金额 |
219321 | 操作超时,请重试 |
219747 | 商户收银台未配置 |
219335 | 信息被篡改 |
218332 | 买家用户ID不能为空 |
218334 | 支付返回地址不能为空 |
218232 | 出账用户状态异常 |
218228 | (入账客户号、入账账户号)与分账串信息必须输入一项 |
218230 | 入账客户号和入账账户号必须同时输入 |
218231 | 入账用户状态异常 |
218229 | (入账客户号、入账账户号)与分账串信息不可同时输入 |
218112 | 账号不存在 |
218114 | 入账账户类型错误 |
218727 | 分账信息异常 |
218721 | 分账串内容不能超过五个 |
218722 | 分账串部分字段为空 |
218723 | 分账串金额格式错误 |
218728 | 分账串账户信息格式错误 |
218729 | 分账串账户异常 |
218726 | 分账信息账户状态异常 |
218725 | 分账信息用户状态异常 |
218741 | 分账串内容重复 |
218732 | 分账串客户号信息格式错误 |
218724 | 分账串累计金额不等于订单金额 |
218330 | 商户没有入驻 |
218303 | 商户支付基础信息未配置 |
218321 | 支付手续费未配置 |
218323 | 支付手续费只能向商户收取 |
218314 | 支付手续费账户状态不正常 |
218110 | 商户号不存在 |
218201 | 页面数据被篡改 |
218321 | 操作超时,请重试 |
218746 | 支付成功,分账失败 |
208201 | 页面数据被篡改 |
208202 | 交易订单号重复 |
208203 | 账户可用余额不足 |
208204 | 商户配置异常 |
208205 | 短信验证码验证失败 |
208206 | 短信验证码发送手机号与验证手机号不一致 |
208208 | 短信验证码已失效请重新获取 |
208211 | 短信验证码发送失败 |
208214 | 查询出现异常 |
208215 | 请补录身份信息 |
208216 | 短信验证码发送过于频繁或单日发送次数超限 |
208301 | 只有个人用户和个体户能快捷支付 |
208302 | 商户支付基础信息未配置 |
208303 | 支付手续费账户状态不正常 |
208304 | 支付手续费未配置 |
208306 | 身份证实名验证错误 |
208307 | 银行卡信息与上次绑卡信息不一致,请解绑后再提交绑卡 |
208308 | 个人用户信息校验失败 |
208309 | 开户手续费收取失败 |
208310 | 该笔交易已结束 |
208311 | 无任何银行信息 |
208314 | 验证码发送失败 |
208315 | 验证码发送成功 |
208317 | 用户有快捷卡正在绑定中,请勿重复绑卡 |
208319 | 验证码发送中 |
208320 | 银行卡解绑失败 |
208321 | 操作超时,请重试 |
208322 | 省份地区信息非法 |
208324 | 银行卡信息验证失败 |
208325 | 银行卡号与银行、卡类型信息不匹配 |
208721 | 分账串内容不能超过五个 |
208722 | 分账串部分字段为空 |
208723 | 分账串金额格式错误 |
208724 | 分账串累计金额不等于订单金额 |
208725 | 分账信息用户状态异常 |
208726 | 分账信息账户状态异常 |
208727 | 分账信息异常 |
208728 | 分账串账户信息格式错误 |
208729 | 分账串账户异常 |
208732 | 分账串客户号信息格式错误 |
208739 | 快捷支付短信发送异常 |
208741 | 分账串内容重复 |
208742 | 快捷支付成功,分账失败 |
208743 | 请获取验证码 |
代码示例¶
java
String valueObj = "{
"version": "10",
"cmd_id": "219",
"mer_cust_id": "6666000000002619",
"user_cust_id": "6666000000005942",
"order_id": "201710268889",
"order_date": "20171027",
"trans_amt": "0.02",
"in_cust_id": "",
"in_acct_id": "",
"div_detail": "[{'divCustId':'6666000000002619','divAcctId':'2744','divAmt':'0.01','divFreezeFg':'00'},{'divCustId':'6666000000007485','divAcctId':'7791','divAmt':'0.01','divFreezeFg':'00'}]",
"goods_desc": "商品描述",
"goods_type": "5812",
"order_expire_time": "000",
"ret_url": "https://www.baidu.com/",
"bg_ret_url": "http://192.168.0.74:8001/npayCallBack/asyncHandle.json"
}";
String testUrl = "http://192.168.3.170:8083/npay/merchantRequest";
String checkValue = sign(valueObj);
String cmdId = "219";
String merCustId = "6666000000026086";
String version = "10";
httpServletResponse.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
PrintWriter out = httpServletResponse.getWriter();
out.println();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>sender</TITLE></HEAD>");
out.println(" <BODY style=\"display: none\">");
out.println("<form name=\"submitForm\" action=\"" + url + "\" method=\"post\">");
out.println("<input type=\"hidden\" name=\"cmd_id\" value=\"" + cmd_id + "\"/>");
out.println("<input type=\"hidden\" name=\"version\" value=\"" + version + "\"/>");
out.println("<input type=\"hidden\" name=\"mer_cust_id\" value=\"" + merCustId + "\"/>");
out.println("<input type=\"hidden\" name=\"check_value\" value=\"" + checkValue + "\"/>");
out.println("</from>");
out.println("<script>window.document.submitForm.submit();</script>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
成功响应:
200
{
"cmd_id": "219",
"resp_code": "219000",
"resp_desc": "交易成功",
"mer_cust_id" : "6666000000026086",
"order_date": "20180327",
"order_id": "10000000001",
.......
}
失败响应:
200
{
"cmd_id": "219",
"resp_code": "219099",
"resp_desc": "交易失败",
"mer_cust_id" : "6666000000026086",
"order_date": "20180327",
"order_id": "10000000001",
.......
}
页面展示¶

226 H5 支付¶
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本号 | version | 定长2位String | 必须 | 目前固定为10 |
消息类型 | cmd_id | 定长3位String | 必须 | 固定226 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16位String | 可选 | 付款客户号 |
订单日期 | order_date | 定长8位String | 必须 | 格式为YYYYMMDD,例如:20160307 |
订单号 | order_id | 变长20位String | 必须 | 由商户生成,必须保证唯一, 20位内的字母或数字组合 |
扫码支付类型 | pay_type | 定长2位String | 必须 | 16 : 微信H5 17 : 支付宝H5 |
交易金额 | trans_amt | 变长14位String | 必须 | 金额格式是###.00 |
分账账户串 | div_detail | 变长String | 必须 | 业务类型为支付时必传,分账账户必须是入账客户的账户。详见下表 分账账户串 数据格式: [{‘divCustId’:‘6666000000025350’,’divAcctId’:‘78276’,’divAmt’:‘50.00’,’divFreezeFg’:‘00’},{‘divCustId’:‘6666000000025666’,’divAcctId’:‘78841’,’divAmt’:‘50.00’,’divFreezeFg’:‘01’}] |
商品描述 | goods_desc | 变长127位String | 可选 | |
商品类型 | goods_type | 定长4位String | 可选 | |
商品标记 | good_tag | 变长32位String | 可选 | 商品标记,优惠标志等 |
网站名字 | app_name | 变长64位String | 必须(微信H5支付)其他可选 | APP:app的名字WAP:网站名字 |
应用唯一标识 | appInfo_id | 变长64位String | 必须(微信H5支付)其他可选 | 苹果APP:IOS应用唯一标识 安卓APP:APP包名WAP:网站首页URL,须保证公网能正常访问到 |
扫码设备号 | device_info | 变长32位String | 必须(微信H5支付)其他可选 | 苹果APP:1 安卓APP:2 IOS手机网站: 3 ANDROID手机网站:4 |
商户后台应答地址 | bg_ret_url | 变长128位的String | 必须 | 通过后台异步通知结果 注意: 1) 使用时不要包含中文 2) 必须是外网地址 |
商户私有域 | mer_priv | 变长120位的String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位的String | 可选 | 用于扩展请求参数 |
二级商户号 | secondary_mer_id | 定长10位的String | 可选 | 对于开启二级商户模式的商户,必须输入其配下的二级商户号 |
设备IP地址 | ip_addr | 变长20位的String | 可选 | 微信必传 |
设备信息 | dev_info_json | 变长1024位的String | 必须 | 参见 设备静态信息 。 |
分账账户串(div_detail )内容:
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
分账客户号 | divCustId | 变长16位String | 必须 | div_detail参数下的二级参数 分账客户号 |
分账账户号 | divAcctId | 变长9位String | 必须 | div_detail参数下的二级参数 分账账户号 |
分账金额 | divAmt | 变长14位String | 必须 | div_detail参数下的二级参数 分账金额,保留两位小数 |
是否冻结标志 | divFreezeFg | 定长2位String | 必须 | div_detail参数下的二级参数 冻结标志 01:冻结; 00:不冻结 |
注:如果支付时不需要分账给多个人的话,就不要传分账账户串,直接传入账客户号和入账账户号
同步返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 226 |
应答返回码 | resp_code | 定长6位String | 必须 | 226000—交易成功 226002—请求受理中 其他见返回码 |
应答返回描述 | resp_desc | 变长String | 必须 | 返回码的对应中文描述 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16位String | 可选 | 付款客户号 |
订单日期 | order_date | 定长8位String | 必须 | 格式为YYYYMMDD,例如:20160307 |
订单号 | order_id | 变长20位String | 必须 | 由商户生成,必须保证唯一, 20位内的字母或数字组合 |
扫码支付类型 | pay_type | 定长2位String | 必须 | 16 : 微信H5 17 : 支付宝H5 |
交易金额 | trans_amt | 变长14位String | 必须 | 金额格式是###.00 |
分账账户串 | div_detail | 变长String | 必须 | 业务类型为支付时必传,分账账户必须是入账客户的账户。详见下表 分账账户串 数据格式: [{‘divCustId’:‘6666000000025350’,’divAcctId’:‘78276’,’divAmt’:‘50.00’,’divFreezeFg’:‘00’},{‘divCustId’:‘6666000000025666’,’divAcctId’:‘78841’,’divAmt’:‘50.00’,’divFreezeFg’:‘01’}] |
商品描述 | goods_desc | 变长127位String | 必须 | |
商品类型 | goods_type | 定长4位String | 可选 | MCC,银联支付时必须 |
支付地址 | pay_url | 变长64位String | 可选 | 用于拉起微信收银台的URL |
操作员 | oper_user_id | 变长32位String | 可选 | |
设备号 | device_info | 变长32位String | 可选 | |
本平台交易唯一标识号 | platform_seq_id | 定长18位String | 必须 | 组成规则:8位本平台日期+ 10位系统流水号 |
商户后台应答地址 | bg_ret_url | 变长128位的String | 必须 | 通过后台异步通知结果 注意: 1) 使用时不要包含中文 2) 必须是外网地址 |
商户私有域 | mer_priv | 变长120位的String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位的String | 可选 | 用于扩展请求参数 |
通道返回码 | bg_channel_code | 变长32位String | 可选 | |
通道返回描述 | bg_channel_msg | 变长200位String | 可选 | |
银行返回码 | bg_bank_code | 变长32位String | 可选 | |
银行返回描述 | bg_bank_message | 变长200位String | 可选 |
返回码¶
H5 支付接口(cmd_id=226) | |
226000 | 交易成功 |
226002 | 请求已受理 |
226003 | 交易失败 |
226099 | 系统异常 |
226100 | 请求参数非法 |
226101 | 商户无此接口权限 |
226102 | 验证签名失败 |
226103 | 商户状态异常 |
226104 | 用户状态异常 |
226107 | 消息类型与签名内容不一致 |
226108 | 商户客户号与签名内容不一致 |
226109 | 版本号与签名内容不一致 |
226110 | 商户号不存在 |
226721 | 分账串内容不能超过五个 |
226727 | 分账信息异常 |
226204 | 商户配置异常 |
226748 | 二级商户号不存在 |
226749 | 二级商户号状态异常 |
226202 | 交易订单号重复 |
代码示例¶
java
String valueObj = "{
"version": "10",
"cmd_id": "226",
"mer_cust_id": "6666000000037133",
"user_cust_id": "",
"order_id": "2018041300095",
"order_date": "20180419",
"pay_type": "16",
"trans_amt": "0.01",
"div_detail": "[{'divCustId':'6666000000037137','divAcctId':'92127','divAmt':'0.01','divFreezeFg':'00'}]",
"goods_desc": "1",
"good_tag": "",
"app_name": "111",
"appinfo_id": "idids00000",
"goods_type": "1222",
"oper_user_id": "test_oper_user_id",
"device_info": "1",
"bg_ret_url": "http://192.168.0.74:8001/npayCallBack/asyncHandle.json",
"mer_priv": "tess",
"secondary_mer_id": "NP09050001"
}";
String testUrl = "http://192.168.3.170:8083/npay/merchantRequest";
String checkValue = sign(valueObj);
String cmdId = "226";
String merCustId = "6666000000026086";
String version = "10";
String contentType = "application/x-www-form-urlencoded";
String charset = "UTF-8";
String postStr = "cmd_id=" + cmdId + "&version=" + version + "&mer_cust_id=" + merCustId + "&check_value=" + checkValue;
jodd.http.HttpRequest httpRequest = jodd.http.HttpRequest.post(testUrl).charset(charset);
jodd.http.HttpResponse httpResponse = httpRequest.contentType(contentType).body(postStr).send();
String body = httpResponse.bodyText();
String resultObj = parseResult(body);//解密
成功响应:
200
{
"cmd_id": "226",
"resp_code": "226000",
"resp_desc": "交易成功",
"mer_cust_id" : "6666000000026086",
"order_date": "20180327",
"order_id": "10000000001",
.......
}
失败响应:
200
{
"cmd_id": "226",
"resp_code": "226099",
"resp_desc": "交易失败",
"mer_cust_id" : "6666000000026086",
"order_date": "20180327",
"order_id": "10000000001",
.......
}