JavaEE 银联支付之网站支付-消费类交易

以银联网站支付 - 消费类交易 为例

0. 大致逻辑

前端request->后台封装参数->后台进行签名->生成跳转页面(包含表单提交内容)->响应前端(将生成的html写到浏览器中完成自动跳转打开银联支付页面)
复制代码

1.acp_sdk.properties配置

  1. 测试环境acp_sdk.properties:
##############SDK配置文件(证书方式签名)################
# 说明:
# 1. 使用时请删除后缀的“.证书”,并将此文件复制到src文件夹下替换原来的acp_sdk.properties。
# 2. 具体配置项请根据注释修改。
#
##########################################################################入网测试环境交易发送地址(线上测试需要使用生产环境交易请求地址)###############################交易请求地址 
acpsdk.frontTransUrl=https://gateway.test.95516.com/gateway/api/frontTransReq.do
acpsdk.backTransUrl=https://gateway.test.95516.com/gateway/api/backTransReq.do
acpsdk.singleQueryUrl=https://gateway.test.95516.com/gateway/api/queryTrans.do
acpsdk.batchTransUrl=https://gateway.test.95516.com/gateway/api/batchTrans.do
acpsdk.fileTransUrl=https://filedownload.test.95516.com/
acpsdk.appTransUrl=https://gateway.test.95516.com/gateway/api/appTransReq.do
acpsdk.cardTransUrl=https://gateway.test.95516.com/gateway/api/cardTransReq.do#以下缴费产品使用,其余产品用不到
acpsdk.jfFrontTransUrl=https://gateway.test.95516.com/jiaofei/api/frontTransReq.do
acpsdk.jfBackTransUrl=https://gateway.test.95516.com/jiaofei/api/backTransReq.do
acpsdk.jfSingleQueryUrl=https://gateway.test.95516.com/jiaofei/api/queryTrans.do
acpsdk.jfCardTransUrl=https://gateway.test.95516.com/jiaofei/api/cardTransReq.do
acpsdk.jfAppTransUrl=https://gateway.test.95516.com/jiaofei/api/appTransReq.do######################################################################### 报文版本号,固定5.1.0,请勿改动
acpsdk.version=5.1.0# 签名方式,证书方式固定01,请勿改动
acpsdk.signMethod=01# 是否验证验签证书的CN,测试环境请设置false,生产环境请设置true。非false的值默认都当true处理。
acpsdk.ifValidateCNName=false# 是否验证https证书,测试环境请设置false,生产环境建议优先尝试true,不行再false。非true的值默认都当false处理。
acpsdk.ifValidateRemoteCert=false#后台通知地址,填写接收银联后台通知的地址,必须外网能访问
acpsdk.backUrl=http://222.222.222.222:8080/ACPSample_B2C/backRcvResponse#前台通知地址,填写银联前台通知的地址,必须外网能访问
acpsdk.frontUrl=http://localhost:8080/ACPSample_B2C/frontRcvResponse#########################入网测试环境签名证书配置 ################################
# 多证书的情况证书路径为代码指定,可不对此块做配置。
# 签名证书路径,必须使用绝对路径,如果不想使用绝对路径,可以自行实现相对路径获取证书的方法;测试证书所有商户共用开发包中的测试签名证书,生产环境请从cfca下载得到。
# windows样例:
acpsdk.signCert.path=D:/certs/acp_test_sign.pfx
# linux样例(注意:在linux下读取证书需要保证证书有被应用读的权限)(后续其他路径配置也同此条说明)
#acpsdk.signCert.path=/SERVICE01/usr/ac_frnas/conf/ACPtest/acp700000000000001.pfx# 签名证书密码,测试环境固定000000,生产环境请修改为从cfca下载的正式证书的密码,正式环境证书密码位数需小于等于6位,否则上传到商户服务网站会失败
acpsdk.signCert.pwd=000000
# 签名证书类型,固定不需要修改
acpsdk.signCert.type=PKCS12##########################加密证书配置################################
# 敏感信息加密证书路径(商户号开通了商户对敏感信息加密的权限,需要对 卡号accNo,pin和phoneNo,cvn2,expired加密(如果这些上送的话),对敏感信息加密使用)
acpsdk.encryptCert.path=d:/certs/acp_test_enc.cer##########################验签证书配置################################
# 验签中级证书路径(银联提供)
acpsdk.middleCert.path=D:/certs/acp_test_middle.cer
# 验签根证书路径(银联提供)
acpsdk.rootCert.path=D:/certs/acp_test_root.cer
##开发测试777290058110097
merId=
复制代码
  1. 正式环境acp_sdk.properties:
acpsdk.frontTransUrl=https://gateway.95516.com/gateway/api/frontTransReq.do
acpsdk.backTransUrl=https://gateway.95516.com/gateway/api/backTransReq.do
acpsdk.singleQueryUrl=https://gateway.95516.com/gateway/api/queryTrans.do
acpsdk.batchTransUrl=https://gateway.95516.com/gateway/api/batchTransReq.do
acpsdk.fileTransUrl=https://filedownload.95516.com/
acpsdk.signCert.path=D\:\\certs\\自己的私钥.pfx
#acpsdk.signCert.path=/SERVICE01/usr/ac_frnas/conf/ACPtest/acp700000000000001.pfx
acpsdk.signCert.pwd=自己的私钥密码
acpsdk.signCert.type=PKCS12
acpsdk.validateCert.dir=D\:\\certs\\
#acpsdk.validateCert.dir=/SERVICE01/usr/ac_frnas/conf/ACPtest/
#acpsdk.encryptCert.path=d:\\certs\\encrypt.cer
acpsdk.singleMode=true
merId=自己的商户号,原demo不是写在这边
复制代码

2. request

  • request_url:https://gateway.test.95516.com/gateway/api/frontTransReq.do
    • 非测试环境:https://gateway.95516.com/gateway/api/frontTransReq.do
  • parameters:详情请求参数此处不作说明,可以直接到官网查看

3. Demo

1.获取前端请求参数,并进行封装请求信息

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.setContentType("text/html; charset="+ DemoBase.encoding);//前台页面传过来的String merId = req.getParameter("merId");String txnAmt = req.getParameter("txnAmt");String orderId = req.getParameter("orderId");String txnTime = req.getParameter("txnTime");Map<String, String> requestData = new HashMap<String, String>();/***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/requestData.put("version", DemoBase.version);   			  //版本号,全渠道默认值requestData.put("encoding", DemoBase.encoding); 			  //字符集编码,可以使用UTF-8,GBK两种方式requestData.put("signMethod", SDKConfig.getConfig().getSignMethod()); //签名方法requestData.put("txnType", "01");               			  //交易类型 ,01:消费requestData.put("txnSubType", "01");            			  //交易子类型, 01:自助消费requestData.put("bizType", "000201");           			  //业务类型,B2C网关支付,手机wap支付requestData.put("channelType", "07");           			  //渠道类型,这个字段区分B2C网关支付和手机wap支付;07:PC,平板  08:手机/***商户接入参数***/requestData.put("merId", merId);    	          			  //商户号码,请改成自己申请的正式商户号或者open上注册得来的777测试商户号requestData.put("accessType", "0");             			  //接入类型,0:直连商户 requestData.put("orderId",orderId);             //商户订单号,8-40位数字字母,不能含“-”或“_”,可以自行定制规则		requestData.put("txnTime", txnTime);        //订单发送时间,取系统时间,格式为YYYYMMDDhhmmss,必须取当前时间,否则会报txnTime无效requestData.put("currencyCode", "156");         			  //交易币种(境内商户一般是156 人民币)		requestData.put("txnAmt", txnAmt);             			      //交易金额,单位分,不要带小数点//requestData.put("reqReserved", "透传字段");        		      //请求方保留域,如需使用请启用即可;透传字段(可以实现商户自定义参数的追踪)本交易的后台通知,对本交易的交易状态查询交易、对账文件中均会原样返回,商户可以按需上传,长度为1-1024个字节。出现&={}[]符号时可能导致查询接口应答报文解析失败,建议尽量只传字母数字并使用|分割,或者可以最外层做一次base64编码(base64编码之后出现的等号不会导致解析失败可以不用管)。		requestData.put("riskRateInfo", "{commodityName=测试商品名称}");//前台通知地址 (需设置为外网能访问 http https均可),支付成功后的页面 点击“返回商户”按钮的时候将异步通知报文post到该地址//如果想要实现过几秒中自动跳转回商户页面权限,需联系银联业务申请开通自动返回商户权限//异步通知参数详见open.unionpay.com帮助中心 下载  产品接口规范  网关支付产品接口规范 消费交易 商户通知requestData.put("frontUrl", DemoBase.frontUrl);//后台通知地址(需设置为【外网】能访问 http https均可),支付成功后银联会自动将异步通知报文post到商户上送的该地址,失败的交易银联不会发送后台通知//后台通知参数详见open.unionpay.com帮助中心 下载  产品接口规范  网关支付产品接口规范 消费交易 商户通知//注意:1.需设置为外网能访问,否则收不到通知    2.http https均可  3.收单后台通知后需要10秒内返回http200或302状态码 //    4.如果银联通知服务器发送通知后10秒内未收到返回状态码或者应答码非http200,那么银联会间隔一段时间再次发送。总共发送5次,每次的间隔时间为0,1,2,4分钟。//    5.后台通知地址如果上送了带有?的参数,例如:http://abc/web?a=b&c=d 在后台通知处理程序验证签名之前需要编写逻辑将这些字段去掉再验签,否则将会验签失败requestData.put("backUrl", DemoBase.backUrl);// 订单超时时间。// 超过此时间后,除网银交易外,其他交易银联系统会拒绝受理,提示超时。 跳转银行网银交易如果超时后交易成功,会自动退款,大约5个工作日金额返还到持卡人账户。// 此时间建议取支付时的北京时间加15分钟。// 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。requestData.put("payTimeout", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date().getTime() + 15 * 60 * 1000));//////       报文中特殊用法请查看 PCwap网关跳转支付特殊用法.txt/////**请求参数设置完毕,以下对请求参数进行签名并生成html表单,将表单写入浏览器跳转打开银联页面**/Map<String, String> submitFromData = AcpService.sign(requestData,DemoBase.encoding);  //报文中certId,signature的值是在signData方法中获取并自动赋值的,只要证书配置正确即可。String requestFrontUrl = SDKConfig.getConfig().getFrontRequestUrl();  //获取请求银联的前台地址:对应属性文件acp_sdk.properties文件中的acpsdk.frontTransUrlString html = AcpService.createAutoFormHtml(requestFrontUrl, submitFromData,DemoBase.encoding);   //生成自动跳转的Html表单LogUtil.writeLog("打印请求HTML,此为请求报文,为联调排查问题的依据:"+html);//将生成的html写到浏览器中完成自动跳转打开银联支付页面;这里调用signData之后,将html写到浏览器跳转到银联页面之前均不能对html中的表单项的名称和值进行修改,如果修改会导致验签不通过resp.getWriter().write(html);
}
复制代码

2.网关页面请求页面生成

/*** 功能:前台交易构造HTTP POST自动提交表单<br>* @param action 表单提交地址<br>* @param hiddens 以MAP形式存储的表单键值<br>* @param encoding 上送请求报文域encoding字段的值<br>* @return 构造好的HTTP POST交易表单<br>*/
public static String createAutoFormHtml(String reqUrl, Map<String, String> hiddens,String encoding) {StringBuffer sf = new StringBuffer();sf.append("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset="+encoding+"\"/></head><body>");sf.append("<form id = \"pay_form\" action=\"" + reqUrl+ "\" method=\"post\">");if (null != hiddens && 0 != hiddens.size()) {Set<Entry<String, String>> set = hiddens.entrySet();Iterator<Entry<String, String>> it = set.iterator();while (it.hasNext()) {Entry<String, String> ey = it.next();String key = ey.getKey();String value = ey.getValue();sf.append("<input type=\"hidden\" name=\"" + key + "\" id=\""+ key + "\" value=\"" + value + "\"/>");}}sf.append("</form>");sf.append("</body>");sf.append("<script type=\"text/javascript\">");sf.append("document.all.pay_form.submit();");sf.append("</script>");sf.append("</html>");return sf.toString();
}
复制代码

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

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

相关文章

react 开发知识准备

react react使用教程 babel babel 可用于ES6转换为ES5&#xff0c;jsx转换为原生js。 ES6 ES6 语法 webpack webpack打包工具&#xff0c;它把不同的、相互依赖的静态资源都视作模块&#xff0c;并且打包成我们想要的静态资源。让代码组织更清晰&#xff0c;一个文件就是一个模…

Linux多线程编程(不限Linux)

——本文一个例子展开&#xff0c;介绍Linux下面线程的操作、多线程的同步和互斥。 前言 线程&#xff1f;为什么有了进程还需要线程呢&#xff0c;他们有什么区别&#xff1f;使用线程有什么优势呢&#xff1f;还有多线程编程的一些细节问题&#xff0c;如线程之间怎样同步、…

概率论与数理统计-ch8-假设检验

1、假设检验 在总体的分布函数未知或只知其形式、不知其参数的情况下&#xff0c;为了推断总体的某些未知特性&#xff0c;提出关于总体的假设&#xff0c;然后根据样本数据对提出的假设做出接受或拒绝的决策。 步骤&#xff1a; 提出原假设--确定建立在样本基础上的检验统计量…

HALCON示例程序measure_metal_part_first_example.hdev通过拟合边缘进行尺寸测量

HALCON示例程序measure_metal_part_first_example.hdev通过拟合边缘进行尺寸测量 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 dev_update_off () read_image (Image, ‘metal-parts/metal-parts-01’) get_image_size (Image, Width, Height) dev_close…

简单实现仿某宝地址选择三级联动样式

内容简单介绍实现步骤第一步 找准方向第二步 开干总结还是题外话内容简单介绍 简单看一下须要实现的效果&#xff0c;如图&#xff1a; 实现步骤 第一步 找准方向 事实上就是想好要用recyclerview而不是listview。假设要问我recyclerview是什么的话。。 第二步 开干 首先须要先…

opencv双目测距实现

虽然最近注意力已经不可遏制地被神经科学、大脑记忆机制和各种毕业活动吸引过去了&#xff0c;但是还是觉得有必要把这段时间双目视觉方面的进展总结一下。毕竟从上一篇博文发表之后&#xff0c;很多同仁发E-mail来与我讨论&#xff0c;很多原来的疑团&#xff0c;也在讨论和一…

logback高级特性使用-异步记录日志

注意&#xff1a;该功能需要高版本才能支持&#xff0c;如1.0.11。AsyncAppender&#xff0c;异步记录日志。 工作原理&#xff1a; 当Logging Event进入AsyncAppender后&#xff0c;AsyncAppender会调用appender方法&#xff0c;append方法中在将event填入Buffer(这里选用的数…

Linux下c开发 之 线程通信(转)

1.Linux“线程”进程与线程之间是有区别的&#xff0c;不过Linux内核只提供了轻量进程的支持&#xff0c;未实现线程模型。Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念&#xff0c;而其所谓的“线程”本质上在内核里仍然是进程。大家知道&#xff0c;进程…

HDU 1028 Ignatius and the Princess III

//强行递推。 xx[i][j]表示i数中第j个开头的组合种类。 /* 最终结果[i]为 sum of(xx[i][j]) (j from 1 to i); xx[i][j]sum of (xx[i-j][k]) (k from 1 to j); 例如 xx[10][4]xx[6][1]xx[6][2]xx[6][3]xx[6][4]; xx[6][1] 1; 6111111; xx[6][2]3; 6222, 62211, 621111; xx[…

HALCON示例程序measure_metal_part_id.hdev使用xld边缘拟合检测零件加工是否合格

HALCON示例程序measure_metal_part_id.hdev使用xld边缘拟合检测零件加工是否合格 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 dev_update_off () Imagefiles : [‘metal-parts/metal-part-model-01’,‘metal-parts/metal-parts-01’,‘metal-parts/meta…

编写批处理文件-------基础

第一、Windows bat 批处理文件 编写 如何编写批处理文件 批处理文件&#xff08;batch file&#xff09;包含一系列 DOS命令&#xff0c;通常用于自动执行重复性任务。 用户只需双击批处理文件便可执行任务&#xff0c;而无需重复输入相同指令。编写批处理文件非常简单&#xf…

主控芯片

主控芯片&#xff1a; 主控芯片里有310&#xff0c;320,3288&#xff0c;288,318&#xff0c;333&#xff0c;345&#xff0c;7501, 其中310是中星微发展比较早&#xff0c;比较成熟的芯片。在现在一般应用在水晶夹子之类的低端产品上。 3288也是低端芯片&#xff0c;318&…

MPEG2、H.263、H.264协议效率对比

[摘录]1.1 MPEG2、H.263、H.264协议效率对比ITUT中定义的双向视频通信协议族包括&#xff1a;H.320、H.323&#xff0c;这两个协议族中&#xff0c;包含了很多子协议&#xff0c;例如音频编码协议、视频编码协议等&#xff0c;其中视频编码包括&#xff1a;H.261、H.263、H.264…

WebService SOAP、Restful和HTTP(post/get)请求区别

web service&#xff08;SOAP&#xff09; Webservice的一个最基本的目的就是提供在各个不同平台的不同应用系统的协同工作能力。 Web service 就是一个应用程序&#xff0c;它向外界暴露出一个能够通过Web进行调用的API。 SOAP是一种简单基于xml的轻量协议&#xff0c;用户web…

Block的循环引用详解

1.首先我们创建了一个网络请求工具类 然后storyboard里面去创建了一个导航控制器 并且把它设置为初始控制器 然后拖入一个bar button &#xff0d;&#xff0d;show&#xff0d;&#xff0d;到自带的控制器 这个时候运行代码的结果是 x 显然这个时候没有造成循环引用 为什…

HALCON示例程序measure_pump.hdev螺纹孔位置与尺寸测量

HALCON示例程序measure_pump.hdev螺纹孔位置与尺寸测量 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 dev_update_var (‘off’) dev_update_off () read_image (Image, ‘pumpe’) get_image_size (Image, Width, Height) dev_close_window () dev_open_…

计算机视觉和图形学中的摄像机内参数矩阵详解

在计算机视觉和图形学中都有“摄像机内参数矩阵”这个概念&#xff0c;其含义大致相同&#xff0c;但在实际使用过程中&#xff0c;这两个矩阵却相差甚远。在增强现实中&#xff0c;为了使计算机绘制的虚拟物体和真实环境图像对其&#xff0c;需要令虚拟摄像机的内参数和真实摄…

c#和html方法互调

具体见连接&#xff1a;https://www.cnblogs.com/zeroLove/p/3912460.html转载于:https://www.cnblogs.com/gaara-zhang/p/8746403.html

数据库基础杂记

sql,Structured Query Language结构化查询语言。SQL 是一门 ANSI(美国国家标准局) 的标准计算机语言&#xff0c;用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。SQL 可与数据库程序协同工作&#xff0c;比如 MS Access、DB2、Informix、MS SQL Server、Ora…

很有用的X264和ffmpeg的设置

很有用的X264和FFMPEG的设置 http://www.360doc.com/content/11/0209/16/3705984_91612512.shtml 点击打开链接