java实现银联商务扫码支付----根据银联商务扫码支付文档
新增加GitHub源码下载地址(下载导入本地即可使用,由于隐私需要,屏蔽了相关密钥、密码之类):https://github.com/wshy0924/UnionPay_Scan/tree/master(老铁别忘记留个星星~感谢!)
一、本文对接银联商务扫码支付文档,文档链接:
https://download.csdn.net/download/weixin_40550118/12113039
本文根据扫码支付文档接口,之前博客中也写过一篇关于银联商务扫码支付的案例,对接的是银联商务的公众号+服务窗支付文档,获取的url支付链接是自己封装之后生成,也可以进行扫码支付。
这篇文档是对接银联商务扫码支付文档,只需做简单的做参数传值,就可以简单的获取支付二维码,与我之前的扫码支付有一点区别:
之前的方式需要选择支付方式,比如支付宝微信,然后生成相对应的支付二维码,而本篇的方式是一码,两个app都可以扫码,由扫码文档可知,是根据先扫码的那一方判断支付,下面是文档中的描述:
直接看代码如下:
1.1 Union_ScanPayContrloloer控制层代码
/**
* a获取一次性二维码
* @param request
* @param response
* @param jsonreq
* @return
* @throws UnsupportedEncodingException
*/
@RequestMapping(value = "/onceQRCode.do", method = RequestMethod.GET)
public Map<String, Object> getOnceQRCode(HttpServletRequest request, HttpServletResponse response,
String totalAmount) throws UnsupportedEncodingException {
Map<String,Object> resultmap = new HashMap<String,Object>();
//Map<String,Object> reqmap = new HashMap<String,Object>();
resultmap = scan_unionPay.Scan_UnifiedOrder(totalAmount);
return resultmap;
}
1.2 Scan_UnionPayimpl
@Service
public class Scan_UnionPayimpl implements Union_ScanPayinf{
private final static Logger logger = LoggerFactory.getLogger(UnifiedOrderServiceimpl.class);
@Value("${para.mid}")
private String mid;
@Value("${para.tid}")
private String tid;
@Value("${para.instMid}")
private String instMid;
@Value("${para.msgSrc}")
private String msgSrc;
@Value("${para.msgSrcId}")
private String msgSrcId;
@Autowired
private UnionPayRequest unionpayrequest;
/**
* 获取支付二维码
*/
@Override
public Map<String, Object> Scan_UnifiedOrder(String totalAmount) throws UnsupportedEncodingException {
// TODO Auto-generated method stub
Map<String, Object> reqmap = new HashMap<String, Object>(); //请求银联商务map
Map<String, Object> respmap = new HashMap<String, Object>(); //接收银联商务返回map
reqmap.put("mid",this.mid); //商户号
reqmap.put("tid", this.tid); //终端号
reqmap.put("instMid", this.instMid);
reqmap.put("msgSrc", this.msgSrc); //消息来源
//reqmap.put("msgId", "UnionPay_F001"); //自定义
reqmap.put("msgType", "bills.getQRCode"); //支付类型,前端传入
//报文请求时间
String aligetTime = PayUtil.aligetTime();
logger.info("end_time = " + aligetTime);
reqmap.put("requestTimestamp", aligetTime);
//商户订单号
//reqmap.put("msgSrcId", this.msgSrcId); //来源编号
String orderid = GGitUtil.createOrderID();
StringBuffer buff = new StringBuffer();
buff.append(this.msgSrcId);
buff.append(orderid);
reqmap.put("billNo", buff);
reqmap.put("totalAmount",totalAmount); //订单金额
reqmap.put("notifyUrl", "http://www.baidu.com"); //支付结果通知地址
reqmap.put("returnUrl", "http://www.baidu.com"); //网页跳转地址
//获取二维码id
String codeid = GGitUtil.createQrCodeId();
StringBuffer codebuff = new StringBuffer();
codebuff.append(this.msgSrcId);
codebuff.append(codeid);
reqmap.put("qrCodeId", codebuff);
//生成待签名字符串并进行MD5加密
String builderSignStr = "";
try {
builderSignStr = PayUtil.builderSignStr(reqmap,UnionPayConstants.MD5KEY);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
reqmap.put("sign", builderSignStr);
logger.info("reqmap= " + reqmap);
String jsonstring = GGitUtil.MapToJson2(reqmap); //请求map转成json
logger.info("发送query post请求消息:" + jsonstring);
//接收银联商务返回map
respmap = unionpayrequest.dopost(UnionPayConstants.queryURL, jsonstring);
return respmap;
}
1.3测试结果
本次接口对接仅仅是对接接口中生成一次性支付二维码,其中还有固定二维码和半固定二维码生成,只是传递参数的不同,具体的封装见之后的总结,返回的map如下图示,其中billQRCode为二维码链接,前端接收这个链接转为二维码即可,用户扫描二维码进行支付测试。
{
"qrCodeId": "3194202001190900110874327",
"msgType": "bills.getQRCode",
"msgSrc": "WWW.TEST.COM",
"errMsg": "查询二维码成功",
"mid": "898340149000005",
"billDate": "2020-01-19",
"tid": "88880001",
"instMid": "QRPAYDEFAULT",
"responseTimestamp": "2020-01-19 09:00:19",
"errCode": "SUCCESS",
"billNo": "319420200119090011443764",
"billQRCode": "https://qr-test2.chinaums.com/bills/qrCode.do?id=3194202001190900110874327",
"sign": "C8A598A6523A516FBA7E908050D279D8",
"statuscode": "200"
}