概述京东支付接口对接
说明
github地址
码云地址
做了微信。支付宝和京东支付之后,发现,最扯蛋的支付,肯定是京东支付,要完整开发京东支付,必须要看完京东支付开发者文档的官网每一个角落,绝对不能凭你的任何经验去猜测有些流程,比如公私钥加解密(不看官网,保证你后悔)、发送请求的方式(form表单提交,看了官网你会发现好怪异),支付同步跳转(还是post,fk),支付成功后返回居然没有支付订单号(完全靠自己去维护,fk)
技术描点
首先要去看官网的:http://payapi.jd.com/。 项目使用的是pc网页支付
一. 统一下单的接口:
参数说明:
一定要仔细的看这些参数的说明
特殊参数说明如下:
在以上的请求参数中,商户号是在注册开通京东支付功能的时候,京东支付商户管理系统为用户分配的。
用户账号是商户系统的用户账号。
交易流水号是用来标识每次支付请求的号码,需要商户保证在每一次支付请求的时候交易流水号唯一,多次请求不能使用同一交易流水号,否则京东支付服务在处理后面的支付请求时,会把此交易当做重复支付处理。
签名规则详见:“接口安全规范-签名算法”;
为保证信息安全,表单中的各个字段除了merchant(商户号)、版本号(version)、签名(sign)以外,其余字段全部采用3DES进行加密。
二. 生成签名
签名过程分为两步,首先是将原始参数按照规则拼接成一个字符串S1,然后再将S1根据签名算法生成签名字符串sign。 参数原始字符串的拼接规则:
对于POST表单提交的参数:所有参数按照参数名的ASCII码顺序从小到大排序(字典序),使用URL键值对的方式拼接成字符串S1,(如:k1=value1&k2=value2&k3=value3…)
对于XML报文交互的参数:将XML报文的各行去掉空格后直接拼接成一行字符串作为S1。如果报文只有一行则直接作为S1,不需要再进行拼接。
生成签名的过程如下:
对拼接的参数字符串S1通过SHA256算法计算摘要,得到字符串S2;
对字符串S2使用私钥证书进行加密,并进行base64转码,得到签名字符串sign; 接收方收到报文后先进行base64解码,再使用公钥证书解密,然后验证签名的合法性。
注意事项:
空参数不参与签名;
参数列表中的sign字段不参与签名;
为了简化处理,<xml>标签也参与签名;
参数区分大小写;
RSA加密的规则为:由交易发起方进行私钥加密,接收方进行公钥解密;(可以使用RSA公私钥校验工具来校验商户RSA公私钥是否匹配)
系统会对商户公钥证书的有效性进行校验。
签名代码:
三. DES3对每个参数进行加密(merchant(商户号)、版本号(version)、签名(sign)除外)
为防止明文数据在post表单提交的时候暴露,所以京东做了DES3对字段进行加密(不用表单提交不就行了,还搞这么复杂,真该学学支付宝和微信)
京东DES加密说明如下:
除特定说明外,商户和京东支付接口调用报文采用3DES加密,再通过base64转换为字符串。
3DES加密算法标为DESede,工作模式为电子密码本模式ECB,不填充(DESede/ECB/NoPadding)。
注:服务端NoPadding 为不填充,所以加密的原文字节必须是8的整数倍(如果调用我们提供的加密接口API则不必处理原文字节,加密接口内部已处理)。如果自己实现加密,原文字节不够8的整数倍,则按如下规则转为8的整数倍。
1. 把原文字符串转成字节数组。
2. 根据字节数组长度判断是否需要补位。
补位逻辑为:
int x = (i+ 4) % 8;
int y = (x == 0) ? 0 : (8 - x);
i为字节数组的长度,y为需要补位的长度。
补位值为0。
3. 将有效数据长度byte[]添加到原始byte数组的头部。
i为字节数组的长度。
result[0] = (byte) ((i >> 24) & 0xFF);
result[1] = (byte) ((i >> 16) & 0xFF);
result[2] = (byte) ((i >> 8) & 0xFF);
result[3] = (byte) (i & 0xFF);
4. 原文字节数组前面加上第三步的4个字节,再加上需补位的值。
例如:字符串”1”,转换成字节数组是[49],计算补位y=3, 计算有效数据长度为[0, 0, 0, 1],最后字节数组为[0, 0, 0, 1, 49, 0, 0, 0]。
Form表单接口的加密方式:
如果商户通过表单方式提交支付请求至收银台,为保证信息安全,表单中的各个字段除了merchant(商户号)、verion(版本号)、sign(签名)以外,其余字段全部采用3DES进行加密。
XML请求接口的加密方式:
通过XML接口方式和京东支付服务器交互的请求,应该对报文进行加密,加密方式为对整个报文整体进行3DES加密,再进行base64转码使其变为可读字符串,加密后的密文置于<encrypt></encrypt>标签中,同时再将报文中的<merchant>(商户号)、<version>(版本号)这两个字段单独置于<jdpay>标签下。
接收到京东支付加密报文后的处理方式:
接收到京东支付返回的加密报文后,先判断<jdpay>标签下的<result>标签的返回码,检查接口调用是否正常返回。然后再读取<encrypt>标签的密文内容进行base64解码,再进行3DES解密,解密后的报文即是原始报文。
示例代码:
这样的话,签名和加密都已完成,往后就拼到页面里的form里
怎么组织就自己去实现好了
四. 异步回调
提交之后请求之后,就会跳转到京东的支付页面,可登录账户支付,也可用京东app或者微信扫描支付。
当用户扫码支付之后,京东会主动跳转到你指定的一个网址(在提交支付请求的时候有这个字段),并且会异步post一个请求到指定的一个地址(在提交支付请求的时候有这个字段),同步跳转是在用户扫码支付之后,如果京东支付页面还在的话会跳转。而异步是无论如何都会发支付结果通知的。对于新手来说,一定要知道这个行业潜规则(微信,支付宝or其它都是)。而且一定要以这个异步通知的结果为准。
京东返回的是xml格式的字符串
返回格式如下(没有换行的,我这里演示换了行的):
先要用DES3对encrypt节点里的串进行解密
解密之后就是验证签名是否正确,从上边的串中拿到签名和去除签名之后的字符串
验证通过之后再返回去除sign的xml字符串,并提取出里边的内容(详情参数所代表的含义请看官方文档)
五. 同步跳转
同步跳转就没啥好说了,只是给个跳转地址,但是这里一定要注意,这个的是一个post请求(好像京东啥都喜欢post),而非微信或者支付宝或者other什么的get请求。所以不要设置错了
好了,到这里一个完整的在线支付就完成了。这里还要说明的是,涉及到加密和解密,就一定会有key,有DES3使用的对称加密key,还有签名使用的非对称公钥和私钥。所以一定要配置好。 这里我的源代码里用的都是京东提供的测试商户号,还有一大推京东设置好的key,具体要去下载京东的【京东支付PC&H5接口文档】,在文档的最底部有帐号信息。
demo里边还有申请退款,申请撤单的接口,其实写好一个接口的完成流程,别的流程都是直接套用就可以了。
推荐
-
-
QQ空间
-
新浪微博
-
人人网
-
豆瓣