1.Java接入银联支付(chinapay)教程及避坑点

一、背景及效果展示

现如今,诸多的供应链系统需要使用电子钱包功能,所以接入银联B2B无卡支付,是很多系统应用需要做的事情。银联支付的类型分很多种:网关支付(带token请求实现,下次有空再分享)、B2B无卡支付(带证书秘钥请求实现)分商户和机构入网,具体和更详细的内容可以去看中国银联开放平台,今天这里主要针对于企业中所涉及的的B2B无卡快捷支付做介绍与讲解。

二、B2B快捷支付流程

在这里插入图片描述

此流程图在商户接入手册中有展示,可以在文档中详细查看

2.1 B2B支付流程介绍

在这里插入图片描述

我们正常做的B2B支付对于银联来说,即是前台支付(B2B业务中都是前台支付),后台支付不用管。

整体流程走向:

1.通过后端先将支付请求的参数构建好并返回给到前端,前端请求银联的前台支付地址;

2.前端处理银联的响应信息(银联返回的是页面,可新开页签),后续到支付流程都是银联侧;
在这里插入图片描述

**注:**此处没有进行银行的选择,是在进行支付请求时传递了银行的机构码,银联的网关前置功能会自动跳转至对应的银联支付页面

3.填写银行卡密码等信息,填写完成后点击支付

4.支付完成后,银联会回调我们的后端回调接口或前端页面(前端页面回调地址可不传,采用手动关闭银联的页面)

5.接收到银行的支付回调信息后,主动调 交易查询接口 进行当前订单的支付状态

6.对支付回调信息与交易查询的响应信息进行处理,判断支付状态,进行后续的业务操作

**后续(退款类)**交易接口与支付流程基本一致,不过后续(退款类)交易接口是直接通过后端完成即可

三、前置工作

当接入银联无卡支付的时候,会有银联的对接人给你们申请,通过邮件发送开发所需的文件,如下:
在这里插入图片描述

1、开发文档ChinaPay新一代商户接入手册_20220616.pdf

2、公钥证书 CP.rar,需要解压此rar文件

3、usexxx.zip,私钥和密码压缩包,需解压后,生成私钥xxxxxxxx.sm2和密码

4、插件包,里面提供了Java、.net、C和PHP的插件包,java核心jar包就是chinapaysecure-sm-1.0.jar,通过此jar中的方法进行签名的生成、验签,加密解密
在这里插入图片描述

5、需要联系银联的对接人员开通B2B支付的测试账号

6、让银联方配置测试ip白名单,固定的对外IP

**注:**如果确实需要银联方提供demo参考(不建议),可让对接人员提供,demo本身基于servlet + jsp构建的eclipse项目,注释也很少,有问题建议直接跟银联方沟通,确认好自己的需求,效率会高很多。

四、正式接入

4.1 新建私钥及证书配置文件

在当前项目下,新建security.properties文件,配置好对应的公私钥及密码等信息

#报文中不参与签名的字段名称,多个字段用逗号进行分隔
sign.invalid.fields=Signature,CertId
#报文中签名的字段名称
signature.field=Signature
#是否输出调试日志,true输出,其他只输出错误日志
log.info=false
#私钥算法
secss.privateAlg=SM2
#私钥路径
secss.privatePath=/xxx/xxx.sm2
#私钥密码
secss.privatePwd=a111111
#公钥算法
secss.publicAlg=SM2
#公钥路径
secss.publicPath=/xxx/xxx.cer
#是否排除过期秘钥
secss.excludeExpiredCert=true

注:公私钥路径最好采用文件的绝对路径

4.2 引入chinapaysecure-sm-1.0.jar

项目中使用maven或gradle进行依赖管理时,可先将此jar包解压至本地仓库,后通过maven的gav坐标将其引入(gradle引入依赖与此类似)

<dependency><groupId>com.unionpay</groupId><artifactId>chinapaysecure-sm</artifactId><version>1.0</version>
</dependency>

注:如果maven仓库是采用的私服仓库,上传了这个jar后,如果项目中无法获取,需要检查仓库的更新策略,具体可以联系公司内的相关人员进行处理

4.3 代码接入

4.3.1 核心工具类 SecssUtil 初始化

@Slf4j
@Configuration
public class SecssConfig {@Value("${china.pay.securityUrl}")private String securityUrl;@Beanpublic SecssUtil init(){//执行secss初始化SecssUtil secssUtil = new SecssUtil();boolean bool = secssUtil.init(securityUrl);if (bool) {log.info("ChinaPay交易证书、验签证书初始化成功!");} else {log.error("ChinaPay交易证书、验签证书初始化失败:"+secssUtil.getErrCode() + "=" + secssUtil.getErrMsg());}return secssUtil;}}

4.3.2 构建支付请求参数

@Autowired
private SecssUtil secssUtil;private TreeMap<String,Object> buildPayParams(SendPayReq payReq){TreeMap<String,Object> req = new TreeMap<>();req.put(Constants.VERSION,Constants.REQUEST_VERSION);req.put(Constants.MER_ID,merId);req.put(Constants.MER_ORDER_NO,payReq.getPayOrderId());req.put(Constants.TRAN_DATE, TimeUtil.date2String(LocalDate.now()));req.put(Constants.TRAN_TIME,TimeUtil.time2String(LocalTime.now()));//元转分Long orderAmt = payReq.getRemitterAmt().multiply(new BigDecimal(100)).longValue();req.put(Constants.ORDER_AMT,orderAmt.toString());req.put(Constants.BUSI_TYPE,Constants.BUSINESS_TYPE);//req.put("BankInstNo", param.getAccCode()); // 支付机构号-银联在线支付(这个参数必填,如果是无卡支付前端请求,否则会失败)//req.put("TranType",Constants.PAY_TRAN_TYPE);//支付接口后端回调地址req.put(Constants.MER_BG_URL,backPayUrl);//付款支付完成后跳转至的系统前台展示地址if (StringUtils.isNotEmpty(payReq.getMerPageUrl())){req.put("MerPageUrl",payReq.getMerPageUrl());}req.put(Constants.REMOTE_ADDR,remoteAddr);secssUtil.sign(req);log.info("支付交易签名响应is {},信息 {}",secssUtil.getErrCode(),secssUtil.getErrMsg());String sign = secssUtil.getSign();req.put(Constants.SIGNATURE,sign);return req;}

4.3.3 接收支付回调

支付完成后,银联会回调我们的这个接口,具体内容及接收方法课看下第五大点中的5.3回调接口

4.3.4 构建交易查询接口参数

	/*** 构建银联商务交易查询参数* @param param* @return*/private TreeMap<String,Object> buildQueryPayParams(AccountStorageQueryReq param){TreeMap<String,Object> req = new TreeMap<>();req.put(Constants.VERSION,Constants.REQUEST_VERSION);req.put(Constants.MER_ID,merId);req.put(Constants.MER_ORDER_NO,param.getPayOrderId());req.put(Constants.TRAN_DATE, param.getOriTranDate());req.put(Constants.TRAN_TYPE,Constants.QUERY_TRAN_TYPE);req.put(Constants.BUSI_TYPE,Constants.BUSINESS_TYPE);secssUtil.sign(req);log.info("商务交易签名响应is {},信息 {}",secssUtil.getErrCode(),secssUtil.getErrMsg());String sign = secssUtil.getSign();req.put(Constants.SIGNATURE,sign);return req;}

五、注意点

5.1 参数类型

在向银联发起支付、交易查询、退款类等请求时,虽说文档中每个字段类型各异,但实际上所有参数都是string类型

5.2 字段解密

如果需要对银行的返回信息中某个字段需要进行解密时,需要先注意下返回的加密信息是否含有 “%”,如果含有,则需要先通过url解码对字符串解码,去除该特殊符号,然后继续采用解密方法进行解密

import java.net.URLDecoder;public String getDecData(String encData){try {//对加密内容进行url解码String cardTranData = URLDecoder.decode(encData, Charsets.UTF_8);//调用核心类方法进行解密secssUtil.decryptData(cardTranData);//获取解密后的内容String cardData = secssUtil.getDecValue();if (StringUtils.isNotEmpty(cardData)){Map map = JSONObject.parseObject(cardData, Map.class);return (String)map.get("CardNo");}else {return "";}}catch (Exception e){log.warn("银行账户字段解签错误");return "";}}

5.3 回调接口

我们接收银联回调的接口,地址需要能直接被银联方访问到,(公网地址,并配置银联的白名单)。采用HttpServletRequest接收参数,并用获取paramMap方法拿到所有的响应参数内容

/*** 银联支付接口异步回调* @return*/
@PostMapping("/")
public ApiResult<Void> payCallback(HttpServletRequest request){Map<String, String[]> parameterMap = request.getParameterMap();log.info("4.1支付异步回调响应信息 is {}",parameterMap);if (CollectionUtils.isEmpty(parameterMap)){return ApiResult.fail("4.1支付异步回调响应信息为空");}return ApiResult.ok();
}

5.4 请求参数签名

银联构建的所有参数都需要进行签名(签名字段本身除外),然后一起组装到请求参数中,发送至银联的对应接口

public String getSign(TreeMap<String,Object> req){secssUtil.sign(req);log.info("待签名信息is {},签名响应: {}",secssUtil.getErrCode(),secssUtil.getErrMsg());String sign = secssUtil.getSign();return sign;}
联的对应接口```java
public String getSign(TreeMap<String,Object> req){secssUtil.sign(req);log.info("待签名信息is {},签名响应: {}",secssUtil.getErrCode(),secssUtil.getErrMsg());String sign = secssUtil.getSign();return sign;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/52540.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端直接调用银联支付接口,使用form表单访问银联

直接调转到银联页面 银联支付 <template> <div class"pay"> <form action"https://gateway.95516.com/gateway/api/frontTransReq.do" method"post" id"payUniconSubmit"> <div v-show"false…

PHP接入银联在线网关支付

网站支付&#xff1a;一般接入微信支付、支付宝支付、银联支付&#xff0c;本文介绍的是如何接入中国银联在线网关支付 银联介绍 银联在线支付网关是中国银联联合各商业银行为持卡人提供的集成化、综合性互联网支付工具&#xff0c;主要支持输入卡号付款、用户登录支付、网银支…

移动支付--银联,支付宝,微信(android)

在这个移动互联网高速发展的时代,手机已经成为人们生活或者出行之中不可缺少的设备了&#xff0c;现在很多城市的商户都可以采用支付宝&#xff0c;微信支付了&#xff0c;人们出门只需要随身携带带手机&#xff0c;不用带大量现金就可以放心购物了。现在的很多移动互联网产品都…

微信APP支付之IJpay的使用

写在开始:一个搬砖程序员的随缘记录微信支付相对其他支付&#xff0c;比如支付宝支付坑比较多。一直报签名失败。签名参数顺序、数据类型&#xff0c;加密类型这些都需要注意&#xff0c;用第三方的比较省心。 IJpay介绍&#xff1a; 聚合支付&#xff0c;IJPay 让支付触手可及…

滥用 GPT,被抓了.....

点击上方“Java基基”&#xff0c;选择“设为星标” 做积极的人&#xff0c;而不是积极废人&#xff01; 每天 14:00 更新文章&#xff0c;每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路&#xff0c;很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应…

沉浸式学习

沉浸式就是利用系统状态栏&#xff0c;将背景图片延伸至系统状态栏区域内&#xff0c;效果就是和游戏应用画面那样。 Action1 隐藏状态栏和ActionBar 仅仅是隐藏状态栏和ActionBar&#xff0c;只是粗暴的隐藏了而已 //获取当前界面的DecorViewView decorView getWindow().g…

最全整理反面角色谁更适合饰演老大角色,你认识多少?(已收藏)

https://www.toutiao.com/a6662589985889190412/ 2019-02-27 16:11:54 这些演艺界的大佬&#xff0c;哪位更适合饰演反面角色的老大&#xff0c;你觉得的呢&#xff1f; 排名不分前后 【万梓良】 香港娱乐圈内有很多自带大哥气质的演员&#xff0c;万梓良就是其中之一。 他在…

“引进来,走出去”,锦江国际集团多重创新力引领绿色新发展

2022年12月13日&#xff0c;由南方财经全媒体集团指导&#xff0c;21世纪经济报道主办的“21世纪住宿业高峰论坛&#xff08;2022&#xff09;暨2022&#xff08;第十九届&#xff09;【金枕头】酒店大赏发布典礼”在上海如期举行。锦江国际集团副总裁周维应邀出席并发表“创新…

PDF文档翻译中文的方法

1.如果你的文档容量不大&#xff0c;可以尝试使用谷歌翻译进行文档翻译&#xff0c;可以看到谷歌翻译支持的文档类型有 .doc、.docx、.odf、.pdf、.ppt、.pptx、.ps、.rtf、.txt、.xls 和 .xlsx 不过值得注意的是&#xff0c;谷歌翻译支持的文档容量仅为1MB 2.同样是基于谷歌…

如何将英文PDF翻译成中文且格式不变?(PDF免费翻译攻略)

如何将英文PDF翻译成中文且格式不变 方法1&#xff1a;转换成HTML后再使用谷歌浏览器翻译保存为PDF方法2&#xff1a;使用一些第三方PDF翻译网站最后博主采用了福昕翻译网站在线翻译的方法。 Hello&#xff0c;小伙伴们&#xff01; 博主最近想要将一份英文的pdf帮助文档转换成…

用python写一个PDF翻译软件

前期工作&#xff1a; 注册 百度翻译api的账户&#xff08;个人-高级版&#xff09;&#xff0c;注册后&#xff0c;每个月有2百万的免费翻译字符数。 安装pdfminer3k 一、UI界面设计 点击路径按钮时弹出文件目录选择窗口&#xff0c;参考文章&#xff1a; PYQT5实现文件目…

使用TCPDF插件生成pdf以及pdf的中文处理

做了这么多年项目&#xff0c;以前只是在别人的项目中了解过php生成pdf文件&#xff0c;知道并不难&#xff0c;但是涉及到了pdf开发库&#xff0c;首先介绍pdf库。 多种多样的pdf开发库 1.WKHTMLTOPDF wkhtmltopdf是一个很好的解决方案&#xff0c;基本上可以原样输出html页面…

pdf文件如何进行翻译?pdf文件翻译方法分享。

pdf文件如何进行翻译&#xff1f;在日常的工作和学习当中&#xff0c;很多小伙伴都需要接受到pdf文件&#xff0c;需要我们对pdf文件进行翻译或者处理&#xff0c;那么众所周知dpf文件因为不可编辑性&#xff0c;从而变的特别特别的安全&#xff0c;深受大家的喜爱&#xff0c;…

推荐几种可以直接翻译PDF英文文献的方法

大家在阅读英文文献的时候&#xff0c;可能会经常碰到这样的情况&#xff1a;由于作者使用了各种从句&#xff0c;明明只是一句话&#xff0c;却写成很长的一段&#xff0c;即使其中没有生词&#xff0c;看了几遍也弄不懂它的意思。如果句子里再夹杂了几个看不懂的英文单词&…

英文PDF怎么翻译成中文?两分钟让你学会翻译PDF

现在大部分的文件资料都是以PDF的格式保存的&#xff0c;这是因为PDF格式可以跨设备打开的时候&#xff0c;不会影响到内容的排版格式。在撰写论文的时候&#xff0c;我们常需要查阅各种文献资料&#xff0c;尤其是会参考英文文献。小伙伴们平时遇到不懂的词句&#xff0c;是怎…

pdf翻译器哪个好?这几个pdf翻译软件能支持一键翻译

有没有从事外贸行业的小伙伴经常收到国外客人发送的外文文档呢&#xff1f;通常这些文档除了是外文语言外&#xff0c;还是pdf格式的。外文不熟的朋友&#xff0c;肯定是对文档一窍不通吧。如果我们用一些pdf翻译器来翻译文档的话&#xff0c;我们就不用费心去研究该文档的意思…

推荐几个好用的pdf翻译工具

开始用的是网易有道词典&#xff0c;排版和准确度都不错&#xff0c;效果如下&#xff0c;只是收费 后来在网上找了一下&#xff0c;大部分工具&#xff0c;要不收费要不排版不行&#xff0c;或者只是划词翻译&#xff0c;也没有ocr识别 最后找了两个网站 https://fanyi.atm…

PDF如何翻译成中文?三种方法教你怎样翻译PDF上的文字

小伙伴们在学习或工作中遇到外国文章时是不是会先翻译成中文再阅读呢&#xff1f;如果文章是word或者txt格式&#xff0c;我们可以直接复制文字进行翻译。但是有些文章为了看起来美观可能会生成PDF格式&#xff0c;我们想翻译的话&#xff0c;就需要先把格式转换成word等方便编…

PDF怎么翻译成中文?这些方法值得收藏

小伙伴们平时接触英文PDF文件的机会多吗&#xff1f;虽然可能平时接触的少&#xff0c;可是一旦接触就会很痛苦&#xff0c;因为有的PDF文件里面会充斥着大量深奥的词汇。对于这些深奥的词汇&#xff0c;小伙伴们都是采取什么方法呢&#xff1f;是逐个逐个拿去翻译吗&#xff1…

福昕pdf阅读器的划词翻译功能如何添加(图文并茂)

一、打开福昕阅读器 二、可在上方工具栏&#xff0c;点击“帮助”&#xff0c;关于福昕阅读器领鲜版查看安装的版本信息&#xff0c;如图1-1&#xff0c;图1-2 图1-1 图1-2 三、找到上方工具栏的图标按键&#xff0c;名为“自定义快速访问工具栏”&#xff0c;如图1-3&#…