微信二维码扫码支付的原理
参数生成等请参考官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1
微信扫码支付。简单来说,就是你把微信支付需要的信息,生成到二维码图片中。通过微信扫一扫,发起支付。我们需要做的就是二件事:
一是:按照微信扫码支付规则生成二维码信息.
二是:微信没有提供生成二维码图片的接口。需要我们自己把二维码信息生成到二维码图片中。
1.模式选择:
微信扫码支付,有两种模式,文档中有介绍。第二种模式,微信接口会返回二维码信息给我们。而第一种模式则需要我们自己去生成二维码信息。会有些麻烦。尤其是参数大小写,还有签名的问题,容易出错。总的来说第二种模式比第一种模式简单。所有我采用的是第二种模式,比较通用。京东与携程亦用的是第二种模式。
2.调用统一下单接口获取带有二维码信息的url:(模式二)
模式二的微信扫码支付,需要先调用微信的统一下单接口,生成预交易单。(参数传递与接收都是XML 数据格式。)
正确调用后,会返回含有交易标示ID,和二维码链接的URL。
第一步先把提交的参数生成sign
第二步把参数按照微信的要求提交的形式提交到微信,微信会返回code_url给我们
第三步把返回的code_url生成二维码就可以了
使用的是google ZXing库。 提供一个 jar 地址 直接引入到自己项目即可。http://download.csdn.net/detail/gonwy/7658135
action方法
public String createQRCode(){
// 设置头信息,内容处理的方式,attachment以附件的形式打开,就是进行下载,并设置下载文件的命名
HttpServletResponse response = getResponse();
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=aaa.gif");
// 创建文件输入流
// 响应输出流
ServletOutputStream out = null;
try {
out = response.getOutputStream();
onlinePaymentFrontService.createQRTicket(weixinUrl,out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(out!=null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
service方法
/**
* 生成二维码
* @param weixinUrl
*/
public String createQRTicket(String weixinUrl, ServletOutputStream out) {
int width = 300;
int height = 300;
// 二维码的图片格式
String format = "gif";
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
// 内容所使用编码
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
try {
BitMatrix bitMatrix = new MultiFormatWriter().encode(weixinUrl,
BarcodeFormat.QR_CODE, width, height, hints);
MatrixToImageWriter.writeToStream(bitMatrix, format, out);
} catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}