因为公司已经支持了支付宝支付和微信支付,所以需要加上一个银联的云闪付,主要是二维码支付。

银联商务的官方文档其实已经很清楚了,但是因为之前对接支付宝和微信,有一个保存商户信息的表,表结构已经确定了,再更改的话会比较麻烦,但是银联的商户信息和支付宝微信又不太相同,支付宝的签名验签主要依靠公钥和秘钥,微信主要有证书,银联却是证书和公钥,而且银联的不同版本会出现不同的验签,5.1.0需要多个证书,demo里的逻辑是证书保存在本地的文件夹,验签时从本地读取,事实上我们需要的是证书保存在数据库,这样就需要进行部分改造对接,这一期的主要对接版本是5.0.0,就是需要一个证书,一个公钥的版本

就拿下单来说,组装参数调用util的地方基本一样,只是有些值的获取变成了从数据库读取

 Map<String, String> contentData = new HashMap();/***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/contentData.put("version", payAccountInfoDO.getVersion());            //版本号 全渠道默认值contentData.put("encoding", UnionPayConfig.encoding);     //字符集编码 可以使用UTF-8,GBK两种方式contentData.put("signMethod", UnionPayConfig.signMethod);                //签名方法contentData.put("txnType", "01");                          //交易类型 01:消费contentData.put("txnSubType", "07");                    //交易子类 07:申请消费二维码contentData.put("bizType", UnionPayConfig.bizType);                   //填写000000contentData.put("channelType", UnionPayConfig.channelType);                     //渠道类型 08手机/***商户接入参数***/contentData.put("merId", payAccountInfoDO.getMchId());                           //商户号码,请改成自己申请的商户号或者open上注册得来的777商户号测试contentData.put("accessType", UnionPayConfig.accessType);                        //接入类型,商户接入填0 ,不需修改(0:直连商户, 1: 收单机构 2:平台商户)contentData.put("orderId",transOrderDO.getOutTradeNo());                   //商户订单号,8-40位数字字母,不能含“-”或“_”,可以自行定制规则contentData.put("txnTime",UnionPayConfig.getCurrentTime());             //订单发送时间,取系统时间,格式为YYYYMMDDhhmmss,必须取当前时间,否则会报txnTime无效contentData.put("txnAmt",transOrderDO.getFee().toString());                     //交易金额 单位为分,不能带小数点contentData.put("currencyCode", UnionPayConfig.currencyCode);contentData.put("backUrl", UnionPayConfig.BACKURL);byte[] certBytes = payAccountInfoDO.getCertBytes();String keypwd = payAccountInfoDO.getCertPassword();String type = payAccountInfoDO.getSignType(); //证书类型String publicRsa = payAccountInfoDO.getPublicRsa();UnionUnifiedOrderResult unifiedOrderResult = UnionpayApiUtil.orderResult(logId,contentData,certBytes,keypwd,type,publicRsa);

有看到除了银联原本下单需要的参数外,我还获取到了证书,证书密码,签名方式和公钥,这样就需要修改银联的签名和验签方法了,一步步的传进去处理一下签名在sdkutil里面,从里签名是在certutil里,有一个方法是将签名私钥证书文件读取为证书对象的,因为我没有保存在文件夹,所以证书是传进去从数据库读取成文件的

/*** 将签名私钥证书文件读取为证书存储对象**            证书文件名* @param keypwd*            证书密码* @param type*            证书类型* @return 证书对象* @throws IOException*/private static KeyStore getKeyInfo(byte[] certBytes, String keypwd, String type) throws IOException {LogUtil.writeLog("加载签名证书==>" + certBytes);ByteArrayInputStream fis = null;try {KeyStore ks = KeyStore.getInstance(type, "BC");LogUtil.writeLog("Load RSA CertPath=[" + certBytes + "],Pwd=["+ keypwd + "],type=["+type+"]");fis = new ByteArrayInputStream(certBytes);char[] nPassword = null;nPassword = null == keypwd || "".equals(keypwd.trim()) ? null: keypwd.toCharArray();if (null != ks) {ks.load(fis, nPassword);}return ks;} catch (Exception e) {LogUtil.writeErrorLog("getKeyInfo Error", e);return null;} finally {if(null!=fis)fis.close();}}

可以看到原本的证书地址被直接改成byte类型的证书字节流了,再修改一下读取方式变成ByteArrayInputStream的方式读取就可以了,在sdkutil里会设置一个证书的序列号对应一个证书文件,后面基本不用改变

签名完成后继续执行银联下单的post请求,会返回一个请求结果,得到结果后,进行验签,验签时会先判断版本号,因为我们只对接5.0.0,所以不考虑5.1.0时验证签名书链的情况,就是需要多个证书的情况。前面已经把需要的验签公钥传进来了,所以在验签方法中进行修改就可以,在certutil里

/*** 用配置文件acp_sdk.properties配置路径 加载验证签名证书*/private static void initValidateCertFromDir(String publicRsa) {if(!"01".equals(SDKConfig.getConfig().getSignMethod())){LogUtil.writeLog("非rsa签名方式,不加载验签证书。");return;}certMap.clear();CertificateFactory cf = null;ByteArrayInputStream in = null;try {cf = CertificateFactory.getInstance("X.509", "BC");}catch (NoSuchProviderException e) {LogUtil.writeErrorLog("LoadVerifyCert Error: No BC Provider", e);return ;} catch (CertificateException e) {LogUtil.writeErrorLog("LoadVerifyCert Error", e);return ;}try {in = new ByteArrayInputStream(publicRsa.getBytes());validateCert = (X509Certificate) cf.generateCertificate(in);if(validateCert == null) {LogUtil.writeErrorLog("Load verify cert error, " + publicRsa + " has error cert content.");return ;}certMap.put(validateCert.getSerialNumber().toString(),validateCert);// 打印证书加载信息,供测试阶段调试LogUtil.writeLog("[" + publicRsa + "][CertId="+ encryptCert.getSerialNumber().toString() + "]");} catch (CertificateException e) {LogUtil.writeErrorLog("LoadVerifyCert Error", e);}catch (Exception e) {LogUtil.writeErrorLog("LoadVerifyCert Error File Not Found", e);}finally {if (null != in) {try {in.close();} catch (IOException e) {LogUtil.writeErrorLog(e.toString());}}}LogUtil.writeLog("LoadVerifyCert Finish");}

还是把路径变成了ByteArrayInputStream这样的读取,后面的内容基本不用改变

需要注意的是银联的公钥从官网下载下来全部保存在数据库,包括前面的begin和后面的end,因为支付宝的没有,所以一开始没有保存那个,一直报错,验签失败,找了好久才发现是因为公钥保存的问题,真的很坑

开发基本就这样,条码、查询什么的基本一样,根据银联的官方文档来就可以了主要是签名和验签的问题

测试的话比较讨厌,不能用云闪付app测试,只能在银联的官网有一个二维码仿真,用那个来测试还挺麻烦的

大概就长这个样子

以上

最后共勉

I don't want to be someone that you're settling for. I don't want to be someone that anyone settles for. 

我不想要你将就,我也不想成为将就的对象。

银联云闪付二维码支付对接流程和测试相关推荐

  1. PHP开发银联云闪付二维码支付

    你好,是我琉忆.最近刚好有在研究银联云闪付的支付模块,所以就写篇总结分享给大家. 这算是第二次接触支付的东西了,接触得最多的是接入微信支付,自己也有相关的总结文章,可以去segmentfault搜索& ...

  2. 支付宝支付,当面付二维码支付

    场景:PC端点击下单后,生成二维码返回给前端,用户扫码支付 依赖 <dependency><groupId>com.alipay.sdk</groupId>< ...

  3. 银联二维码支付与微信支付相比,哪个好用?

    2019独角兽企业重金招聘Python工程师标准>>> 近日,中国银联联合40多家商业银行正式推出了二维码支付产品.扫码支付你应该早就不陌生了.现在即使是摆在街边的水果摊也有二维码让 ...

  4. 刷脸支付上线,追赶二维码支付指日可待?

    二维码支付是由支付宝正式引入中国市场的.2011年7月1日,支付宝正式推出了手机APP二维码支付业务,进军国内支付市场.随着互联网经济的发展,二维码支付已经成为支付市场发展的重要角色.2017年底,二 ...

  5. 关于微信支付(二维码支付)

    关于微信支付(一) 微信支付有两种方式 1.第三方网站弹出二维码客户扫描支付 2.在微信内部H5直接发起支付 这篇文章先讲 第一种最常用的 弹出二维码支付 二维码支付 大概流程如下 用户选择支付-&g ...

  6. 交通一卡通二维码支付技术要求

    交通一卡通二维码支付技术要求 范围 本技术要求规定了交通一卡通二维码(以下简称"二维码")支付的应用场景.系统框架及流程.二维码数据结构.信息接口.安全要求.终端要求.手机客户端要 ...

  7. 继微信支付后 支付宝宣布向银联云闪付开放线上场景

    10月2日消息,支付宝发布声明称,正在与中国银联开展合作推动线上.线下的多场景支付互联互通. 根据声明,支付宝与中国银联互联互通进展如下: 支付宝向银联云闪付开放线上场景,首批覆盖85%淘宝商家.今年 ...

  8. Java 支付对接之银联电子商务(海南)聚合二维码支付(POS 通插件 C 扫 B 业务)

    写在前面: 二维码支付宝有两种表现形式:第一种是动态的二维码,就是每生成一个订单就会生成一个二维码:第二种是固定的二维码,就是每个订单都是同一个二维码作为入口.本文主要描述的是如何使用银联的线下C扫B ...

  9. 梦行扫码付(收银台条码支付 微信钱包条码支付 支付宝二维码支付 手机APP钱包支付 PHP扫码支付 )

    适用于:各行各业(如,超市 餐厅 收费站 等各类收费处) 平台管理员篇 扫码付管理 (收银台条码支付) 全站收款账号 (微信钱包条码支付) 全站收款记录 (支付宝二维码支付) 商家篇 我的扫码付 (支 ...

最新文章

  1. 图像边缘检测--OpenCV之cvCanny函数
  2. 【c语言】蓝桥杯算法提高 简单加法
  3. TMAXug ATPG Design Flow
  4. The whole Fiori application is wrapped in a big shell xml view
  5. 黑客——技术的凝聚者???
  6. docker build 中的上下文路径
  7. pcie扰码的作用_扰码讲解
  8. linux查看redis安装目录
  9. 华为access、trunk、hybird接口从tag和untag进行了解。
  10. java正则表达式 工具类_Hutool之正则表达式工具类——ReUtil
  11. matlab计算轮廓曲率半径,【转】求最小曲率半径matlab源程序
  12. 极米投影、坚果投影、当贝投影,三大品牌对比来了
  13. 如何改变思维导图的导图结构
  14. 基于扫描的磁盘调度算法
  15. 专升本英语——应试题型突破——完形填空——十大解题技巧【学习笔记】
  16. 【论文阅读|深读】VERSE: Versatile Graph Embeddings from Similarity Measures
  17. [人工智能]得人工智能者得天下?百度200万美元奖励不到20人的团队
  18. CodeMirror 基础配置指南
  19. 线程池除了常见的4种拒绝策略
  20. NOIP2015游记【OI,再见

热门文章

  1. Podometer计步器
  2. 蓝蓝算法10-数字颠倒
  3. 怎么把html格式转换成数字,Excel文本格式怎么转化成数字格式 excel文本转化数字格式教程...
  4. u盘引导不能识别惠普服务器硬盘,如何解决惠普电脑uefi识别不了u盘
  5. 6.shell之正则表达式
  6. pinta(centos7画图软件)
  7. 卓训教育:孩子叛逆厌学怎么办?孩子不想去上学怎么办?
  8. TCP/IP网络初识
  9. 【HTML/CSS】创建日期和时间表单控件
  10. 哈工大计算机科学与技术硕士培养方案,计算机科学与技术学科硕士研究生培养方案哈工大计算机学院[文].pdf...