官方文档地址:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html
注意: 调用微信第三方链接Api必须使用xml格式请求才能获取数据,最终再将xml格式转换成对象,这里给大家提供了HttpClient工具类,需要大家自行在本博客其他文章中获取!
业务流程:
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
//生成微信支付二维码接口
//微信支付
@GetMapping("/createNative/{orderNo}")
public R wxPay(@PathVariable String orderNo) {
//返回相关信息 二维码地址和其他信息
Map map = payLogService.createNative(orderNo);
//自定义封装的统一返回结果(可查看博客获取)
return R.ok().data(map);
}
注意:
1、未标注自定义的都是微信Api使用的默认key和value不可以随意设置
2、HttpClient为工具类,请自行到博客中查找工具类文章获取
public Map createNative(String orderNo) {
try {
//1、根据订单号查询出订单信息
TOrder order = orderService.getOne(new QueryWrapper<TOrder>()
.lambda().eq(TOrder::getOrderNo, orderNo));
//2、使用map设置生成二维码需要的参数
Map m = new HashMap<>();
//1、设置支付参数
//关联的公众号(微信方提供)
m.put("appid", "wx74862e0dfcf69954");
//商户号(微信方提供)
m.put("mch_id", "1558950191");
//设置签名(微信方提供Api)
m.put("nonce_str", WXPayUtil.generateNonceStr());
//课程标题(自定义)
m.put("body", order.getCourseTitle());
//订单号(自定义)
m.put("out_trade_no", orderNo);
//价格 (自定义)
m.put("total_fee", order.getTotalFee()
.multiply(new BigDecimal("100")).longValue()+"");
//支付ip地址(自定义,根据服务ip,这里是调用本地服务)
m.put("spbill_create_ip", "127.0.0.1");
//回调地址(微信方提供)
m.put("notify_url","http://guli.shop/api/order/weixinPay/weixinNotify\n");
//类型 根据价格生成二维码(微信方提供)
m.put("trade_type", "NATIVE");
//3、发送httpClient请求,传递参数xml格式
// 3.1使用工具类传入固定地址(微信方提供支付地址)
HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
// 3.2设置xml格式的参数
// 传入商户key
client.setXmlParam(WXPayUtil.generateSignedXml(
m ,"T6m9iK73b0kn9g5v426MKfHQH7X8rKwb"));
client.setHttps(true);
// 3.3执行请求发送
client.post();
//4、得到发送请求返回结果
//返回内容,使用xml格式返回
String xml = client.getContent();
//把xml格式转换map集合,把map集合返回
Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
//最终返回数据的封装
Map map = new HashMap();
map.put("out_trade_no", orderNo); //默认key 传入自定义值
map.put("course_id", order.getCourseId()); //自定义
map.put("total_fee", order.getTotalFee()); //自定义
map.put("result_code", resultMap.get("result_code")); //返回二维码操作状态码
//**************二维码地址***************//
map.put("code_url", resultMap.get("code_url"));
return map;
} catch (Exception e) {
throw new GuliException(20001,"生成二维码失败");
}
}
//查询订单支付状态
//参数:订单号,根据订单查询支付状态
@GetMapping("/getOrderStatus/{orderNo}")
public R getOrderStatus(@PathVariable String orderNo) {
//查询是否存在当前订单
Map<String,String> map = payLogService.queryPayStatus(orderNo);
if (map == null) {
return R.error().message("支付出错了");
}
//存在当前订单,判断当前支付状态
//通过map获取订单状态
/**
* trade_state:
* 支付成功:SUCCESS
* 未支付:NATIVE
*/
System.out.println(map.get("trade_state"));
if (map.get("trade_state").equals("SUCCESS")) { //支付成功
//添加记录到支付表,更新订单表订单状态
payLogService.updateOrderStatus(map);
return R.ok().message("支付成功......");
}
return R.ok().code(25000).message("支付中");
}
}
//查询订单支付状态
@Override
public Map<String, String> queryPayStatus(String orderNo) {
try {
//1、封装参数
Map m = new HashMap<>();
m.put("appid", "wx74862e0dfcf69954");
m.put("mch_id", "1558950191");
m.put("out_trade_no", orderNo);
m.put("nonce_str", WXPayUtil.generateNonceStr());
//2、设置请求(固定地址)
HttpClient client = new HttpClient(
"https://api.mch.weixin.qq.com/pay/orderquery");
//转换为xml设置商户key
client.setXmlParam(WXPayUtil.generateSignedXml
(m, "T6m9iK73b0kn9g5v426MKfHQH7X8rKwb"));
client.setHttps(true);
client.post();
//3、返回第三方的数据
String xml = client.getContent();
//6、xml格式转成Map
Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
//7、返回
return resultMap;
} catch (Exception e) {
return null;
}
}
//添加支付记录和更新订单状态
@Override
public void updateOrderStatus(Map<String, String> map) {
//从map中获取订单号
String orderNo = map.get("out_trade_no");
//根据订单号查询出订单信息
TOrder order = orderService.getOne(new QueryWrapper<TOrder>().lambda().eq(TOrder::getOrderNo, orderNo));
//更新订单状态
if (order.getStatus() == 1) {
//已经支付
return;
} else {
order.setStatus(1);
orderService.updateById(order);
}
//向支付表中添加支付记录
TPayLog payLog = new TPayLog();
payLog.setOrderNo(orderNo); //订单号
payLog.setPayTime(new Date()); //订单完成时间
payLog.setPayType(1);//支付类型
payLog.setTotalFee(order.getTotalFee());//总金额(分)
payLog.setTradeState(map.get("trade_state"));//支付状态
payLog.setTransactionId(map.get("transaction_id")); //流水号
payLog.setAttr(JSONObject.toJSONString(map)); //其他值
baseMapper.insert(payLog);
}
}