这是我写的notify接口代码
@PostMapping("/notify") // 注意这里必须是POST接口 public String payNotify(HttpServletRequest request) throws Exception { try{ if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) { System.out.println("=========支付宝异步回调========"); Map<String, String> params = new HashMap<>(); Map<String, String[]> requestParams = request.getParameterMap(); for (String name : requestParams.keySet()) { params.put(name, request.getParameter(name)); // System.out.println(name + " = " + request.getParameter(name)); } // 打印所有参数,便于调试 // params.forEach((key, value) -> System.out.println(key + " = " + value)); String tradeNo = params.get("out_trade_no"); String gmtPayment = params.get("gmt_payment"); String alipayTradeNo = params.get("trade_no"); // 支付宝验签Factory.Payment.Common().verifyNotify(params) if (Factory.Payment.Common().verifyNotify(params)) { // 验签通过 System.out.println("交易名称: " + params.get("subject")); System.out.println("交易状态: " + params.get("trade_status")); System.out.println("支付宝交易凭证号: " + params.get("trade_no")); System.out.println("商户订单号: " + params.get("out_trade_no")); System.out.println("交易金额: " + params.get("total_amount")); System.out.println("买家在支付宝唯一id: " + params.get("buyer_id")); System.out.println("买家付款时间: " + params.get("gmt_payment")); System.out.println("买家付款金额: " + params.get("buyer_pay_amount")); // 更新订单未已支付 Order order = new Order(); order.setId(Integer.valueOf(tradeNo)); orderMapper.updateById(order.getId()); // order.setCheckoutTime(params.get("gmt_payment")); // shopOrderMapper.updateById(order); } } return "success"; }catch (Exception e){ e.printStackTrace(); return "failure"; } }
我的主要错误显示
在这段代码主要对应的地方是
if (Factory.Payment.Common().verifyNotify(params))
也就是支付宝验签未通过,根据报错打开Client.java文件,发现是context出了问题,未初始化成功,按住ctrl点击context发现是这里未赋值成功,context未null
也就意味着是Client(Context context)这边出了问题,那么就点击初始化Client方法的地方
即这个frams结构的下一个 Common:87
继续寻找下一级context是怎么初始化的,找到是setOptions方法没有调用
之后在支付宝沙盒官网发现是setOptions没有配置。
解决方法
之后在启动文件配置一下,问题解决。
getOpitons方法参照官网自行配置Easy 版 - 支付宝文档中心 (alipay.com)
最后附上成功实现截图