Java中UPI超链接支付回调未触发,如何正确获取支付响应?
解决UPI支付回调未触发的问题
首先,咱们先定位核心问题:你的控制器没被调用,大概率是回调URL格式错误或者服务不可达导致的,咱们一步步拆解排查:
1. 修正UPI支付链接中的回调URL参数
你当前UPI链接里的url参数写法有问题:
https://test.com/payment/orderId=123456
orderId=123456是查询参数,不能直接拼在路径末尾,正确格式应该是把参数放在?后面:
upi://pay?pa=abc@upi&pn=payeeName&tr=1234&tn=Pay%20to%20payeeName&am=1&mam=1&cu=INR&url=https://test.com/payment?orderId=123456
只有这样,UPI应用回调时才会请求到你@PostMapping("/payment")映射的控制器路径上。
2. 兼容UPI应用的回调HTTP方法
不同UPI应用的回调请求方法可能存在差异,BHIM等主流应用通常用POST,但为了兼容所有情况,你可以让控制器同时支持GET和POST:
@RequestMapping(value = "/payment", method = {RequestMethod.GET, RequestMethod.POST}) public ModelAndView credPayment(HttpServletRequest request) { // 你的原有逻辑 }
3. 确保回调服务公网可达
如果你的https://test.com是本地测试环境(比如localhost),UPI应用的服务器根本无法访问到你的本地服务。这种情况下你需要:
- 将服务部署到公网可访问的服务器上
- 或者用本地穿透工具(如ngrok)把本地服务暴露为公网地址,替换回调URL中的域名。
4. 核对UPI回调的参数名
UPI应用传递的参数名可能和你预期的不一致,比如部分服务商的参数是全小写的status而非Status,transactionId而非txnId。你代码里已经打印了所有参数名,这很好——当回调触发后,查看控制台输出的参数名,再调整参数获取逻辑。比如改用@RequestParam更清晰直观:
@RequestMapping(value = "/payment", method = {RequestMethod.GET, RequestMethod.POST}) public ModelAndView credPayment( @RequestParam("orderId") String orderId, @RequestParam(value = "txnId", required = false) String txnId, @RequestParam(value = "responseCode", required = false) String responseCode, @RequestParam(value = "status", required = false) String status) { System.out.println("orderId: " + orderId); System.out.println("txnId: " + txnId); System.out.println("status: " + status); ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("redirect:/"); return modelAndView; }
5. 模拟回调测试
在等待UPI应用回调前,你可以用Postman直接发送请求测试控制器是否正常工作:
- 请求方法选POST或GET
- URL填
https://test.com/payment?orderId=123456 - 在Query参数或请求Body中添加模拟的UPI参数(如
txnId=test123&status=SUCCESS) - 查看控制台输出,确认控制器能正常接收参数并执行逻辑。
内容的提问来源于stack exchange,提问作者Nilesh Patel
相关产品推荐
相关产品推荐

