【问题标题】:How to get response on url specified in UPI Hyperlink payment如何在 UPI 超链接支付中指定的 url 上获得响应
【发布时间】:2019-11-09 11:55:16
【问题描述】:

我正在尝试通过像

这样的 UPI 超链接付款
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 应用程序列表作为选项
  • 我选择了 BHIM 应用(也尝试了其他应用)
  • 然后完成支付,到现在一切正常。

UPI 支付完成后,处理对https://test.com/payment/orderId=12345 的“回调”请求的 Spring 控制器不会被调用。

那么如何正确获取Java中UPI超链接支付的响应呢?

编辑:

这是控制器方法。我也试过@GetMapping而不是@PostMapping

@PostMapping("/payment")
public ModelAndView credPayment(HttpServletRequest request) {

    String key = request.getParameter("orderId");
    String txnId = request.getParameter("txnId");
    String responseCode = request.getParameter("responseCode");
    String approvalRefNo = request.getParameter("ApprovalRefNo");
    String status = request.getParameter("Status");
    String txnRef = request.getParameter("txnRef");
    System.out.println("Parameter Names");
    while (request.getParameterNames().hasMoreElements()) {
        System.out.println(request.getParameterNames().nextElement());
    }

    System.out.println("Header Names");
    while (request.getHeaderNames().hasMoreElements()) {
        System.out.println(request.getHeaderNames().nextElement());
    }

    System.out.println("txnId : "+txnId);
    System.out.println("responseCode : "+responseCode);
    System.out.println("ApprovalRefNo : "+approvalRefNo);
    System.out.println("Status : "+status);
    System.out.println("txnRef : "+txnRef);

    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("redirect:/");
    return modelAndView;
}

【问题讨论】:

  • 您期望的是 GET 还是 POST 请求?链接后面的控制器是否也制作了? “PaymentController.java”的控制器背后的代码是什么?有路线吗?您可以使用邮递员显式调用它并发送预期的变量吗?当您自己调用它时,您会看到什么响应?
  • 付款成功。我已经为重定向 url [test.com/payment/orderId=123456] 尝试了 GET 和 POST,我也可以显式调用它。我只是在控制器内部做System.out.println("Hello");
  • 能否提供代码sn-p?
  • -我正在通过短信发送链接-当我单击链接时,它显示 UPI 应用程序列表作为选项-我选择了 BHIM 应用程序(也尝试了其他应用程序)-然后完成付款,直到现在它可以工作。 - 付款完成后重定向 url 应该被调用。但我不知道他们是否调用重定向网址。如果他们调用 url,那么我无法在给定的代码上处理它。
  • 嗨,@NileshPatel,你能从回调 URL 中获取交易状态吗?我也面临同样的问题。

标签: java spring


【解决方案1】:

如果我理解正确,您的重定向 URL 是

https://test.com/payment/orderId=123456

当它被调用时,你需要在你的控制器中获取订单 id 值。

然后尝试将您的方法更改为以下内容:

@GetMapping(value = "/payment/{order}")
public ModelAndView credPayment(@PathVariable("order") String order, HttpServletRequest request) {
    System.out.println(order); // prints orderId=123456
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("redirect:/");
    return modelAndView;
}

问题:

您已将 URL 映射配置为仅/payment,因此之后的任何内容都将被排除在此映射之外,例如:/payment/sdfdsfs

【讨论】:

  • 根据 OP 中给出的信息,这是迄今为止最相关和最有用的答案。另一种解决方案是使用正确的 url 编码形式的 https://test.com/payment?orderId=123456 作为传递给 UPI URL 的 url 参数的值。尽管如此,基本问题及其解决方案仍然相同。
【解决方案2】:
Uri myAction = Uri.parse("upi://pay?pa=******@****&pn="+"*******"+"&mc="+"&tid="+transaction_ref_id +"&tr="
                +transaction_ref_id +"&tn=Pay%20to%20*****%20*****%20App&am="+"1.00"+"&mam=null&cu=INR&url=https://mystar.com/orderid="+sOrderId);

        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(myAction);
        startActivityForResult(intent, 100);

*******************
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 100) {
            if (resultCode == RESULT_OK) {
                String res = data.getStringExtra("response");
                if (res.contains("Status=SUCCESS")) {
                    Toast.makeText(context, "Payment successful!", Toast.LENGTH_LONG).show();
                }
                else {
                    Toast.makeText(context, "Payment was not successful! Try again later", Toast.LENGTH_LONG).show();
                }
            }
            else {
                Toast.makeText(context, "Payment was not successful!", Toast.LENGTH_LONG).show();
            }
        }
    }

【讨论】:

    【解决方案3】:

    支付链接中的 URL 参数不是回调 URL。目前没有任何支付应用程序将其用于此目的。

    该 URL 仅用于向付款人提供交易信息。

    【讨论】:

      【解决方案4】:

      您的问题在于您的方法签名。尝试将响应添加到您的方法参数,以便您可以获取响应对象。将您的方法更改为:

      public ModelAndView credPayment(HttpServletRequest request, HttpServletResponse response)
      

      【讨论】:

      • 应该是stackoverflow.com/questions/4564465/… 如果您尝试在邮递员上运行您的请求,您会得到什么响应?对于为您提供帮助的人,这不是给 -1 评分的好方法
      • 您曾经使用过UPI超链接支付吗?您的链接与 UPI 超链接无关。 @Fateh
      • 到底是HTTP请求没关系吧?
      • 这很重要,因为有人质疑他们是否在调用我们的网址?如果他们正在调用我们的网址,那么如何处理该请求?
      猜你喜欢
      • 2018-02-21
      • 1970-01-01
      • 2013-11-03
      • 2020-09-03
      • 1970-01-01
      • 2019-09-26
      • 2022-06-30
      • 2017-08-04
      • 1970-01-01
      相关资源
      最近更新 更多