应用侧服务端接入
本页面接口已废弃, 服务端接入参考- 支付通知
订单查询接口
建议:如有主动查单需求,在跳转到公益侧支付前,请求参数中最好带上应用侧的订单号。
链接:https://ssl.gongyi.qq.com/cgi-bin/gywcom_iot_query_trans.fcgi
请求参数列表:
字段 | 类型 | 可选 | 描述 |
---|---|---|---|
transcode | string | 二选一* | 公益测的订单号 |
btr_transcode | string | 二选一* | 应用侧自己的单号 |
bid | number | 必选 | 公益侧提供(商户ID) |
sign | string | 必选* | 签名 |
nonce_str | String(32) | 必选 | 随机字符串,不长于32位。推荐随机数生成算法 |
二选一的意思是这两个参数有其一即可。
sign
参数的生成规则是,除了sign其他字段按字典序,同时尾部加入商户密钥(用 key
来标识)参与md5签名(32位)。
如:bid=100000145&btr_transcode=xxx&nonce_str=xxxxxxxx&key=xxxx
返回参数说明:
字段名 | 说明 | |
---|---|---|
code | 返回状态,(4099 为未查询到该订单) | |
msg | 返回的错误信息 | |
id | 项目 ID | |
money | 金额 | |
uin | qq 号 | |
et | 渠道标签 | |
gt | 组别标识 | |
openid | 微信openid | |
btr_transcode | Bid 自用订单号 | |
transcode | 公益订单号 | |
time | 捐赠时间 | |
type | 乐捐 / 月捐 | |
sign | 签名 | |
third_transcode | 微信订单号 / 手Q订单号 | |
attach | 商户 attach 回包 | |
status | 订单状态:1 => success \ | 0 => notpay |
nickname | 昵称 | |
headimgurl | 头像 |
返回示例:
{
"code": 0,
"msg": "ok",
"op_time": 1510737490,
"data": {
"id": 5888,
"money": 1,
"uin": 0,
"et": "P",
"gt": "66",
"openid": "o1tgX0WcxlZqWPIk7hieTMaEnz_k",
"btr_transcode": "1321652601201711091500014306",
"transcode": "1321652601201711091500014306",
"time": "2017-11-09 23:42:21",
"type": "WXL",
"sign": "E226CCEB99642EDEEA8441A43D77712E",
"third_transcode": "4200000032201711093565112306",
"attach": "xxxxx |xxxxxxxxx|XDDDDDDDD",
"status": 0,
"nickname": "%E9%83%AD%E6%99%93%E6%B3%A2",
"headimgurl": "https%3A%2F%2Fwx%2Eqlogo%2Ecn%2Fmmopen%2Fvi%5F32%2F52eZlEWhZMmUnoIWxKmVvqluW9Fn6Ssx9Usj0WzH7xDlGMdug8wY384licTmpUHtSQaI9aEvuicAx8CLDkyXe0eQ%2F0"
}
}
支付成功回调
对于支付成功的订单,公益后台会发起一次异步的支付回调到预先设置的回调地址:
格式内容为
UTF-8
编码XML
格式的文本,字段类型与 查单接口 保持一致回调失败次数最多允许 5次,时间衰弱为1s, 2s, 3s, 5s, 10s,以便下次继续回调
回调地址要先在公益侧填写好
回调内容示例如下:
<xml> <bid><![CDATA[100000145]]></bid> <!--商户id --> <id><![CDATA[1145]]></id> <!--项目id --> <btr_transcode><![CDATA[12312312789789]]></btr_transcode> <!--商户方的订单好--> <et><![CDATA[def]]></et> <!--入口类型--> <gt><![CDATA[]]></gt> <!--组别标识--> <money><![CDATA[1]]></money> <!--交易金额--> <sign><![CDATA[E226CCEB99642EDEEA8441A43D77712E]]></sign> <!--订单信息签名--> <time><![CDATA[2017-05-12 03:12:53]]></time> <!--账单创建时间--> <status><![CDATA[2]]></states> <!--账单状态--> <attach><![CDATA[2017-05-12 03:12:53]]></attach> <!--attach回包--> <transcode><![CDATA[1201423701201705121500007027]]></transcode> <!--公益平台的订单号--> <third_transcode><![CDATA[12014237016011201705121248951244]]></third_transcode> <!--微信的交易订单号--> </xml>
签名算法
设所有发送或接收到的数据为集合 M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA,特别注意 以下重要规则:
- 参数名ASCII码从小到大排序(字典序)
- 如果参数的值为空不参与签名
- 参数名区分大小写
- 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验
- 接口可能增加字段,验证签名时必须支持增加的扩展字段
在 stringA 最后拼接上 key 得到 stringSignTemp 字符串,并对 stringSignTemp 进行 MD5 运算,再将得到的字符串所有字符转换为大写,得到 sign 值 signValue。如果没有特别需求,默认使用md5加密
假设传送的参数如下:
bid: 10000100 transcode: 1321652601201711091500014306 third_transcode: 1321652601201711091500014306 body: test nonce_str: ibuaiVcKdpRxkhJA
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
stringA="bid=10000100&body=test&transcode=1321652601201711091500014306&third_transcode=1321652601201711091500014306&nonce_str=ibuaiVcKdpRxkhJA"
第二步:拼接API密钥:
// 注:key为应用侧在公益侧设置的密钥key stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" // 注:MD5签名方式 sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" // 注:HMAC-SHA256签名方式 sign=hash_hmac("sha256",stringSignTemp,key).toUpperCase()="6A9AE1657590FD6257D693A078E1C3E4BB6BA4DC30B23E0EE2496E54170DACD6"