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