微信原生支付异步通知处理订单示例
/** * 微信支付结果通知 */ @Component @RequestMapping("/地址1/") public class WechatPayNativeResultAction { protected transient Logger logger = Logger.getLogger(this.getClass().getName()); @Autowired private IWechatTradeFlowService wechatTradeFlowService; @Autowired private PayMedicalCardBusiInfoService payMedicalCardBusiInfoService; @Autowired private IWXPaySdkService wxPaySdkService; /** * 处理支付通知 * * @return * @throws UnsupportedEncodingException */ @RequestMapping(value = "/地址2/地址3.jhtml", method = RequestMethod.POST) @ResponseBody public String payResult(HttpServletRequest request, @PathVariable String accountId) throws UnsupportedEncodingException { StringBuffer body = null; try { body = new StringBuffer(); BufferedReader reader = request.getReader(); String line = null; while ((line = reader.readLine()) != null) { body.append(line); } System.out.println(" *** 接收的通知 >>> message : " + body); if (!body.equals("")) { Map<String, String> resultMap = WXPayUtil.xmlToMap(body.toString()); WechatConfigNative aNative = WechatConfig.WECHAT_NATIVE_PAY_CONFIG.get(accountId); WXPay wxpay = new WXPay(aNative); if (!wxpay.isPayResultNotifySignatureValid(resultMap)) { System.out.println("签名效验失败==============》》》》》》》》》:" + body); return WXPaySdkServiceImpl.setXml("FAIL", "签名效验失败"); } //判断支付是否正常 if ("SUCCESS".equals(resultMap.get("return_code")) && resultMap.containsKey("result_code") && "SUCCESS".equals(resultMap.get("result_code"))) { //正常交易,进行数据修改 JSONObject jsonObj = JSONObject.fromObject(resultMap.get("attach")); String pkId = jsonObj.getString("p"); //查询订单是否通知过 WechatTradeFlow isHis = wechatTradeFlowService.selectByPrimaryKey(pkId); if (isHis.getExt1().equals("1")) { return WXPaySdkServiceImpl.setXml("SUCCESS", "OK"); } //修改微信交易订单信息 WechatTradeFlow tradeFlow = new WechatTradeFlow(); //=====支付结果信息======// tradeFlow.setId(pkId);//设置主键 tradeFlow.setTradeType(resultMap.get("trade_type"));//交易类型 tradeFlow.setPayResult(resultMap.get("result_code"));//支付结果 tradeFlow.setPayInfo(resultMap.get("attach"));//支付信息 tradeFlow.setTransactionId(resultMap.get("transaction_id"));//威富通订单号 tradeFlow.setOutTransactionId(resultMap.get("out_trade_no"));//第三方订单号 tradeFlow.setFeeType(resultMap.get("fee_type"));//货币种类 tradeFlow.setBankType(resultMap.get("bank_type"));//付款银行 tradeFlow.setBankBillno(resultMap.get("openid"));//openid tradeFlow.setTimeEnd(DateUtils.str2Date(resultMap.get("time_end"), "yyyyMMddHHmmss"));//支付完成时间 //=====修改订单状态======// tradeFlow.setWxStatus("付款完成"); tradeFlow.setExt1("1");//设置已经通知 int code = wechatTradeFlowService.updateByPrimaryKeySelective(tradeFlow); if (code > 0) { //支付成功 return WXPaySdkServiceImpl.setXml("SUCCESS", "OK"); }else { logger.error(" ***修改订单错误 >>> code : " + JSONObject.fromObject(resultMap)); //返回错误信息 return WXPaySdkServiceImpl.setXml("FAIL", "通知交易订单错误"); } } else { logger.error(" ***修改订单错误 >>> code : " + JSONObject.fromObject(resultMap)); //返回错误信息 return WXPaySdkServiceImpl.setXml("FAIL", "通知交易订单错误"); } } else { logger.error(" *** 支付失败 >>> message : " + body); return WXPaySdkServiceImpl.setXml("FAIL", "通知交易订单错误"); } } catch (Exception e) { e.printStackTrace(); logger.error(" *** 通知交易订单错误 >>> message : " + e.getMessage() + " >>> body" + body); return WXPaySdkServiceImpl.setXml("FAIL", "通知交易订单错误"); } } }
/** *给微信端返回通知结果的工具类,按标准的通知格式 */ public class WXPaySdkServiceImpl{ //通过xml 发给微信消息 public static String setXml(String return_code, String return_msg) { SortedMap<String, String> parameters = new TreeMap<String, String>(); parameters.put("return_code", return_code); parameters.put("return_msg", return_msg); return "<xml><return_code><![CDATA[" + return_code + "]]>" + "</return_code><return_msg><![CDATA[" + return_msg + "]]></return_msg></xml>"; } }
统一下单时异步通知地址 notify_url 参数必须是外网可访问的地址,不能是本地IP地址。 http://ip:端口号/地址1/地址2/地址3.jhtml 有虚拟地址的加上虚拟地址。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效