APP、小程序 微信支付成功后 订单支付状态还是待支付
盘查过后发现只是自己支付中心的提供者代码的回调地址配置的是生产环境 实际需要是开发环境
但是!!! 微信文档中明确说明 微信不保证通知最终一定能成功 需要自己主动调用微信方法查询是否支付成功 之前没有做这部分处理
按照微信说的 也会存在客户端支付成功后 后台收不到回调从而无法修改订单状态等信息 微信的解释大致意思是:
微信推送支付数据流的时候是后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信会判定本次通知失败,重新发送通知,直到成功为止(在通知一直不成功的情况下,微信总共会发起10次通知,
通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m)
所以这里就需要我们自己主动去查询:接口详细说明地址(http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2)
//支付中心写一个方法 参数:String 订单号 (这里我只是做一个说明 实际要加密之类)
//创建一个API接口 参数和支付中心新写的方法一致 调用支付中心新写方法
//支付中心新方法 :创建定时任何防止一次查询有延迟
//当小程序或者app 支付成功回调后调用API 这个接口 上传一个订单号
Timer timer = new Timer(); timer.schedule(new TimerTask() { //最大重试次数 int MAX_RETRY = 5; @Override public void run() { MAX_RETRY--; //检查订单系统 WxpOrderDTO wxpOrderDTO = wxpOrderMapper.selectWxpOrder(orderNo); if (wxpOrderDTO.getStatus().equals("1")) { //取消定时器(订单支付成功) timer.cancel(); } else { //查询订单状态 WxMpPayResult payResult = wxMpService.getJSSDKPayResult(null, orderNo); if (payResult.getReturn_code().equals("SUCCESS")) { //已经支付,更新订单状态 SUCCESS ==成功 REFUND==转入退款 NOTPAY==未支付 CLOSED==订单已关闭 ACCESP==等待扣款 PAY_FAIL==支付失败 if (payResult.getResult_code().equals("SUCCESS")) { wxpOrderMapper.updateOrderStatus(orderNo); } } } if (MAX_RETRY == 0) { //取消定时器(用户取消支付) timer.cancel(); } } }, 2000, 5000);//实际处理要按照自己的业务来写 这里只是举个例子
微信的接口 参数:
/** * 该接口提供所有微信支付订单的查询,当支付通知处理异常或丢失的情时,商户可以通过该接口查询订单支付状态。 * 详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2 * @param transactionId * @param outTradeNo */ WxMpPayResult getJSSDKPayResult(String transactionId, String outTradeNo);
@Override public WxMpPayResult getJSSDKPayResult(String transactionId, String outTradeNo) { String nonce_str = System.currentTimeMillis() + ""; SortedMap<String, String> packageParams = new TreeMap<String, String>(); packageParams.put("appid", wxMpConfigStorage.getAppId()); packageParams.put("mch_id", wxMpConfigStorage.getPartnerId()); if (transactionId != null && !"".equals(transactionId.trim())) packageParams.put("transaction_id", transactionId); else if (outTradeNo != null && !"".equals(outTradeNo.trim())) packageParams.put("out_trade_no", outTradeNo); else throw new IllegalArgumentException("Either 'transactionId' or 'outTradeNo' must be given."); packageParams.put("nonce_str", nonce_str); packageParams.put("sign", WxCryptUtil.createSign(packageParams, wxMpConfigStorage.getPartnerKey())); StringBuilder request = new StringBuilder("<xml>"); for (Entry<String, String> para : packageParams.entrySet()) { request.append(String.format("<%s>%s</%s>", para.getKey(), para.getValue(), para.getKey())); } request.append("</xml>"); HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/pay/orderquery"); if (httpProxy != null) { RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); httpPost.setConfig(config); } StringEntity entity = new StringEntity(request.toString(), Consts.UTF_8); httpPost.setEntity(entity); try { CloseableHttpResponse response = httpClient.execute(httpPost); String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); XStream xstream = XStreamInitializer.getInstance(); xstream.alias("xml", WxMpPayResult.class); WxMpPayResult wxMpPayResult = (WxMpPayResult) xstream.fromXML(responseContent); return wxMpPayResult; } catch (IOException e) { throw new RuntimeException("Failed to query order due to IO exception.", e); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通