精华内容
下载资源
问答
  • 银联二维码
    2018-02-06 14:35:00
     
    //获取URL参数
     name 参数名称 
     

    GetQueryString (name) {
      var search = document.location.hash;
      var pattern = new RegExp("[?&]" + name + "\=([^&]+)", "g");
      var matcher = pattern.exec(search);
      var items = null;
      if (null != matcher) {
        try {
          items = decodeURIComponent(decodeURIComponent(matcher[1]));
        } catch (e) {
          try {
          items = decodeURIComponent(matcher[1]);
        } catch (e) {
          items = matcher[1];
        }
      }
    }
    return items;
    }

     用的时候,需要获取地址栏orderid的参数,就直接将orderid写在括号里。 如GetQueryString('orderid')

     

    银联二维码H5项目,支付成功页面,需要获取url参数。

    转载于:https://www.cnblogs.com/ourLifes/p/8422265.html

    更多相关内容
  • 17.中国银联二维码支付应用规范-20161209.pdf
  • 14.中国银联二维码交易处理系统技术指南-20171025.pdf
  • 银联二维码资料

    2017-12-08 09:09:16
    银联二维码资料,PDF,包括改造指南,支付指南,业务实施指南,安全规范和应用规范。
  • 本规范对二维码支付所涉及的系统、受理终端、移动设备、加密强度等提出安全要求,以保证各机构在推广二维码支付时,能执行统一的安全要求,保障持卡人账户信息安全和敏感数据的安全。
  • 中国银联全渠道支付平台--银联二维码支付之主扫、被扫、查询接口
  • 银联二维码支付规范

    2017-03-03 16:30:53
    银联最新的二维码支付规范
  • 银联二维码开发规范

    2018-04-13 11:10:43
    银联二维码开发规范,包含银联主扫,银联被扫,银联小微。
  • 中国银联二维码支付方案、二维码取款、二维码消费业务指引等
  • 中国银联二维码交易处理系统技术指南,接口文档,pdf格式
  • 银联二维码支付开发包 ,里面包含各种语言的demo开发,还有加解密方法,源码
  • 通过二维码(条)互方式实现了个人之间、与商户以及的资金收付, 实现了个人之间、与商户以及的资金收付, 实现了个人之间、与商户以及的资金收付
  • 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.1.8 5.1.9 5.2.1 5.2.2 6.1.1 6.1.2
  • 招商银行APP支持银联二维码支付.pdf
  • 招商银行APP首批支持银联二维码支付.pdf
  • 16.中国银联二维码支付安全规范-20161209.pdf
  • 13.中国银联二维码交易处理系统改造指南-20171001.pdf
  • 便利再升级 兴业银行APP首批上线银联二维码支付功能.pdf
  • 银联二维码支付产品交流 、银联二维码支付业务规范、银联二维码收单机构业务接入运营介绍
  • 本规范由中国银联股份有限公司提出。 主要内容为: 二维码支付数据元要求 安全机制 本规范主要规定了二维码支付中的二维码编码规则、应用场景、支付模式等,说明了相关参与主体、 二维码类型等,同时考虑相关编码的...
  • 最近在做银联二维码支付Android端相关项目,因为中国银联网站上并未提供Android端demo,只提供了Java相关demo,只能是根据自己的业务需求去更改,开始看银联的开发文档觉得一脸懵逼,看不懂,后来经过深入分析,才...

    最近在做银联二维码支付Android端相关项目,因为中国银联网站上并未提供Android端demo,只提供了Java相关demo,只能是根据自己的业务需求去更改,开始看银联的开发文档觉得一脸懵逼,看不懂,后来经过深入分析,才知道自己没有理清步骤,在本篇文档中先介绍一下,银联二维码的主扫、被扫以及查询接口,后续会在介绍退货、冲证、撤销等相关接口。

    银联Java提供的SDK目录如下:


    在MainActivity中或者Application中先调用:SDKConfig.getConfig().loadPropertiesFromSrc(this);加载工程所需的相关密钥证书,这些证书密钥Java工程是通过classPath路径加载的,但是在Android项目中可以放在assets文件贾或者其他的本地目录中,在此我将这些证书密钥放在了assets中,便于去加载。此外还要将相关的jar包取出来放在项目中


    当然,这些jar包在银联提供的java的Demo中都是有的。

    一、主扫

    package com.zng.unionpayqr.msqr;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import android.util.Log;
    
    import com.zng.unionpayqr.sdk.AcpService;
    import com.zng.unionpayqr.sdk.LogUtil;
    import com.zng.unionpayqr.sdk.SDKConfig;
    import com.zng.unionpayqr.utils.DemoBase;
    import com.zng.unionpayqr.utils.RandomUtil;
    
    public class QRMainSweepUtil {
    
    	/**QR主扫*/
    	public static void qrMainSweep(){
    		Map<String, String> contentData = new HashMap<String, String>();
    		/***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/
    		contentData.put("version", DemoBase.version);            //版本号 全渠道默认值
    		contentData.put("encoding", DemoBase.encoding);     //字符集编码 可以使用UTF-8,GBK两种方式
    		contentData.put("signMethod", SDKConfig.getConfig().getSignMethod()); //签名方法
    		contentData.put("txnType", "01");              		 	//交易类型 01:消费
    		contentData.put("txnSubType", "07");           		 	//交易子类 07:申请消费二维码
    		contentData.put("bizType", "000000");          		 	//填写000000
    		contentData.put("channelType", "08");          		 	//渠道类型 08手机
    		
    		/***商户接入参数***/
    		contentData.put("merId", "777290058149059");   		 	//商户号码,请改成自己申请的商户号或者open上注册得来的777商户号测试
    		contentData.put("accessType", "0");            		 	//接入类型,商户接入填0 ,不需修改(0:直连商户, 1: 收单机构 2:平台商户)
    		contentData.put("orderId", RandomUtil.getOutTradeNo()); //商户订单号,8-40位数字字母,不能含“-”或“_”,可以自行定制规则	
    		contentData.put("txnTime", DemoBase.getCurrentTime());	//订单发送时间,取系统时间,格式为YYYYMMDDhhmmss,必须取当前时间,否则会报txnTime无效
    		contentData.put("txnAmt", "1");							//交易金额 单位为分,不能带小数点
    		contentData.put("currencyCode", "156");                 //境内商户固定 156 人民币
    		contentData.put("backUrl", DemoBase.backUrl);
    		
    		/**对请求参数进行签名并发送http post请求,接收同步应答报文**/
    		Map<String, String> reqData = AcpService.sign(contentData,DemoBase.encoding);			 //报文中certId,signature的值是在signData方法中获取并自动赋值的,只要证书配置正确即可。
    		String requestAppUrl = SDKConfig.getConfig().getBackRequestUrl();								 //交易请求url从配置文件读取对应属性文件acp_sdk.properties中的 acpsdk.backTransUrl
    		Map<String, String> rspData = AcpService.post(reqData,requestAppUrl,DemoBase.encoding); 
    		
    		Log.d("zqh", "rspData = "+rspData);
    		/**对应答码的处理,请根据您的业务逻辑来编写程序,以下应答码处理逻辑仅供参考------------->**/
    		//应答码规范参考open.unionpay.com帮助中心 下载  产品接口规范  《平台接入接口规范-第5部分-附录》
    		if(!rspData.isEmpty()){
    			if(AcpService.validate(rspData, DemoBase.encoding)){
    				LogUtil.writeLog("验证签名成功");
    				String respCode = rspData.get("respCode") ;
    				if(("00").equals(respCode)){
    					//成功,获取tn号
    					String qrCode = rspData.get("qrCode");
    					Log.e("zqh", "qrCode = "+qrCode);
    				}else{
    					//其他应答码为失败请排查原因或做失败处理
    					
    				}
    			}else{
    				LogUtil.writeErrorLog("验证签名失败");
    				//TODO 检查验证签名失败的原因
    			}
    		}else{
    			//未返回正确的http状态
    			LogUtil.writeErrorLog("未获取到返回报文或返回http状态码非200");
    		}
    		String reqMessage = DemoBase.genHtmlResult(reqData);
    		String rspMessage = DemoBase.genHtmlResult(rspData);
    		Log.e("zqh","请求报文:<br/>"+reqMessage+"<br/>" + "应答报文:</br>"+rspMessage+"");
    	}
    }
    


    二、被扫

    package com.zng.unionpayqr.qrss;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import android.util.Log;
    
    import com.zng.unionpayqr.sdk.AcpService;
    import com.zng.unionpayqr.sdk.LogUtil;
    import com.zng.unionpayqr.sdk.SDKConfig;
    import com.zng.unionpayqr.utils.DemoBase;
    import com.zng.unionpayqr.utils.RandomUtil;
    
    /**
     * QR被扫
     * @author zqh
     *
     */
    public class QRIsSweptUtil {
    	
    	/**QR被扫*/
    	public static void qrIsSwept(String C2BCode){
    		Map<String, String> contentData = new HashMap<String, String>();
    		/***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/
    		contentData.put("version", DemoBase.version);            //版本号 全渠道默认值
    		contentData.put("encoding", DemoBase.encoding);     //字符集编码 可以使用UTF-8,GBK两种方式
    		contentData.put("signMethod", SDKConfig.getConfig().getSignMethod()); //签名方法
    		contentData.put("txnType", "01");              		 	//交易类型 01:消费
    		contentData.put("txnSubType", "06");           		 	//交易子类 07:申请消费二维码
    		contentData.put("bizType", "000000");          		 	//填写000000
    		contentData.put("channelType", "08");          		 	//渠道类型 08手机
    		
    		/***商户接入参数***/
    		contentData.put("merId", "777290058149059");   		 	//商户号码,请改成自己申请的商户号或者open上注册得来的777商户号测试
    		contentData.put("accessType", "0");            		 	//接入类型,商户接入填0 ,不需修改(0:直连商户, 1: 收单机构 2:平台商户)
    		contentData.put("qrNo", C2BCode);
    		contentData.put("orderId", RandomUtil.getOutTradeNo()); //商户订单号,8-40位数字字母,不能含“-”或“_”,可以自行定制规则	
    		contentData.put("txnTime", DemoBase.getCurrentTime());	//订单发送时间,取系统时间,格式为YYYYMMDDhhmmss,必须取当前时间,否则会报txnTime无效
    		contentData.put("txnAmt", "1");						//交易金额 单位为分,不能带小数点
    		contentData.put("currencyCode", "156");                 //境内商户固定 156 人民币
    		contentData.put("backUrl", DemoBase.backUrl);
    		
    		/**对请求参数进行签名并发送http post请求,接收同步应答报文**/
    		Map<String, String> reqData = AcpService.sign(contentData,DemoBase.encoding);			 //报文中certId,signature的值是在signData方法中获取并自动赋值的,只要证书配置正确即可。
    		String requestAppUrl = SDKConfig.getConfig().getBackRequestUrl();								 //交易请求url从配置文件读取对应属性文件acp_sdk.properties中的 acpsdk.backTransUrl
    		Map<String, String> rspData = AcpService.post(reqData,requestAppUrl,DemoBase.encoding); 
    		
    		Log.d("zqh", "rspData = "+rspData);
    		/**对应答码的处理,请根据您的业务逻辑来编写程序,以下应答码处理逻辑仅供参考------------->**/
    		//应答码规范参考open.unionpay.com帮助中心 下载  产品接口规范  《平台接入接口规范-第5部分-附录》
    		if(!rspData.isEmpty()){
    			if(AcpService.validate(rspData, DemoBase.encoding)){
    				LogUtil.writeLog("验证签名成功");
    				String respCode = rspData.get("respCode") ;
    				if(("00").equals(respCode)){
    					//成功,获取tn号
    					String qrCode = rspData.get("qrCode");
    					Log.e("zqh", "qrCode = "+qrCode);
    				}else{
    					//其他应答码为失败请排查原因或做失败处理
    					
    				}
    			}else{
    				LogUtil.writeErrorLog("验证签名失败");
    				//TODO 检查验证签名失败的原因
    			}
    		}else{
    			//未返回正确的http状态
    			LogUtil.writeErrorLog("未获取到返回报文或返回http状态码非200");
    		}
    		String reqMessage = DemoBase.genHtmlResult(reqData);
    		String rspMessage = DemoBase.genHtmlResult(rspData);
    		Log.e("zqh","请求报文:<br/>"+reqMessage+"<br/>" + "应答报文:</br>"+rspMessage+"");
    	}
    }
    

    三、查询

    package com.zng.unionpayqr.utils;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import android.util.Log;
    
    import com.zng.unionpayqr.sdk.AcpService;
    import com.zng.unionpayqr.sdk.LogUtil;
    import com.zng.unionpayqr.sdk.SDKConfig;
    
    public class QueryUtil {
    
    	public static void query(){
    		Map<String, String> data = new HashMap<String, String>();
    		/***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/
    		data.put("version", DemoBase.version);                 //版本号
    		data.put("encoding", DemoBase.encoding);          //字符集编码 可以使用UTF-8,GBK两种方式
    		data.put("signMethod", SDKConfig.getConfig().getSignMethod()); //签名方法
    		data.put("txnType", "00");                             //交易类型 00-默认
    		data.put("txnSubType", "00");                          //交易子类型  默认00
    		data.put("bizType", "000201");                         //业务类型 
    		
    		/***商户接入参数***/
    		data.put("merId", "777290058149059");                  //商户号码,请改成自己申请的商户号或者open上注册得来的777商户号测试
    		data.put("accessType", "0");                           //接入类型,商户接入固定填0,不需修改
    		
    		/***要调通交易以下字段必须修改***/
    		data.put("orderId", "20170712055720002");                 			//****商户订单号,每次发交易测试需修改为被查询的交易的订单号
    		data.put("txnTime", DemoBase.getCurrentTime());                			//****订单发送时间,每次发交易测试需修改为被查询的交易的订单发送时间
    		/**请求参数设置完毕,以下对请求参数进行签名并发送http post请求,接收同步应答报文------------->**/
    		
    		Map<String, String> reqData = AcpService.sign(data,DemoBase.encoding);			//报文中certId,signature的值是在signData方法中获取并自动赋值的,只要证书配置正确即可。
    		String url = SDKConfig.getConfig().getSingleQueryUrl();								//交易请求url从配置文件读取对应属性文件acp_sdk.properties中的 acpsdk.singleQueryUrl
    		Map<String, String> rspData = AcpService.post(reqData, url,DemoBase.encoding); //发送请求报文并接受同步应答(默认连接超时时间30秒,读取返回结果超时时间30秒);这里调用signData之后,调用submitUrl之前不能对submitFromData中的键值对做任何修改,如果修改会导致验签不通过
    		
    		/**对应答码的处理,请根据您的业务逻辑来编写程序,以下应答码处理逻辑仅供参考------------->**/
    		//应答码规范参考open.unionpay.com帮助中心 下载  产品接口规范  《平台接入接口规范-第5部分-附录》
    		if(!rspData.isEmpty()){
    			if(AcpService.validate(rspData, DemoBase.encoding)){
    				LogUtil.writeLog("验证签名成功");
    				if(("00").equals(rspData.get("respCode"))){//如果查询交易成功
    					String origRespCode = rspData.get("origRespCode");
    					if(("00").equals(origRespCode)){
    						//交易成功,更新商户订单状态
    						//TODO
    					}else if(("03").equals(origRespCode)||
    							 ("04").equals(origRespCode)||
    							 ("05").equals(origRespCode)){
    						//订单处理中或交易状态未明,需稍后发起交易状态查询交易 【如果最终尚未确定交易是否成功请以对账文件为准】
    						//TODO
    					}else{
    						//其他应答码为交易失败
    						//TODO
    					}
    				}else if(("34").equals(rspData.get("respCode"))){
    					//订单不存在,可认为交易状态未明,需要稍后发起交易状态查询,或依据对账结果为准
    					
    				}else{//查询交易本身失败,如应答码10/11检查查询报文是否正确
    					//TODO
    				}
    			}else{
    				LogUtil.writeErrorLog("验证签名失败");
    				//TODO 检查验证签名失败的原因
    			}
    		}else{
    			//未返回正确的http状态
    			LogUtil.writeErrorLog("未获取到返回报文或返回http状态码非200");
    		}
    			
    		String reqMessage = DemoBase.genHtmlResult(reqData);
    		String rspMessage = DemoBase.genHtmlResult(rspData);
    		Log.e("zqh","交易状态查询交易</br>请求报文:<br/>"+reqMessage+"<br/>" + "应答报文:</br>"+rspMessage+"");
    	}
    }
    
    银联测试地址:
    商户接入银联全渠道二维码测试:主扫场景:商户参考demo生成二维码后,请使用银联提供的主扫模式付款方仿真https://open.unionpay.com/ajweb/help/qrcodeFormPage/mainSweepReceiverApp发送查询订单和付款交易完成付款。被扫场景:请先使用银联提供的被扫模式付款方仿真https://open.unionpay.com/ajweb/help/qrcodeFormPage/mainSweepReceiverApp中的C2B码申请交易,申请二维码得到qrNo,然后参考demo完成扫码消费交易。测试过程中请使用我们提供的测试卡进行测试,测试卡信息:https://open.unionpay.com/ajweb/help/faq/list?id=4&level=0&from=0&keyword=%E6%B5%8B%E8%AF%95%E5%8D%A1
    以下是相关的Demo链接欢迎下载。

    点击打开链接

    github完整项目连接:https://github.com/hanfengzqh/UnionPayQR


    展开全文
  • 本规范主要规定了二维码支付中的二维码编码规则、应用场景、支付模式等,说明了相关参与主体、二维码类型等,同时考虑相关编码的可拓展性,以进一步延伸二维码支付的应用场景。
  • 银联二维码支付java 实现

    千次阅读 2017-12-13 18:28:26
     首先在银联开放平台注册一个测试账号,地址https://open.unionpay.com/ajweb/index  注册完成后可以根据自己所用的编程语言选择对应的demo下载,我下载了java通用版。    2.创建springmvc项目,将demo中的...

    1. 准备工作

        首先在银联开放平台注册一个测试账号,地址https://open.unionpay.com/ajweb/index

       注册完成后可以根据自己所用的编程语言选择对应的demo下载,我下载了java通用版。

     

      2.创建springmvc项目,将demo中的sdk包copy进项目,编写controller。

    import java.io.IOException;
    import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.ccdproject.bean.UnionpayBean;
    import com.ccdproject.unionpay.DemoBase;
    import com.ccdproject.util.DateUtil;
    import com.ccdproject.util.ZxingQrcode;
    import com.unionpay.acp.sdk.AcpService;
    import com.unionpay.acp.sdk.LogUtil;
    import com.unionpay.acp.sdk.SDKConfig;
    import com.unionpay.acp.sdk.SDKConstants;
    
    /**
     * 银联扫码支付
     * 1.获取二维码值
     * 主扫申请二维码交易
     * @author Austin
     *
     */
    @Controller
    @RequestMapping("/unionpay")
    public class Unionpay extends HttpServlet {
    	
    	/**
    	 * 序列化
    	 */
    	private static final long serialVersionUID = 1L;
    	
    	@RequestMapping("/unionpayqrcode")
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		SDKConfig.getConfig().loadPropertiesFromSrc();// 从classpath加载acp_sdk.properties文件
    		String merId = UnionpayBean.merId;
    		String txnAmt = req.getParameter("txnAmt");
    		// 生成商户订单号  orderId
            String  orderId = DateUtil.OrderId();
            orderId += String.valueOf(4);
    	    String txnTime = DateUtil.ordertxnTime(); //订单时间
    		Map<String, String> contentData = new HashMap<String, String>();
    		
    		/***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/
    		contentData.put("version", DemoBase.version);            //版本号 全渠道默认值
    		contentData.put("encoding", DemoBase.encoding);     //字符集编码 可以使用UTF-8,GBK两种方式
    		contentData.put("signMethod", SDKConfig.getConfig().getSignMethod()); //签名方法  默认01
    		contentData.put("txnType", "01");              		 	//交易类型 01:消费
    		contentData.put("txnSubType", "07");           		 	//交易子类 07:申请消费二维码
    		contentData.put("bizType", "000000");          		 	//填写000000
    		contentData.put("channelType", "08");          		 	//渠道类型 08手机
    
    		/***商户接入参数***/
    		contentData.put("merId", merId);   		 				//商户号码,请改成自己申请的商户号或者open上注册得来的777商户号测试
    		contentData.put("accessType", "0");            		 	//接入类型,商户接入填0 ,不需修改(0:直连商户, 1: 收单机构 2:平台商户)
    		contentData.put("orderId", orderId);        	 	    //商户订单号,8-40位数字字母,不能含“-”或“_”,可以自行定制规则	
    		contentData.put("txnTime", txnTime);		 		    //订单发送时间,取系统时间,格式为YYYYMMDDhhmmss,必须取当前时间,否则会报txnTime无效
    		contentData.put("txnAmt", txnAmt);						//交易金额 单位为分,不能带小数点
    		contentData.put("currencyCode", "156");                 //交易币种 境内商户固定 156 人民币
    
    		// 请求方保留域,
            // 透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据。
            // 出现部分特殊字符时可能影响解析,请按下面建议的方式填写:
            // 1. 如果能确定内容不会出现&={}[]"'等符号时,可以直接填写数据,建议的方法如下。
    //		contentData.put("reqReserved", "透传信息1|透传信息2|透传信息3");
            // 2. 内容可能出现&={}[]"'符号时:
            // 1) 如果需要对账文件里能显示,可将字符替换成全角&={}【】“‘字符(自己写代码,此处不演示);
            // 2) 如果对账文件没有显示要求,可做一下base64(如下)。
            //    注意控制数据长度,实际传输的数据长度不能超过1024位。
            //    查询、通知等接口解析时使用new String(Base64.decodeBase64(reqReserved), DemoBase.encoding);解base64后再对数据做后续解析。
    //		contentData.put("reqReserved", Base64.encodeBase64String("任意格式的信息都可以".toString().getBytes(DemoBase.encoding)));
    					
    		//后台通知地址(需设置为外网能访问 http https均可),支付成功后银联会自动将异步通知报文post到商户上送的该地址,【支付失败的交易银联不会发送后台通知】
    		//后台通知参数详见open.unionpay.com帮助中心 下载  产品接口规范  网关支付产品接口规范 消费交易 商户通知
    		//注意:1.需设置为外网能访问,否则收不到通知    2.http https均可  3.收单后台通知后需要10秒内返回http200或302状态码 
    		//    4.如果银联通知服务器发送通知后10秒内未收到返回状态码或者应答码非http200或302,那么银联会间隔一段时间再次发送。总共发送5次,银联后续间隔1、2、4、5 分钟后会再次通知。
    		//    5.后台通知地址如果上送了带有?的参数,例如:http://abc/web?a=b&c=d 在后台通知处理程序验证签名之前需要编写逻辑将这些字段去掉再验签,否则将会验签失败
    		contentData.put("backUrl", DemoBase.backUrl);
    		System.out.println(SDKConfig.getConfig().getBackUrl()+"=SDKConfig.getConfig().getBackUrl()");
    		
    		/**对请求参数进行签名并发送http post请求,接收同步应答报文**/
    		Map<String, String> reqData = AcpService.sign(contentData,DemoBase.encoding);			 //报文中certId,signature的值是在signData方法中获取并自动赋值的,只要证书配置正确即可。
    		String requestAppUrl = SDKConfig.getConfig().getBackRequestUrl();								 //交易请求url从配置文件读取对应属性文件acp_sdk.properties中的 acpsdk.backTransUrl
    		Map<String, String> rspData = AcpService.post(reqData,requestAppUrl,DemoBase.encoding);  //发送请求报文并接受同步应答(默认连接超时时间30秒,读取返回结果超时时间30秒);这里调用signData之后,调用submitUrl之前不能对submitFromData中的键值对做任何修改,如果修改会导致验签不通过
    		System.out.println("rspData="+rspData);
    		/**对应答码的处理,请根据您的业务逻辑来编写程序,以下应答码处理逻辑仅供参考------------->**/
    		//应答码规范参考open.unionpay.com帮助中心 下载  产品接口规范  《平台接入接口规范-第5部分-附录》
    		if(!rspData.isEmpty()){
    			if(AcpService.validate(rspData, DemoBase.encoding)){
    				LogUtil.writeLog("验证签名成功");
    				String respCode = rspData.get("respCode");
    				if(("00").equals(respCode)){
    					//成功,获取tn(银联订单号)
    					String orderId2 = rspData.get("orderId");
    					System.out.println(orderId2);
    					String qrCode = rspData.get("qrCode");
    					System.out.println(qrCode);
    					ZxingQrcode.zxingqrcode(qrCode, resp);
    				}else{
    					//其他应答码为失败请排查原因或做失败处理
    					//TODO
    				}
    			}else{
    				LogUtil.writeErrorLog("验证签名失败");
    				System.out.println("验证签名失败");
    				//TODO 检查验证签名失败的原因
    			}
    		}else{
    			//未返回正确的http状态
    			LogUtil.writeErrorLog("未获取到返回报文或返回http状态码非200");
    			System.out.println("未获取到返回报文或返回http状态码非200");
    		}
    		String reqMessage = DemoBase.genHtmlResult(reqData);
    		String rspMessage = DemoBase.genHtmlResult(rspData);
    		resp.getWriter().write("请求报文:<br/>"+reqMessage+"<br/>" + "应答报文:</br>"+rspMessage+"");
    	}
    	
    	/***
    	 * unionpay 异步通知支付结果
    	 * @param req
    	 * @param resp
    	 * @throws IOException
    	 */
    	@RequestMapping("/Notify")
    	public void Notifyunionpay(HttpServletRequest req,HttpServletResponse resp) throws IOException{
    		// 获取银联post过来的信息
    		System.out.println("BackRcvResponse接收后台通知开始");
    		String encoding = req.getParameter(SDKConstants.param_encoding);
    		Map<String, String> reqParam = getAllRequestParam(req);
    		LogUtil.printRequestLog(reqParam);
    
    		Map<String, String> valideData = null;
    		if (null != reqParam && !reqParam.isEmpty()) {
    			Iterator<Entry<String, String>> it = reqParam.entrySet().iterator();
    			valideData = new HashMap<String, String>(reqParam.size());
    			while (it.hasNext()) {
    				Entry<String, String> e = it.next();
    				String key = (String) e.getKey();
    				String value = (String) e.getValue();
    				
    				valideData.put(key, value);
    			}
    		}
    
    		//重要!验证签名前不要修改reqParam中的键值对的内容,否则会验签不过
    		if (!AcpService.validate(valideData, encoding)) {
    			LogUtil.writeLog("验证签名结果[失败].");
    			System.out.println("验证签名结果[失败].");
    			//验签失败,需解决验签问题
    			
    		} else {
    			LogUtil.writeLog("验证签名结果[成功].");
    			System.out.println("验证签名结果[成功].");
    			//【注:为了安全验签成功才应该写商户的成功处理逻辑】交易成功,更新商户订单状态
    			
    			String orderId =valideData.get("orderId"); //获取后台通知的数据,其他字段也可用类似方式获取
    
    			String respCode = valideData.get("respCode");
    			//判断respCode=00、A6后,对涉及资金类的交易,请再发起查询接口查询,确定交易成功后更新数据库。
    		}
    		LogUtil.writeLog("BackRcvResponse接收后台通知结束");
    		//返回给银联服务器http 200  状态码
    		resp.getWriter().print("ok");
    	}
    	/**
    	 * 获取请求参数中所有的信息
    	 * 
    	 * @param request
    	 * @return
    	 */
    	public static Map<String, String> getAllRequestParam(final HttpServletRequest request) {
    		Map<String, String> res = new HashMap<String, String>();
    		Enumeration<?> temp = request.getParameterNames();
    		if (null != temp) {
    			while (temp.hasMoreElements()) {
    				String en = (String) temp.nextElement();
    				String value = request.getParameter(en);
    				res.put(en, value);
    				//在报文上送时,如果字段的值为空,则不上送<下面的处理为在获取所有参数数据时,判断若值为空,则删除这个字段>
    				//System.out.println("ServletUtil类247行  temp数据的键=="+en+"     值==="+value);
    				if (null == res.get(en) || "".equals(res.get(en))) {
    					res.remove(en);
    				}
    			}
    		}
    		return res;
    	}
    
    	
    }
    访问  /unionpay/unionpayqrcode?txnAmt=100出现 二维码  由于是测试账号,无法使用手机扫码支付,然后可以自己在学一个支付程序
    3.其中txmtime,orderid的生成自己设定,其中一些参数也在官方Demo上也有,具体可以参考官网。

    展开全文
  • apple pay扫银联二维码原理

    千次阅读 2019-04-24 12:56:09
    iphone相机扫描银联二维码可直接付款!,https://mp.weixin.qq.com/s/VcIKAjny3fjP6KJzFauLyQ? 经过测试,iOS 11.2 版本iPhone手机扫银联码就能跳转到apple pay网页版付款 目前银联码分几种,使用二维码工具解析...

    参考文章

    1.黑科技!iphone相机扫描银联二维码可直接付款!,https://mp.weixin.qq.com/s/VcIKAjny3fjP6KJzFauLyQ?

    经过测试,iOS 11.2 版本iPhone手机扫银联码就能跳转到apple pay网页版付款

    目前银联码分几种,使用二维码工具解析处理如下

    1.个人码

    https://qr.95516.com/00010000/0110XXXXXXXXXXXXXXXXXXXXXXXXXXXX

    2.云闪付商家码

    https://qr.95516.com/00010002/0111XXXXXXXXXXXXXXXXXXXXXXXXXXXX

    3.银联小微商户码(个人通过云闪付商户通APP申请,地推渠道通过服务商申请)

    https://qr.95516.com/00010002/6222XXXXXXXXXXXXXXXXXXXXXXXXXXXX

    4.银行聚合码非95516系自有前缀

    平安https://qrpay.yqb.com/001/48280000/48280000XXXXXXXXXXXXXXXXXXXXXXXX

    工商https://b2c.icbc.com.cn/servlet/wcqr?f=ICBCqr&X=1&T=3&P=6&I=token1&N=token2&L=token3

    5.银行聚合码95516系

    农行https://qr.95516.com/00010002/622XXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    建行https://qr.95516.com/49990012/CCBXXXXXXXXXXXXXXXXXXXXXX

    通过测试,qr.95516.com开头的二维码都能跳转apple pay,实际能用于支付的只有2和3

    跳转后的格式为

    https://qr.95516.com/UP02/qrcGtwWeb-web/front/doPay?insCd=00010002&qrNo=base64(ID)&respCode=34

    注意qrNo=base64(ID)这部分

    这部分就是通过base64编码的id,id从哪里取,取qr.95516.com开头链接最后一串32位的数字就行

    找到转换后的链接后,在safari里面直接打开也能显示apple pay支付。

     

    update2019-05-13:云闪付商家码和非地推渠道的银联小微商户码失效,地推渠道的正常

    地推渠道二维码上会有服务商的信息,扫码之后也会交易明细里会显示,如通联,浦发等,非地推二维码没有,交易明细显示的是银联

     

    展开全文
  • 提供c#源码,接口地址,appid,appkey需要自行提供,银联付款,查账等支持微信,支付宝支付,源码有接口的话可调试
  • 银联支付demo

    2017-11-24 16:09:19
    中国 银联支付的demo 有很多中语言开发...............
  • 当被问到银联最新推广的扫银联二维码打折的活动时,7-11和罗森的店员都在咨询了店长后回答称,目前他们只支持用Apple Pay这种手机支付方式刷银行卡。 虽然形式上跟微信、支付宝差不多。但实际用起来它麻烦多了,...
  • 银联卡人到人二维码付款业务是指付款人利用移动智能设备二维码付款应用(以下简 称“移动应用”)主动扫描收款人移动应用展示的二维码后在安全支付界面输入交易 要素,自主确认并发起向指定收款银联卡的付款申请,付款...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,937
精华内容 774
关键字:

银联二维码