首先我们需要到微信后台配置回调的域名信息 必须是备案通过了的然后在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