银联支付(一)申请测试环境,并运行测试demo(在线网关支付)

1.注册账号

点击进入银联支付开放平台地址

注册账号

选择普通用户登录账号

登录后点击前往商户测试中心

进入后产品列表中选择在线网关支付,然后要点击操作中的集成测试申请支付权限,10分钟后生效(这里如果没有点击,支付时会提示没有权限)

关于其他产品 如无跳转支付,二维码支付的介绍和使用场景可以参照网址业务产品场景应用介绍,本文中以在线网关支付为例

2.测试demo搭建及运行

1.下载官方demo  在线网关支付demo下载网址

2.下载测试用证书

回到测试中心中>测试参数>下载指定证书>存放在本机D盘certs目录下

这里4个证书文件都需要下载,同时要记住自己777开头的测试商户号

最下方有测试用银行卡数据

3.idea导入demo程序

这里根据自己的实际开发环境导入该工程.

4.运行并访问http://127.0.0.1:8081/ACPSample_B2C/

其中商户号改为自己的测试商户号 点击提交即可跳转到详细支付页面.

输入测试账号相关信息即可完成支付

3.支付提交流程分析

我们进入demo流程的

com.unionpay.acp.demo.consume.Form_6_2_FrontConsume类中 他的post方法中

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("12345");
		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.frontTransUrl
		String html = AcpService.createAutoFormHtml(requestFrontUrl, submitFromData,DemoBase.encoding);   //生成自动跳转的Html表单
		
		LogUtil.writeLog("打印请求HTML,此为请求报文,为联调排查问题的依据:"+html);
		//将生成的html写到浏览器中完成自动跳转打开银联支付页面;这里调用signData之后,将html写到浏览器跳转到银联页面之前均不能对html中的表单项的名称和值进行修改,如果修改会导致验签不通过
		resp.getWriter().write(html);

将业务参数封装在map中然后进行签名,再将业务数据拼接成html页面返回.

具体的生成html方法如下

我们发现他是将业务参数签名后循环放入隐藏input元素中,然后页面一加载就进行post提交

具体提交地址是配置文件中的

acpsdk.frontTransUrl=https://gateway.95516.com/gateway/api/frontTransReq.do

和测试页面支付提交后最终跳转的地址一致

关于两个回调地址

//前台通知地址 (需设置为外网能访问 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);

值得一提的是我们看到参数设置代码中有两个地址,具体的差别请看官方解释

总体来说一个是前端地址frontUrl,另一个是后端地址backUrl 他们两个具体的作用主要是通知我们支付的结果

前端地址(前台通知):付款后,银联会重定向到支付结果页面

此时点击返回商户按钮,会跳转到银联后台的回调接口

同时银联会以http形式请求我们之前填写的前端地址,这里可以对结果进行验签校验然后控制要返回给用户的前端页面

比如说读取respCode 如果返回00则返回给用户支付成功界面,如果为失败则返回支付失败页面等等

值得注意的是我们不能以此来判断用户是否支付成功,同时来修改我们自己数据库的支付状态,因为用户很有可能不会点击返回商户按钮.不能保证每次都送达

后台地址(后台通知):

支付完毕后,仅成功交易会发送后台通知,失败交易不会发送。商户收到后台通知后,应根据通知报文中订单号等关键信息发起交易查询请求,根据查询结果更新系统中的订单支付状态。并且我们得返回响应,返回码为200或302时,银联判定为通知成功,其他返回码为通知失败。如10秒内未收到应答,银联判定为通知失败。第一次通知失败后,银联会重发,最多发送五次,每次的间隔时间为0,1,2,4,5分钟。

可以参照下面的标准处理方式:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值