首先我们需要到微信后台配置回调的域名信息 必须是备案通过了的然后在springboot里面放行回调地址
/**
* 支付回调通知
*
* @param request 请求参数
*/
@RequestMapping("/notify")
public void wxNotify(HttpServletRequest request) {
orderService.wxNotify(request);
}
@Override
public void wxNotify(HttpServletRequest request) {
log.info("支付回调");
// 使用requestBody 错误,顺序不一致
String data = wxPayManager.readData(request);
JSONObject jsonObject = JSONObject.parseObject(data);
// 获取微信签名
String sign = request.getHeader("Wechatpay-Signature");
// 获取时间戳
String timestamp = request.getHeader("Wechatpay-Timestamp");
// 获取证书序列号
String serial = request.getHeader("Wechatpay-Serial");
// 获取加密数据
JSONObject resource = jsonObject.getJSONObject("resource");
// 获取密文
String ciphertext = resource.getString("ciphertext");
// 附加数据
String associatedData = resource.getString("associated_data");
// 随机字符串
String nonce = request.getHeader("Wechatpay-Nonce");
// 验证微信签名
Boolean valid = wxPayManager.validSign(timestamp, nonce, data, sign, serial);
if (valid) {
String nonce2 = resource.getString("nonce");
String decrypt = wxPayManager.decryptToString(associatedData, nonce2, ciphertext);
if (StringUtils.hasLength(decrypt)) {
JSONObject object = JSONObject.parseObject(decrypt);
String outTradeNo = object.getString("out_trade_no");
// 查询订单
OrderEntity order = super.getOne(Wrappers.lambdaQuery(OrderEntity.class).eq(OrderEntity::getOrderNo, outTradeNo));
if (order != null) {
// 未支付的
if (order.getStatus() == 1) {
String tradeState = object.getString("trade_state");
// 支付成功,更改状态
if ("SUCCESS".equals(tradeState)) {
// 更改订单状态
this.updateTradeStatus(outTradeNo, PayTypeEnum.WECHAT_PAY);
}
}
} else {
throw new ServiceException("订单信息有误");
}
}
} else {
throw new ServiceException("验证签名有误");
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/39233.html