关于微信PC扫码支付
扫码支付 有两种模式 官网有说 这里采用简单明白的模式2
前期准备
1 需要公众号 开通了微信支付权限
2 需要微信支付商户平台账号
服务器生成订单号
发送请求 https://api.mch.weixin.qq.com/pay/unifiedorder ;
参数是xml 例如:
把 code_url 丢到页面上去
jsp
<img alt="请扫描微信支付二维码" src="/weixinPay/qrcode?codeUrl=${codeUrl }">
java
参考: 发xml的post请求
扫码
前期准备
1 需要公众号 开通了微信支付权限
2 需要微信支付商户平台账号
服务器生成订单号
发送请求 https://api.mch.weixin.qq.com/pay/unifiedorder ;
参数是xml 例如:
String xml = "<xml>" + "<appid>" + appid + "</appid>" + "<mch_id>" + mch_id + "</mch_id>" + "<nonce_str>"
+ nonce_str + "</nonce_str>" + "<sign>" + sign + "</sign>" + "<body><![CDATA[" + body + "]]></body>"
+ "<out_trade_no>" + out_trade_no + "</out_trade_no>" + "<total_fee>" + order_price + "</total_fee>"
+ "<spbill_create_ip>" + spbill_create_ip + "</spbill_create_ip>" + "<notify_url>" +
wechatNotifyUrl
+ "</notify_url>" + "<trade_type>" + trade_type + "</trade_type>" + "</xml>";
然后微信会返回参数回来 如果参数code_url 正常就最好了,这个能拿来生成支付二维码
把 code_url 丢到页面上去
jsp
<img alt="请扫描微信支付二维码" src="/weixinPay/qrcode?codeUrl=${codeUrl }">
java
@RequestMapping(value = "/weixinPay/qrcode")
public void wechatQrcodePay(HttpServletResponse response, String codeUrl) {
GenerateQrCodeUtil.encodeQrcode(codeUrl, response);
}
扫码支付就完成了
扫码完成后 为了让服务器有反应 微信会 访问 wechatNotifyUrl这个地址 告诉服务器 扫码完成 付款成功了,你可以继续后面的业务流程了
所以扫码页面开个长连接 体验应该会更好些 ,,我是不太擅长咯 而且测试的时候没有正常把 wechatNotifyUrl 用起来 所以只好略过用了其它的方式 就是交易查询订单
查询订单
页面挂个定时器 定时发请求到服务器去,让服务器去查 https://api.mch.weixin.qq.com/pay/orderquery
参数也是xml
注: 微信收钱只收整数,同时单位是分....
以上就是扫码的全部内容
扫码支付就完成了
扫码完成后 为了让服务器有反应 微信会 访问 wechatNotifyUrl这个地址 告诉服务器 扫码完成 付款成功了,你可以继续后面的业务流程了
所以扫码页面开个长连接 体验应该会更好些 ,,我是不太擅长咯 而且测试的时候没有正常把 wechatNotifyUrl 用起来 所以只好略过用了其它的方式 就是交易查询订单
查询订单
页面挂个定时器 定时发请求到服务器去,让服务器去查 https://api.mch.weixin.qq.com/pay/orderquery
参数也是xml
String xml = "<xml>" + "<appid>" + appid + "</appid>" + "<mch_id>" + mch_id + "</mch_id>" + "<nonce_str>"
+ nonce_str + "</nonce_str>" + "<sign>" + sign + "</sign>" + "<out_trade_no>" + out_trade_no+"</out_trade_no>"
+"</xml>";
如果参数无误 正常微信会返回三种情况
1 还没付钱呢,别急
2 嗯收到钱了,恭喜发财,
3 吵什么吵,早就收到钱了 不是告诉你了么
捕获到第二种情况就可以继续跑业务了 顺便再页面弹个框什么的 告诉用户付款成功
如果参数无误 正常微信会返回三种情况
1 还没付钱呢,别急
2 嗯收到钱了,恭喜发财,
3 吵什么吵,早就收到钱了 不是告诉你了么
捕获到第二种情况就可以继续跑业务了 顺便再页面弹个框什么的 告诉用户付款成功
注: 微信收钱只收整数,同时单位是分....
参考: 发xml的post请求
public static String httpPostXml(String url, String xml) {
// post请求返回结果
String str = "";
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost method = new HttpPost(url);
try {
// 解决中文乱码问题
StringEntity entity = new StringEntity(xml, "utf-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
method.setEntity(entity);
HttpResponse result = httpClient.execute(method);
url = URLDecoder.decode(url, "UTF-8");
/** 请求发送成功,并得到响应 **/
if (result.getStatusLine().getStatusCode() == 200) {
try {
/** 读取服务器返回过来的json字符串数据 **/
str = EntityUtils.toString(result.getEntity(), HTTP.UTF_8);
} catch (Exception e) {
logger.error("post请求提交失败:" + url, e);
}
}
} catch (IOException e) {
logger.error("post请求提交失败:" + url, e);
}
return str;
}
扫码
public static void encodeQrcode(String content, HttpServletResponse response) {
if (content.trim().length()==0)
return;
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
Map hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设置字符集编码类型
BitMatrix bitMatrix = null;
try {
bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 300, 300, hints);
BufferedImage image = toBufferedImage(bitMatrix);
// 输出二维码图片流
try {
ImageIO.write(image, "png", response.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (WriterException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}