说明
做了微信。支付宝和京东支付之后,发现,最扯蛋的支付,肯定是京东支付,要完整开发京东支付,必须要看完京东支付开发者文档的官网每一个角落,绝对不能凭你的任何经验去猜测有些流程,比如公私钥加解密(不看官网,保证你后悔)、发送请求的方式(form表单提交,看了官网你会发现好怪异),支付同步跳转(还是post,fk),支付成功后返回居然没有支付订单号(完全靠自己去维护,fk)
技术描点
首先要去看官网的:http://payapi.jd.com/。 项目使用的是pc网页支付
一定要仔细的看这些参数的说明
特殊参数说明如下:
1) 在以上的请求参数中,商户号是在注册开通京东支付功能的时候,京东支付商户管理系统为用户分配的。
2) 用户账号是商户系统的用户账号。
3) 交易流水号是用来标识每次支付请求的号码,需要商户保证在每一次支付请求的时候交易流水号唯一,多次请求不能使用同一交易流水号,否则京东支付服务在处理后面的支付请求时,会把此交易当做重复支付处理。
4) 签名规则详见:“接口安全规范-签名算法”;
5) 为保证信息安全,表单中的各个字段除了merchant(商户号)、版本号(version)、签名(sign)以外,其余字段全部采用3DES进行加密。
二. 生成签名
签名过程分为两步,首先是将原始参数按照规则拼接成一个字符串S1,然后再将S1根据签名算法生成签名字符串sign。
参数原始字符串的拼接规则:
1) 对于POST表单提交的参数:所有参数按照参数名的ASCII码顺序从小到大排序(字典序),使用URL键值对的方式拼接成字符串S1,(如:k1=value1&k2=value2&k3=value3…)
2) 对于XML报文交互的参数:将XML报文的各行去掉空格后直接拼接成一行字符串作为S1。如果报文只有一行则直接作为S1,不需要再进行拼接。
生成签名的过程如下:
1) 对拼接的参数字符串S1通过SHA256算法计算摘要,得到字符串S2;
2) 对字符串S2使用私钥证书进行加密,并进行base64转码,得到签名字符串sign; 接收方收到报文后先进行base64解码,再使用公钥证书解密,然后验证签名的合法性。
注意事项:
1) 空参数不参与签名;
2) 参数列表中的sign字段不参与签名;
3) 为了简化处理,标签也参与签名;
4) 参数区分大小写;
5) RSA加密的规则为:由交易发起方进行私钥加密,接收方进行公钥解密;(可以使用RSA公私钥校验工具来校验商户RSA公私钥是否匹配)
6) 系统会对商户公钥证书的有效性进行校验。
签名代码:
def get_sign_str(params, is_compatible=False):
"""
生成签名的字符串
Args:
params: 签名的字典数据
is_compatible: 是否是兼容模式(对字典中value值为空的也签名)
Returns:
返回签名
"""
raw = [(k, params[k]) for k in sorted(params.keys())]
if is_compatible:
order_str = "&".join("=".join(kv) for kv in raw)
else: