用SpringBoot开发工商银行平台公众号及小程序埋名聚合支付(微信小程序支付)

因为项目需求的原因,需要开发小程序支付。采取的支付流程是用工商银行(以下简称工行)的埋名聚合支付(接口)进行小程序支付开发

工行 开发指南业务申请(https://open.icbc.com.cn/icbc/apip/docs_intro.html)

工行 业务规则、开发指南、SDK、API文档(https://open.icbc.com.cn/icbc/apip/docs_index.html)

注意事项:

工行的小程序埋名聚合支付需要用到的几个最最注意的参数,也是要通过向工行申请才能获取到的数据(具体怎么申请,这个我就不多说了,自己去看他们官网流程去,我们讲主要的东西):

1、appid(申请后拥有)

2、mer_id 商户编号(申请后拥有)

3、APIGW_PUBLIC_KEY(对方(即工行)网关公钥:有分测试网关公钥和生产网关公钥,生产网关公钥就是正式的环境公钥)

4、MY_PRIVATE_KEY(我方私钥)

5、MY_PUBLIC_KEY(我方公钥):第4个参数和第5个参数是成对出现的,第5个参数需要上传给工行那边,具体去看流程

具体怎么生成公私钥看:https://open.icbc.com.cn/icbc/apip/docs_sdk&demo.html(不过有人说由工行SDK产生的公私钥对验证后对不上,这是一大坑,可以在这个网站把第4和5个参数验证一下:http://tool.chacuo.net/cryptrsakeyvalid)

在此之前,我建议大家如果对公私钥的概念不清楚的话,先看一下这篇文章(https://blog.csdn.net/jiajia4336/article/details/90695252)。不然对你后续的开发有些阻碍,毕竟这是基础上概念的问题。

以上5个参数是必要用到的。我开发的时候就直接干上正式环境了,反正你不要输入支付密码就没什么损失。

一切都是按着他们开发文档的请求实例一样的,只不过把图中红色区域改成正式生产环境

用SpringBoot开发工商银行平台公众号及小程序埋名聚合支付(微信小程序支付)_第1张图片

用SpringBoot开发工商银行平台公众号及小程序埋名聚合支付(微信小程序支付)_第2张图片

引入工行的SDK:

另一个点就是使用工行的SDK,这里我用的是Java的Spring Boot进行开发的,所以用的是Java的SDK,从工行下载了SDK之后,要导入进Maven的本地仓库中,这样才能在pom.xml中引入包。

-Dfile= masmgc.sdk-0.0.1-SNAPSHOT.jar //你下载的JAR包

-DgroupId= com.masmgc //组织名,pom.xml里引用时用的

-DartifactId= masmgc-sdk  //pom.xml里引用时用的

-Dversion= 0.0.1-SNAPSHOT //pom.xml里引用时用的

-Dpackaging= jar //包的类型

在下载的包所在文件目录地址栏上输入:cmd 运行以下命令(注意jar包的命名,我这边给jar包重命名多加了版本名)

mvn install:install-file -Dfile=icbc-api-sdk-cop-2.0.0.jar -DgroupId=com.icbc -DartifactId=icbc-api-sdk-cop -Dversion=2.0.0 -Dpackaging=jar

 

第一点:这里面有必要跟大家讲一下,示例代码中主要参数的意思

DefaultIcbcClient client = new DefaultIcbcClient(APP_ID, IcbcConstants.SIGN_TYPE_RSA2, MY_PRIVATE_KEY, APIGW_PUBLIC_KEY);

APP_ID:就是我们说的第1个参数appid(申请后拥有)

MY_PRIVATE_KEY:就是我们说的第4个参数MY_PRIVATE_KEY

APIGW_PUBLIC_KEY:就是我们说的第3个参数APIGW_PUBLIC_KEY

紧接着,bizContent对象就是文档中的最长的那个字段说明对象

AggregatePayHidePayRequestV1Biz bizContent = new AggregatePayHidePayRequestV1Biz();

接着就是字段的坑,大家注意一下:其他字段的意思可以查看他们的文档说明。

bizContent.setTpAppId("wx98745182932");//设置小程序的APP_ID,而不是我们说的第一个参数的appid
bizContent.setTpOpenId("0Dmnjuwyhrflaowjeel");//设置微信用户的openId
bizContent.setMerId("020001020461");//设置商户号,就是我们前面说到的第2个参数
bizContent.setGoodsDetail("{'good_name':'芬达橙味300ml罐装','good_id':'1001','good_num':'1'}");//长度不超过128

//OfflinePay-线下支付  OnlinePay-线上支付(此处线上线下我也没搞清,如果调用不通的情况下可以切换测试,不过我是OfflinePay测通的。具体看你们申请时候的业务是什么类型的了)
bizContent.setTranType("OfflinePay");
//支付金额(单位是:分)
bizContent.setOrderAmount("100");

//支付结果通知地址;上送互联网可访问的完整URL地址(必须包含协议);应支持受理同一笔订单的多次通知场景
bizContent.setNotifyUrl("http://*******:80/Back/Test");

这里有个巨坑!:bizContent.setNotifyUrl中,支付回调通知的接口只能是80端口或是443端口。霸道更让人无语。

再次说明:最最主要的就是MY_PRIVATE_KEY(我方私钥)和APIGW_PUBLIC_KEY(对方公钥)

要对的上,且我们上传给他们的我方公钥要和你的私钥是解对得上的,不然就会报错。

 

第二点:另一个就是他们的执行业务代码

try {
  response = client.execute(request, "msgId");//执行发送请求
  if (response.isSuccess()) {
  // 业务成功处理
  String prepayId = response.getPrepayId();
 } else {
  // 失败}
 } catch (IcbcApiException e) {
   e.printStackTrace();
}

这里有一个 response = client.execute(request, "msgId");

其中msgId字段说明是消息号的意思,但是你查看示例代码找不到这个消息号的生成方式。

这里你可以把代码改成:

response = client.execute(request);

因为其实它是一个重构函数,Ctrl点击进去看源码。你只传request一个参数是可以的。msgId就直接帮你生成了

用SpringBoot开发工商银行平台公众号及小程序埋名聚合支付(微信小程序支付)_第3张图片

 

第三点:执行完成后的数据操作

如果请求不成功的话,请查看对应的错误码去解决错误。还有我测试了之后,他们的isSuccess要注意一下

response.isSuccess()) //成不成功 返回的都是 false

return_code=0的时候就是请求成功的意思,预下单成功。此时主要获取 经过BASE64加密后的签名串sign_data

拿到这个数据要对其进行BASE64解密,解密后的数据就是微信支付的所需参数

 

 

第四点:小程序支付参数

用SpringBoot开发工商银行平台公众号及小程序埋名聚合支付(微信小程序支付)_第4张图片

wx.requestPayment({

  timeStamp: res.data.Data.timeStamp,

  nonceStr: res.data.Data.nonceStr,

  package: res.data.Data.packAge,

  signType: res.data.Data.signType,

  paySign: res.data.Data.paySign,

success: function (res) {// success--支付成功},

fail: function (res) {// fail--用户取消支付},

complete: function (res) {// complete,每次都执行}})

微信小程序支付文档:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=5

这里有个坑,微信支付文档所说signType签名类型是以下所说的几种。其实不然

工行的埋名聚合支付二次签名加密方式是RSA方式进行签名的。所以微信小程序支付的signType参数用和解密后的sign_data所获取到的signType一致就可以。其他支付参数sign_data解密之后都有。

 

以上就是我最近开发中遇到的各种问题。

如果小伙伴们有什么问题的话就在下方留言就行了。我看到了会回复你们。

你可能感兴趣的:(工行埋名聚合支付,微信小程序支付,java)