0.需要引入微信支付SDK
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
1.生成支付二维码,前端接收到map之后,有二维码的地址等信息,前端直接展示即可。
这里使用的app_id 商户号等,都是老师的。
/**
* 根据订单编号,生成支付二维码
* @param orderNo
* @return
*/
@Override
public Map creatQrCode(String orderNo) {
try {
// 1.根据订单编号查询订单信息
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("order_no", orderNo);
Order order = orderService.getOne(queryWrapper);
// 2.使用map设置生成二维码需要的参数
Map map = new HashMap();
map.put("appid","wx74862e0dfcf69954"); //支付id
map.put("mch_id", "1558950191"); //商户号
map.put("nonce_str", WXPayUtil.generateNonceStr()); //生成随机的字符串,让每次生成的二维码不一样
map.put("body", order.getCourseTitle()); //生成二维码的名字,会显示在微信扫码后的界面
map.put("out_trade_no", orderNo); //二维码唯一的标识,只要不重复就行,这里是订单编号
map.put("total_fee", order.getTotalFee().multiply(new BigDecimal("100")).longValue()+""); //支付金额
map.put("spbill_create_ip", "127.0.0.1"); //进行支付的ip地址,实际项目使用项目的域名
map.put("notify_url", "http://guli.shop/api/order/weixinPay/weixinNotify"); //支付后回调地址
map.put("trade_type", "NATIVE"); //支付类型,NATIVE:知道价格,生成二维码
// 3.发送httpclient请求,(需要xml格式参数) 地址是微信支付的固定地址
HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
client.setXmlParam(WXPayUtil.generateSignedXml(map, "T6m9iK73b0kn9g5v426MKfHQH7X8rKwb"));
client.setHttps(true);
//执行post请求发送
client.post();
// 4.得到返回结果,结果是xml格式的
String xml = client.getContent();
// 将结果转为map
Map<String, String> map2 = WXPayUtil.xmlToMap(xml);
System.out.println("生成二维码,返回的结果"+map2);
// 最终返回数据的封装
Map resultMap = new HashMap();
resultMap.put("out_trade_no", orderNo);//订单编号
resultMap.put("course_id", order.getCourseId()); //课程编号
resultMap.put("total_fee", order.getTotalFee() + ""); // 价格
resultMap.put("result_code", map2.get("result_code")); //返回二维码状态码
resultMap.put("code_url", map2.get("code_url")); //二维码地址
return resultMap;
} catch (Exception e) {
e.printStackTrace();
throw new GuLiExeception(20001, "生成二维码时发生错误");
}
}
2.查询支付是否成功
前端每隔一秒就发一次http请求,直到支付成功或者支付失败。
后端接收到请求后,用订单编号去问微信接口,是否支付成功
/**
* 通过订单编号查询支付状态
* @param orderNo
* @return
*/
@Override
public Map<String, String> querypayStatus(String orderNo) {
try {
// 1.使用map设置生成二维码需要的参数
Map m = new HashMap<>();
m.put("appid", "wx74862e0dfcf69954");
m.put("mch_id", "1558950191");
m.put("nonce_str", WXPayUtil.generateNonceStr());
m.put("out_trade_no", orderNo);//订单编号
// 2.发送httpClient请求
HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
client.setXmlParam(WXPayUtil.generateSignedXml(m, "T6m9iK73b0kn9g5v426MKfHQH7X8rKwb"));
client.setHttps(true);
client.post();
// 3.得到返回内容
String xml = client.getContent();
Map<String, String> map = WXPayUtil.xmlToMap(xml);
System.out.println("查询订单支付状态接口返回:"+map);
return map;
} catch (Exception e) {
e.printStackTrace();
throw new GuLiExeception(20001, "在查询订单状态时发生异常");
}
}