建行E商贸通支付开发系列之三(2、密钥生成与交换)

前言:在看本篇文章的时候,一定要细心些,因为这个总分的内容非常的重要,对于我接触过的几家公司,都是在这一步耽误的时间最长的。

一、什么是交换密钥

所谓的交换密钥,就又回到了上一篇文章里所提到的商户公钥URL与密钥传输URL了。就是要通过这两个URL地址来实现商户获取建行的密钥与建行获取商户的密钥的过程。

这里多说一句,在交换过密钥以后,一定一定要把这四个密钥给保存成文件,特别是在测试环境与生产环境交换过以后,如果说你把建行的密钥给搞丢了,那还算好,从建行再获取一次就可以了;但是如果你把自己商户的密钥给搞丢了,那只能让建行的操作员再下载一次你的密钥了,因为你再次生成的密钥与银行保留的密钥肯定不一样,如果不让银行下载,那所有的操作都会报错的。虽然说只是一个简单的下载一下,但是银行是要走手续的,这个盖章那个签字的,到操作员那里还要排工单,很麻烦的。

这一部分的内容虽然是重点之一,但是除了编写代码以外,其它的重点也没有什么太多的了,代码这块大家用的语言都不一样,所以就关于下面两个内容,我分享一下我的经验吧。

二、商户生成自己的密钥

关于生成商户的密钥,原理就是通过RSA算法生成出密钥,密钥包含公钥和私钥。

三、商户获取建行的密钥

这个功能再简单不过了,其实就把它理解成点击按钮后,通过不同的参数,下载不同的文件而已,就这么简单。

这个功能不是在程序里一直都要用到的,只要在交换密钥的时候做一次就可以了,所以就写一个功能页,给一个按钮,功能就是用来获取建行的两个密钥,这个页面与平台、建行都没有什么太大的关系,就是当密钥丢的时候,再获取一次就好了。

现在就需要用到上面说的密钥传输URL了,做一个post请求,如果请求成功,建行会返回一个byte的数组;得到数组后,要验证一下长度是否小于6并且前6位是否为0;把前6个0去掉后,就得到了加密的密钥了;下来对密钥进行解密,最后就得到了对应的密钥了。在解密的时候,用DES方法解密。

在请求建行的时候,会要求一个type参数,我这里写就是type=des或type=pub,通过这个来区分要获取公钥还是DES私钥。

四、再谈交换密钥

我们明白了什么是交换密钥、生成自己的密钥、获取了建行的密钥,那么还差一步,就是建行获取商户的公钥。建行获取商户的公钥一定是在测试环境或生产环境中进行的,说白了,就是要与建行的服务器有连通才能进行,通过上面的描述,我们也应该知道建行获取商户公钥的时候是通过建行的一个管理后台进行的,那么,既然我们已经生成了自己的公钥,要怎么提供给建行下载呢?

首先,读取你生成的公钥,用base64转成byte数组,然后DES加密方法对这个字节数组加密,加密方法需要两个参数,第一个参数是byte数组,第二个参数是个key,这个key是一个string,通过文档可以看出,这个key的就是商户代码+年月日的一个字符串(yyMMdd)。

加密后的还是一个byte数组,再把这个加密过后的数组前6位补0,最后,把这个数组的内容以流的形式返回给建行就OK了。

只要代码没有写错,网络是连通的,交换密钥应该是能成功的,祝大家好运。

五、补充

一直有人在问我关于密钥交换、签名与验签、加密与解密的问题,为此我又把以前写的代码给过了一遍,在这里写出来,看看是否能有所帮助。

1、交换密钥

在交换密钥时是没有签名与验签的操作的。

首先先说把自己的公钥给建行,这时我们需要对自己已经生成的公钥进行加密,加密时所用到的方法是DES方法对数据进行加密,需要的参数有2个,一个是公钥的数据,另一个是“商户号+年年月月日日”组成的字符串(没有加号哦)。再下来,把得到的这个byte的数据给扩容,增加6个位置(在数据的前面增加),然后补充6个0在这个数组的前面,最后,把这个数据给返回就好了,最后得到的数据形式为:000000+数据+商户号+年年月月日日,注意,在实际的数据中都没有加号哦。

接下来再说获取建行的两个密钥,一个是建行的公钥,一个是建行提供报文加密用的DES密钥,两个密钥的处理方法都一样,只是在请求建行的时候是通过type=pub或type=des来区分要获取得到哪个密钥。
假设我们已经得到建行返回的一个公钥的数据,接下来就要先验证前6位是否为0,验证成功,就把前6位去掉得到一个不带前6个0的数据,然后还是用DES算法解密,最后把这个解密得到数据保存成文件就OK了。

2、报文的传输

先说商户发送给建行的,当得到报文以后,是要先加密再签名,签名用RSA,加密用TripleDES,这是两个操作,并且这两个操作都是对原报文(明文)进行操作的。加密时用从建行获取的DES密钥,签名时用自己的私钥。

再说建行请求商户的,当商户得到建行的请求报文时,是要先解密再验签,签名用RSA,加密用TripleDES,而验签时的参数一定用通过解密后得到的数据,不能像上面说的还用建行发过来的密文。解密时还是用从建行获取的DES密钥,验签时用建行的公钥。

另,给建行发送请求报文后,建行一定会有一个影响结果的报文,我们也需要对这个影响报文做解密和验签的操作,同理,建行请求商户后也需要有一个商户的响应报文,我们也需要对响应报文做加密和签名的操作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现建设银行聚合支付生成订单接口,可以按照以下步骤进行: 1. 导入建设银行支付接口的开发包。在Java项目中,可以通过使用Maven或Gradle等构建工具,将建设银行支付接口的依赖添加到项目中。 2. 创建一个Java类来处理生成订单的逻辑。可以命名为"CcbPaymentService"或类似的名称。在该类中,可以定义一个方法名为"generateOrder"用于生成订单。 3. 在"generateOrder"方法中,首先要通过建设银行支付接口提供的API,构建生成订单的请求参数。这些参数通常包括商户号、支付金额、订单号、交易描述等。 4. 调用建设银行支付接口的生成订单方法,将构建好的请求参数传递给该方法。可以通过使用Java的网络请求库,如HttpClient或OkHttp,向建设银行支付接口发送POST请求。 5. 接收建设银行支付接口返回的结果,并对结果进行处理。可以通过解析返回的JSON数据,获取生成的订单号或其他相关信息。 6. 返回生成的订单号或其他相关信息给调用方。可以将该信息封装成一个Java对象,方便后续的使用和传递。 7. 在调用方的其他逻辑中,可以使用这个生成的订单号来进行后续的支付流程。 以上是实现建设银行聚合支付生成订单接口的大致步骤。具体的实现细节会根据建设银行支付接口的具体要求而有所不同。在实际开发中,还需要进行异常处理、参数校验、日志记录等工作,以确保代码的健壮性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值