UPIハイパーリンク支払いで指定されたURLで応答を取得する方法


8

私はのような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
  • SMS経由で上記のリンクを送信しています
  • リンクをクリックすると、オプションとして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」のControllerの背後にあるコードは何ですか?ルートはありますか?postmanを使用して、それを明示的に呼び出し、期待される変数を送信できますか?あなたがそれをあなた自身と呼ぶとき、あなたはどんな反応を見ますか?
Jasper Lankhorst

お支払いが完了しました。リダイレクトURL [ test.com/payment/orderId=123456]に対してGETとPOSTの両方を試しましたが、明示的に呼び出すこともできます。私はSystem.out.println("Hello");コントローラの内部で実行しています
Nilesh Patel

コードスニペットを提供できますか?
マックスペン

@NileshPatel、/payment/orderId=123456例えばあなたが本当にブラウザから直接呼び出すことができることを確認できますか?あなたの例に基づいているので、それが可能であるべきではない- MyTwoCents'の答えを見...
ペトルBodnarさん

@PetrBodnár、私は/payment/orderId=123456Webから呼び出すことができ、正常に機能しています
Nilesh Patel

回答:


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=123456urlUPI URLに渡されるパラメーターの値として使用することです。それでも、基本的な問題とその解決策は同じです。
PetrBodnár19年

0
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();
            }
        }
    }

-1

あなたの問題は、メソッドの署名にあります。メソッドパラメータに応答を追加して、応答オブジェクトを取得できるようにしてください。メソッドを次のように変更します。

public ModelAndView credPayment(HttpServletRequest request, HttpServletResponse response)

それはすべきstackoverflow.com/questions/4564465/... あなたは何を得る反応配達員にあなたの要求を実行しようとすると?あなたに助けを提供している誰かのために-1を評価するのは良い方法ではありません
Fateh '22

井戸として、この答えをチェックしstackoverflow.com/questions/6467848/...
ファテ

UPIハイパーリンク支払いを利用したことがありますか?あなたのリンクはUPIハイパーリンクに関するものではありません。@Fateh
Nilesh Patel

結局それは問題ではありません、それはHTTPリクエストですよね?
Fateh

彼らが私たちのURLを呼んでいるかどうかという疑問があるので、それは問題ではありませんか?そして、彼らが私たちのURLを呼び出しているなら、その要求をどのように処理するのですか?
Nilesh Patel、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.