0

I'm facing an issue in my Android app while integrating Razorpay. The WebView does not open or initialize on the first click, but from the second click onwards, it works as expected. I am getting an error for checkout; can anyone help me find and correct the issue? Here is the full code:

public class Delivery_address_details_page extends AppCompatActivity implements PaymentResultListener {

    LinearLayout page_title;
    TextView userName, userAddress, userPhone;
    Button changeAddressBtn;
    ImageView productImg;
    TextView product_name, discount_price, totalAmount, deliveryDate;
    SharedPref sharedPref;
    Button btnProceedToPayment;
    String mode, orderId, razorpayOrderId, razorpayKeySecret;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_delivery_address_details_page);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        sharedPref = new SharedPref(Delivery_address_details_page.this);

        deliveryDate = findViewById(R.id.deliveryDate);

        page_title = findViewById(R.id.page_title);
        page_title.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });

        btnProceedToPayment = findViewById(R.id.btnProceedToPayment);

        userName = findViewById(R.id.userName);
        userAddress = findViewById(R.id.userAddress);
        userPhone = findViewById(R.id.userPhone);

        productImg = findViewById(R.id.productImg);
        product_name = findViewById(R.id.product_name);
        discount_price = findViewById(R.id.discount_price);
        totalAmount = findViewById(R.id.totalAmount);

        productImg.setImageBitmap(sharedPref.getImage("product_img"));
        product_name.setText(sharedPref.getString("product_name"));
        discount_price.setText(sharedPref.getString("discount_price"));
        totalAmount.setText(sharedPref.getString("discount_price"));

        loadDefaultDeliveryAddressViaServer();
        loadDeliveryDateViaServer();

        changeAddressBtn = findViewById(R.id.changeAddressBtn);
        changeAddressBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), Choose_delivery_address_page.class);
                startActivity(intent);
            }
        });

        // checkout preload razorpay
        try {
            Checkout.preload(Delivery_address_details_page.this);
        } catch (Exception e){
            Log.e("OrderApi", "Error in checkout preload : "+e.getMessage());
            Toast.makeText(this, "Checkout", Toast.LENGTH_SHORT).show();
        }

        ProgressBar progressBar_btn = findViewById(R.id.progressBar_btn);
        btnProceedToPayment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                progressBar_btn.setVisibility(View.VISIBLE);
                btnProceedToPayment.setText("");

                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {

                        if ("buynow".equals(getIntent().getStringExtra("fromPage"))) {
                            placeOrderViaServer();
                        } else if ("cart".equals(getIntent().getStringExtra("fromPage"))) {
                            placeCartOrderViaServer();
                        }

                        progressBar_btn.setVisibility(View.GONE);
                        btnProceedToPayment.setText("Place Order");
                    }
                }, 400);
            }
        });
    }


    private void setPaymentMode(String mode, String orderId, String razorpayOrderId, String keySecret) {
        this.mode = mode;
        this.orderId = orderId;
        this.razorpayOrderId = razorpayOrderId;
        this.razorpayKeySecret = keySecret;
    }

    private String getRazorpayOrderId() {
        return razorpayOrderId;
    }

    private String getMode() {
        return mode;
    }

    public String getOrderId() {
        return orderId;
    }

    private void placeCartOrderViaServer() {

        JSONObject order = new JSONObject();
        try {
            order.put("paymentMethod", "ONLINE");
            order.put("deliveryAddressId", sharedPref.getString("deliveryAddressId"));
        } catch (JSONException e) {
            throw new RuntimeException(e);
        }

        OrderApi.placeCartOrder(Delivery_address_details_page.this, order, new OrderApi.ApiCallback() {
            @Override
            public void onSuccess(JSONObject response) throws JSONException {
                Log.d("OrderApi", response.toString());

                String razorpayOrderId = response.getString("razorpayOrderId");
                String amount = response.getString("amount");
                String currency = response.getString("currency");
                String key = response.getString("key");
                String keySecret = response.optString("keySecret", "null");
                String message = response.getString("message");
                String orderId = response.getString("orderId");

                Log.d("OrderApi","amount "+ amount);

                //                if cart order details are saved to the database, then start payment
                startPaymentViaRazorpay(razorpayOrderId, amount, currency, key, keySecret, message, orderId, "cart");


                //                Toast.makeText(Delivery_address_details_page.this, "Order placed !", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onError(String error) {
                Log.e("OrderApi", error);
                Toast.makeText(Delivery_address_details_page.this, "Error in placing order", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void placeOrderViaServer() {

        JSONObject order = new JSONObject();
        try {
            order.put("productId", sharedPref.getString("productId"));
            order.put("quantity", sharedPref.getString("productQuantity"));
            order.put("paymentMethod", "ONLINE");
        } catch (JSONException e) {
            throw new RuntimeException(e);
        }

        OrderApi.placeOrder(Delivery_address_details_page.this, order, new OrderApi.ApiCallback() {
            @Override
            public void onSuccess(JSONObject response) throws JSONException {
                Log.d("OrderApi", response.toString());

                String razorpayOrderId = response.getString("razorpayOrderId");
                String amount = response.getString("amount");
                String currency = response.getString("currency");
                String key = response.getString("key");
                String keySecret = response.optString("keySecret", "null");
                String message = response.getString("message");
                String orderId = response.getString("orderId");

                //                if order details are saved to the database, then start payment
                startPaymentViaRazorpay(razorpayOrderId, amount, currency, key, keySecret, message, orderId, "direct");

                //                Toast.makeText(Delivery_address_details_page.this, "Order placed !", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onError(String error) {
                Log.e("OrderApi", error);
                Toast.makeText(Delivery_address_details_page.this, "Error in placing order", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void loadDeliveryDateViaServer() {
        OrderApi.getDeliveryDate(Delivery_address_details_page.this, new OrderApi.ApiCallback() {
            @Override
            public void onSuccess(JSONObject response) {
                try {
                    String estimatedDeliveryDate = response.getString("estimatedDeliveryDate");
                    deliveryDate.setText(estimatedDeliveryDate);
                    //                    Toast.makeText(Delivery_address_details_page.this, "delivery date :" + estimatedDeliveryDate, Toast.LENGTH_SHORT).show();
                } catch (JSONException e) {
                    Log.e("DeliveryDate", e.getMessage());
                }
            }

            @Override
            public void onError(String error) {
                Toast.makeText(Delivery_address_details_page.this, "Failed to fetch delivery date !", Toast.LENGTH_SHORT).show();
            }
        });
    }


    private void startPaymentViaRazorpay(String razorpayOrderId, String total_amount, String currency, String key, String keySecret, String message, String orderId, String mode) {
        Log.d("OrderApi", "razorpay");

        //        round off the amount
        int amountInt = (int) Math.round(Double.parseDouble(total_amount)) * 100;
        Log.d("OrderApi", String.valueOf(amountInt));

        //        initialize razorpay account
        Checkout checkout = new Checkout();

        //        set key
        checkout.setKeyID(key);

        //        set img
        checkout.setImage(R.drawable.logo);

        //        initialize json object
        JSONObject jsonObject = new JSONObject();
        try {
            Log.d("OrderApi", "jsonobject");
            jsonObject.put("name", "Ranu Infotech");
            jsonObject.put("description", message);
            jsonObject.put("theme.color", "#6699ff");
            jsonObject.put("currency", currency);
            jsonObject.put("amount", amountInt);
            jsonObject.put("order_id", razorpayOrderId);

            Log.d("OrderApi", "set payment mode");
            setPaymentMode(mode, orderId, razorpayOrderId, keySecret);

            Log.d("OrderApi", "Checkout open");
            checkout.open(Delivery_address_details_page.this, jsonObject);
            Log.d("OrderApi", "Checkout opened");


        } catch (Exception e) {
            Toast.makeText(this, "Error in payment", Toast.LENGTH_SHORT).show();
            Log.e("OrderApi", "Payment failed ! " +e.getMessage());
        }
    }


    @Override
    public void onPaymentSuccess(String razorpayPaymentId) {
        //        if payment get success then verify it and change status of order in database
        Log.d("OrderApi", "payment success calling");
        verifyPaymentViaServer(razorpayPaymentId);
        Log.d("OrderApi", "payment success called");
        Toast.makeText(this, "Payment Successful", Toast.LENGTH_SHORT).show();
    }

    private void verifyPaymentViaServer(String razorpayPaymentId) {
        Log.d("OrderApi", "payment verification");
        try {
            if (razorpayOrderId == null || razorpayKeySecret == null) {
                Toast.makeText(this, "Payment data missing", Toast.LENGTH_SHORT).show();
                return;
            }

            JSONObject order = new JSONObject();
            order.put("razorpayOrderId", getRazorpayOrderId());
            order.put("razorpayPaymentId", razorpayPaymentId);
            order.put("razorpaySignature", generateSignature(razorpayOrderId, razorpayPaymentId, razorpayKeySecret));
            order.put("mode", getMode());
            order.put("productId", sharedPref.getString("productId"));
            order.put("quantity", sharedPref.getString("productQuantity"));

            Log.d("OrderApi", "payment verification called : "+order.toString());

            OrderApi.paymentVerification(Delivery_address_details_page.this, order, new OrderApi.ApiCallback() {
                @Override
                public void onSuccess(JSONObject response) throws JSONException {
                    Toast.makeText(Delivery_address_details_page.this, "Payment Verified!", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(getApplicationContext(), HomePage3.class);
                    startActivity(intent);
                    finishAffinity();
                }

                @Override
                public void onError(String error) {
                    Toast.makeText(Delivery_address_details_page.this, "Payment Failed!", Toast.LENGTH_SHORT).show();
                    Log.e("OrderApi", "Error : " + error);
                }
            });
        } catch (JSONException e) {
            Toast.makeText(this, "Payment verification error", Toast.LENGTH_SHORT).show();
        }
    }

    private String generateSignature(String orderId, String paymentId, String keySecret) {
        try {
            String payload = orderId + "|" + paymentId;
            Mac mac = Mac.getInstance("HmacSHA256");
            SecretKeySpec secretKeySpec = new SecretKeySpec(keySecret.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
            mac.init(secretKeySpec);
            byte[] hash = mac.doFinal(payload.getBytes(StandardCharsets.UTF_8));

            // Convert hash to hexadecimal string
            StringBuilder hexString = new StringBuilder();
            for (byte b : hash) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }

            return hexString.toString();
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            Log.e("Signature", "Error generating signature: " + e.getMessage());
            return "";
        }
    }


    @Override
    public void onPaymentError(int i, String s) {
        Toast.makeText(this, "Payment Failed!", Toast.LENGTH_SHORT).show();
        Log.e("Payment", "Payment Error: " + s);
    }


    private void loadDefaultDeliveryAddressViaServer() {
        DeliveryApi.getDefaultDeliveryAddress(this, new DeliveryApi.ApiCallback() {
            @Override
            public void onSuccess(JSONObject response) {
                try {
                    userName.setText(response.getString("name"));
                    userAddress.setText(response.getString("address").concat(" - ").concat(response.getString("pin")));
                    userPhone.setText(response.getString("phNumber"));

                    sharedPref.saveString("deliveryAddressId", response.getString("id"));

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onError(String error) {
                //                handle this error for bad request
                userName.setText("");
                userAddress.setText("");
                userPhone.setText("");

                changeAddressBtn.setText("Add address");
                changeAddressBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        Intent intent = new Intent(Delivery_address_details_page.this, ChangeDeliveryAddressPage.class);
                        intent.putExtra("addAddressFirstTime", "true");
                        startActivity(intent);
                    }
                });
                //                Button btnProceedToPayment = findViewById(R.id.btnProceedToPayment);
                //                btnProceedToPayment.setEnabled(false);

                Log.e("Delivery", "Error : " + error);
            }
        });
    }
}

this is the full stack trace (error i am recieving ) this is the complete error , i am recieving

                                                                    java.lang.reflect.InvocationTargetException
                                                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                                                    at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:355)
                                                                                                    at android.webkit.WebView.getFactory(WebView.java:2620)
                                                                                                    at android.webkit.WebView.ensureProviderCreated(WebView.java:2614)
                                                                                                    at android.webkit.WebView.setOverScrollMode(WebView.java:2682)
                                                                                                    at android.view.View.<init>(View.java:5613)
                                                                                                    at android.view.View.<init>(View.java:5767)
                                                                                                    at android.view.ViewGroup.<init>(ViewGroup.java:719)
                                                                                                    at android.widget.AbsoluteLayout.<init>(AbsoluteLayout.java:56)
                                                                                                    at android.webkit.WebView.<init>(WebView.java:426)
                                                                                                    at android.webkit.WebView.<init>(WebView.java:368)
                                                                                                    at android.webkit.WebView.<init>(WebView.java:350)
                                                                                                    at android.webkit.WebView.<init>(WebView.java:337)
                                                                                                    at android.webkit.WebView.<init>(WebView.java:327)
                                                                                                    at com.razorpay.Checkout.preload(Checkout.java:308)
                                                                                                    at com.example.ranu_frontend.Delivery_address_details_page.onCreate(Delivery_address_details_page.java:66)
                                                                                                    at android.app.Activity.performCreate(Activity.java:8891)
                                                                                                    at android.app.Activity.performCreate(Activity.java:8856)
                                                                                                    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1471)
                                                                                                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3973)
                                                                                                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4144)
                                                                                                    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
                                                                                                    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
                                                                                                    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:99)
                                                                                                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2589)
                                                                                                    at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                    at android.os.Looper.loopOnce(Looper.java:224)
                                                                                                    at android.os.Looper.loop(Looper.java:318)
                                                                                                    at android.app.ActivityThread.main(ActivityThread.java:8780)
                                                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                                                    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:561)
                                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1013)
                                                                                                Caused by: java.lang.RuntimeException: Package not found: com.google.android.webview
                                                                                                    at android.webkit.WebViewDelegate.getPackageId(WebViewDelegate.java:159)
                                                                                                    at com.android.webview.chromium.WebViewChromiumFactoryProvider.<init>(chromium-TrichromeWebViewGoogle6432.aab-stable-720404533:353)
                                                                                                    at com.android.webview.chromium.WebViewChromiumFactoryProviderForT.<init>(chromium-TrichromeWebViewGoogle6432.aab-stable-720404533:1)
                                                                                                    at com.android.webview.chromium.WebViewChromiumFactoryProviderForT.create(chromium-TrichromeWebViewGoogle6432.aab-stable-720404533:3)
                                                                                                    at java.lang.reflect.Method.invoke(Native Method) 
                                                                                                    at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:355) 
                                                                                                    at android.webkit.WebView.getFactory(WebView.java:2620) 
                                                                                                    at android.webkit.WebView.ensureProviderCreated(WebView.java:2614) 
                                                                                                    at android.webkit.WebView.setOverScrollMode(WebView.java:2682) 
                                                                                                    at android.view.View.<init>(View.java:5613) 
                                                                                                    at android.view.View.<init>(View.java:5767) 
                                                                                                    at android.view.ViewGroup.<init>(ViewGroup.java:719) 
                                                                                                    at android.widget.AbsoluteLayout.<init>(AbsoluteLayout.java:56) 
                                                                                                    at android.webkit.WebView.<init>(WebView.java:426) 
                                                                                                    at android.webkit.WebView.<init>(WebView.java:368) 
                                                                                                    at android.webkit.WebView.<init>(WebView.java:350) 
                                                                                                    at android.webkit.WebView.<init>(WebView.java:337) 
                                                                                                    at android.webkit.WebView.<init>(WebView.java:327) 
                                                                                                    at com.razorpay.Checkout.preload(Checkout.java:308) 
                                                                                                    at com.example.ranu_frontend.Delivery_address_details_page.onCreate(Delivery_address_details_page.java:66) 
                                                                                                    at android.app.Activity.performCreate(Activity.java:8891) 
                                                                                                    at android.app.Activity.performCreate(Activity.java:8856) 
                                                                                                    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1471) 
                                                                                                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3973) 
                                                                                                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4144) 
                                                                                                    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
                                                                                                    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) 
                                                                                                    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:99) 
                                                                                                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2589) 
                                                                                                    at android.os.Handler.dispatchMessage(Handler.java:106) 
                                                                                                    at android.os.Looper.loopOnce(Looper.java:224) 
                                                                                                    at android.os.Looper.loop(Looper.java:318) 
                                                                                                    at android.app.ActivityThread.main(ActivityThread.java:8780) 
                                                                                                    at java.lang.reflect.Method.invoke(Native Method) 
                                                                                                    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:561) 
                                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1013) 

2025-07-05 08:48:31.761 8001-8001 Razorpay com.example.ranu_frontend E Cause: java.lang.reflect.InvocationTargetException

6
  • It seems like you have put a lot of logs in place. Care to share what the output is on the first click? Commented Jul 4 at 7:12
  • on first click , i recieve this error : Checkout failed: java.lang.reflect.InvocationTargetException Commented Jul 4 at 7:31
  • Can you edit your question and share the full stack trace? Commented Jul 4 at 8:06
  • yes, i did it,, please check Commented Jul 4 at 9:35
  • I don't see any stacktrace. Commented Jul 4 at 17:15

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.