银联云闪付二维码支付对接流程和测试
因为公司已经支持了支付宝支付和微信支付,所以需要加上一个银联的云闪付,主要是二维码支付。
银联商务的官方文档其实已经很清楚了,但是因为之前对接支付宝和微信,有一个保存商户信息的表,表结构已经确定了,再更改的话会比较麻烦,但是银联的商户信息和支付宝微信又不太相同,支付宝的签名验签主要依靠公钥和秘钥,微信主要有证书,银联却是证书和公钥,而且银联的不同版本会出现不同的验签,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.
我不想要你将就,我也不想成为将就的对象。
银联云闪付二维码支付对接流程和测试相关推荐
- PHP开发银联云闪付二维码支付
你好,是我琉忆.最近刚好有在研究银联云闪付的支付模块,所以就写篇总结分享给大家. 这算是第二次接触支付的东西了,接触得最多的是接入微信支付,自己也有相关的总结文章,可以去segmentfault搜索& ...
- 支付宝支付,当面付二维码支付
场景:PC端点击下单后,生成二维码返回给前端,用户扫码支付 依赖 <dependency><groupId>com.alipay.sdk</groupId>< ...
- 银联二维码支付与微信支付相比,哪个好用?
2019独角兽企业重金招聘Python工程师标准>>> 近日,中国银联联合40多家商业银行正式推出了二维码支付产品.扫码支付你应该早就不陌生了.现在即使是摆在街边的水果摊也有二维码让 ...
- 刷脸支付上线,追赶二维码支付指日可待?
二维码支付是由支付宝正式引入中国市场的.2011年7月1日,支付宝正式推出了手机APP二维码支付业务,进军国内支付市场.随着互联网经济的发展,二维码支付已经成为支付市场发展的重要角色.2017年底,二 ...
- 关于微信支付(二维码支付)
关于微信支付(一) 微信支付有两种方式 1.第三方网站弹出二维码客户扫描支付 2.在微信内部H5直接发起支付 这篇文章先讲 第一种最常用的 弹出二维码支付 二维码支付 大概流程如下 用户选择支付-&g ...
- 交通一卡通二维码支付技术要求
交通一卡通二维码支付技术要求 范围 本技术要求规定了交通一卡通二维码(以下简称"二维码")支付的应用场景.系统框架及流程.二维码数据结构.信息接口.安全要求.终端要求.手机客户端要 ...
- 继微信支付后 支付宝宣布向银联云闪付开放线上场景
10月2日消息,支付宝发布声明称,正在与中国银联开展合作推动线上.线下的多场景支付互联互通. 根据声明,支付宝与中国银联互联互通进展如下: 支付宝向银联云闪付开放线上场景,首批覆盖85%淘宝商家.今年 ...
- Java 支付对接之银联电子商务(海南)聚合二维码支付(POS 通插件 C 扫 B 业务)
写在前面: 二维码支付宝有两种表现形式:第一种是动态的二维码,就是每生成一个订单就会生成一个二维码:第二种是固定的二维码,就是每个订单都是同一个二维码作为入口.本文主要描述的是如何使用银联的线下C扫B ...
- 梦行扫码付(收银台条码支付 微信钱包条码支付 支付宝二维码支付 手机APP钱包支付 PHP扫码支付 )
适用于:各行各业(如,超市 餐厅 收费站 等各类收费处) 平台管理员篇 扫码付管理 (收银台条码支付) 全站收款账号 (微信钱包条码支付) 全站收款记录 (支付宝二维码支付) 商家篇 我的扫码付 (支 ...
最新文章
- 图像边缘检测--OpenCV之cvCanny函数
- 【c语言】蓝桥杯算法提高 简单加法
- TMAXug ATPG Design Flow
- The whole Fiori application is wrapped in a big shell xml view
- 黑客——技术的凝聚者???
- docker build 中的上下文路径
- pcie扰码的作用_扰码讲解
- linux查看redis安装目录
- 华为access、trunk、hybird接口从tag和untag进行了解。
- java正则表达式 工具类_Hutool之正则表达式工具类——ReUtil
- matlab计算轮廓曲率半径,【转】求最小曲率半径matlab源程序
- 极米投影、坚果投影、当贝投影,三大品牌对比来了
- 如何改变思维导图的导图结构
- 基于扫描的磁盘调度算法
- 专升本英语——应试题型突破——完形填空——十大解题技巧【学习笔记】
- 【论文阅读|深读】VERSE: Versatile Graph Embeddings from Similarity Measures
- [人工智能]得人工智能者得天下?百度200万美元奖励不到20人的团队
- CodeMirror 基础配置指南
- 线程池除了常见的4种拒绝策略
- NOIP2015游记【OI,再见
热门文章
- Podometer计步器
- 蓝蓝算法10-数字颠倒
- 怎么把html格式转换成数字,Excel文本格式怎么转化成数字格式 excel文本转化数字格式教程...
- u盘引导不能识别惠普服务器硬盘,如何解决惠普电脑uefi识别不了u盘
- 6.shell之正则表达式
- pinta(centos7画图软件)
- 卓训教育:孩子叛逆厌学怎么办?孩子不想去上学怎么办?
- TCP/IP网络初识
- 【HTML/CSS】创建日期和时间表单控件
- 哈工大计算机科学与技术硕士培养方案,计算机科学与技术学科硕士研究生培养方案哈工大计算机学院[文].pdf...