概述京东支付接口对接

说明

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空间

  • 新浪微博

  • 人人网

  • 豆瓣

取消