接口规则
协议规定
术语 | 描述 |
---|---|
传输方式 | 为保证交易安全性,建议采用 HTTPS 传输 |
提交方式 | 采用 POST 方法提交 |
数据格式 | 提交和返回数据都为 json 格式 |
字符编码 | 统一采用 UTF-8 字符编码 |
签名算法 | MD5 |
签名要求 | 请求和接收数据均需要校验签名,详细方法请参考签名算法 |
判断逻辑 | 先判断协议字段返回,再判断业务返回,最后判断交易状态 |
签名算法
目前支持MD5签名:MD5 是一种摘要生成算法,通过在签名原始串后加上商户通信密钥的内容,进行MD5运算,形成的摘要字符串即为签名结果。为了方便比较,签名结果统一转换为大写字符。
sign签名计算公式:
sign = Md5(原字符串&key=密钥).toUpperCase
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
1、参数名ASCII码从小到大排序(字典序);
2、如果参数的值为空不参与签名;
3、参数名区分大小写;
4、验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验;
5、接口可能增加字段,验证签名时必须支持增加的扩展字段。
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
如: 假设传送的参数如下:
app_id:969037206616276993
merchant_code:1010174934854402049
out_trade_no:
channel:HKB
product:WECHAT_DYNAMIC_SCAN_CODE
client_ip:218.76.8.29
amount:1
body:test
description:test
subject:test
notify_url:http://127.0.0.1/notify/wechat
sign_type:MD5
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
stringA= amount=1&app_id=969037206616276993&body=test&channel=HKB&client_ip=218.76.8.29&description=test&merchant_code=1010174934854402049¬ify_url=http://127.0.0.1/notify/wechat&out_trade_no=1027805986871574528&product=WECHAT_DYNAMIC_SCAN_CODE&sign_type=MD5&subject=test
第二步:拼接API密钥:
stringSignTemp=stringA&key=6C7C97D68C7DB148DE678B4F5827D2F0 sign=MD5(stringSignTemp).toUpperCase()="C3D0BB2D39C1274C89B332F2B5739CA4";
最终得到最终发送的数据:
{
"app_id": "969037206616276993",
"merchant_code": "1010174934854402049",
"out_trade_no": "T120190318111208",
"channel": "HKB",
"client_ip": "218.76.8.29",
"amount": "1",
"subject": "ddddss",
"body": "ddd",
"description": "3333",
"notify_url": "https://pay.91xft.cn/xft_tx/pay/mockmentchantNotify.do",
"sign_type": "MD5",
"product": "WECHAT_DYNAMIC_SCAN_CODE",
"sign": "D48908EBEBC8C1596213A79CDB32E13A",
"extra": "{\"auth_code\":\"134775151965409782\"}"
}