在用户支付完过后微信会调用我们给它的异步通知地址返回支付的结果,需要注意的是我们给的通知地址是可以进行外网访问的
我使用的一些工具类方法大多是从官方给的demo,下面是下载地址
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
好了上代码
@RequestMapping("/wechatpayment")
@Transactional
public void wechatpayment(HttpServletRequest req, HttpServletResponse resp){
//读取参数
InputStream inputStream;
StringBuffer sb=new StringBuffer();
try {
inputStream=req.getInputStream();
String s ;
BufferedReader br=new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
while ((s=br.readLine())!=null) {
sb.append(s);
}
br.close();
inputStream.close();
boolean verdict;
Map<String, String> map;
//将参数转换成map
map= WXPayUtil.xmlToMap(sb.toString());
//根据订单id查询订单信息
Order order = orderService.selectOrderId(map.get("out_trade_no"));
//判断是否处理过该订单信息
//已经处理过直接返回成功的消息给微信
String xml=null;
if (order.getStatus().equals("2")){
xml="<xml>" +
" <return_code><![CDATA[SUCCESS]]></return_code>" +
" <return_msg><![CDATA[OK]]></return_msg>" +
"</xml>";
}else{
//校验签名是否正确(使用HMACSHA256签名算法)
verdict=WXPayUtil.isSignatureValid(map, WeixinPayConfig.key,WXPayConstants.SignType.HMACSHA256);
Map<String,String> result=new HashMap<>();
//判断微信返回的结果是否是交易成功
if("SUCCESS".equals(map.get("return_code"))){
//判断签名是否校验成功
if (verdict) {
BigDecimal total_fee=new BigDecimal(map.get("total_fee"));
BigDecimal price = order.getPrice();
System.out.println(total_fee.compareTo(price));
//判断与订单价格是否一致
if (total_fee.compareTo(price)==0){
//交易成功
/**
*修改订单状态
* 进行成功后的业务逻辑
*/
xml="<xml>" +
" <return_code><![CDATA[SUCCESS]]></return_code>" +
" <return_msg><![CDATA[OK]]></return_msg>" +
"</xml>";
}else {
xml="<xml>" +
" <return_code><![CDATA[FAIL]]></return_code>" +
" <return_msg><![CDATA[预订单金额不一致]]></return_msg>" +
"</xml>";
}
}else {
xml="<xml>" +
" <return_code><![CDATA[FAIL]]></return_code>" +
" <return_msg><![CDATA[签名失败]]></return_msg>" +
"</xml>";
}
}else {//未收到微信成功状态码
xml="<xml>" +
" <return_code><![CDATA[FAIL]]></return_code>" +
" <return_msg><![CDATA[未收到微信成功状态码]]></return_msg>" +
"</xml>";
}
}
PrintWriter out = resp.getWriter();
out.print(xml);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
微信的回调就这些了
微信统一下单 https://blog.csdn.net/weixin_45589505/article/details/105270203