I'm trying to integrate PayUBiz in my Android Application. It is working fine in test environment.
What I'm using is like below.
I can go to the screen where I can enter test card details. But after entering card details I'm getting "Error Reason: Transaction failed due to incorrectly calculated hash parameter"
Whole error screen-shots are below.
What I done in code is like below.
ActivityConfirmOrder.java
private String merchantKey = "gtKFFx";
private String merchantSalt = "eCwWELxi";
private String userCredentials = merchantKey + ":" + "[email protected]";
private PayuConfig payuConfig;
private PaymentParams mPaymentParams;
In onCreate I put
// PayUBiz initialisation
Payu.setInstance(this);
Below methods are not in onCreate method.
private void makePayment() {
int environment = PayuConstants.STAGING_ENV;
sharedPref = new UserSharedPref(this);
mPaymentParams = new PaymentParams();
mPaymentParams.setKey(merchantKey);
mPaymentParams.setAmount(String.valueOf(totalPrice));
mPaymentParams.setProductInfo("product_info");
mPaymentParams.setFirstName("Maulik");
mPaymentParams.setEmail("[email protected]");
mPaymentParams.setTxnId(OrderNumber);
mPaymentParams.setSurl("https://payu.herokuapp.com/success");
mPaymentParams.setFurl("https://payu.herokuapp.com/failure");
mPaymentParams.setUdf1("");
mPaymentParams.setUdf2("");
mPaymentParams.setUdf3("");
mPaymentParams.setUdf4("");
mPaymentParams.setUdf5("");
mPaymentParams.setUserCredentials(userCredentials);
payuConfig = new PayuConfig();
payuConfig.setEnvironment(environment);
generatePayUHashFromServer(mPaymentParams);
}
private void generatePayUHashFromServer(PaymentParams mPaymentParams) {
StringBuffer postParamsBuffer = new StringBuffer();
postParamsBuffer.append(concatParams(PayuConstants.KEY, mPaymentParams.getKey()));
postParamsBuffer.append(concatParams(PayuConstants.AMOUNT, mPaymentParams.getAmount()));
postParamsBuffer.append(concatParams(PayuConstants.TXNID, mPaymentParams.getTxnId()));
postParamsBuffer.append(concatParams(PayuConstants.EMAIL, null == mPaymentParams.getEmail() ? "" : mPaymentParams.getEmail()));
postParamsBuffer.append(concatParams(PayuConstants.PRODUCT_INFO, mPaymentParams.getProductInfo()));
postParamsBuffer.append(concatParams(PayuConstants.FIRST_NAME, null == mPaymentParams.getFirstName() ? "" : mPaymentParams.getFirstName()));
postParamsBuffer.append(concatParams(PayuConstants.UDF1, mPaymentParams.getUdf1() == null ? "" : mPaymentParams.getUdf1()));
postParamsBuffer.append(concatParams(PayuConstants.UDF2, mPaymentParams.getUdf2() == null ? "" : mPaymentParams.getUdf2()));
postParamsBuffer.append(concatParams(PayuConstants.UDF3, mPaymentParams.getUdf3() == null ? "" : mPaymentParams.getUdf3()));
postParamsBuffer.append(concatParams(PayuConstants.UDF4, mPaymentParams.getUdf4() == null ? "" : mPaymentParams.getUdf4()));
postParamsBuffer.append(concatParams(PayuConstants.UDF5, mPaymentParams.getUdf5() == null ? "" : mPaymentParams.getUdf5()));
postParamsBuffer.append(concatParams(PayuConstants.USER_CREDENTIALS, mPaymentParams.getUserCredentials() == null ? PayuConstants.DEFAULT : mPaymentParams.getUserCredentials()));
if (null != mPaymentParams.getOfferKey())
postParamsBuffer.append(concatParams(PayuConstants.OFFER_KEY, mPaymentParams.getOfferKey()));
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("orderId", orderId);
jsonObject.put("userId", sharedPref.getUserId());
} catch (JSONException e) {
e.printStackTrace();
}
// String postParams = jsonObject.toString();
// String postParams = postParamsBuffer.charAt(postParamsBuffer.length() - 1) == '&' ? postParamsBuffer.substring(0, postParamsBuffer.length() - 1).toString() : postParamsBuffer.toString();
GetHashesFromServerTask getHashesFromServerTask = new GetHashesFromServerTask();
getHashesFromServerTask.execute(jsonObject);
}
protected String concatParams(String key, String value) {
return key + "=" + value + "&";
}
private class GetHashesFromServerTask extends AsyncTask<JSONObject, String, PayuHashes> {
private ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(ActivityConfirmOrder.this);
progressDialog.setMessage("Please wait...");
progressDialog.setCancelable(false);
progressDialog.show();
}
@Override
protected PayuHashes doInBackground(JSONObject... postParams) {
PayuHashes payuHashes = new PayuHashes();
try {
URL url = new URL(AppConstant.BASE_URL + "/payment/getPaymentData");
String postParam = postParams[0].toString();
byte[] postParamsByte = postParam.getBytes("UTF-8");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Content-Length", String.valueOf(postParamsByte.length));
conn.setDoOutput(true);
conn.getOutputStream().write(postParamsByte);
InputStream responseInputStream = conn.getInputStream();
StringBuffer responseStringBuffer = new StringBuffer();
byte[] byteContainer = new byte[1024];
for (int i; (i = responseInputStream.read(byteContainer)) != -1; ) {
responseStringBuffer.append(new String(byteContainer, 0, i));
}
JSONObject response = new JSONObject(responseStringBuffer.toString());
Iterator<String> payuHashIterator = response.keys();
while (payuHashIterator.hasNext()) {
String key = payuHashIterator.next();
switch (key) {
case "payment_hash":
payuHashes.setPaymentHash(response.getString(key));
break;
case "vas_for_mobile_sdk_hash":
payuHashes.setVasForMobileSdkHash(response.getString(key));
break;
case "payment_related_details_for_mobile_sdk_hash":
payuHashes.setPaymentRelatedDetailsForMobileSdkHash(response.getString(key));
break;
case "delete_user_card_hash":
payuHashes.setDeleteCardHash(response.getString(key));
break;
case "get_user_cards_hash":
payuHashes.setStoredCardsHash(response.getString(key));
break;
case "edit_user_card_hash":
payuHashes.setEditCardHash(response.getString(key));
break;
case "save_user_card_hash":
payuHashes.setSaveCardHash(response.getString(key));
break;
case "check_offer_status_hash":
payuHashes.setCheckOfferStatusHash(response.getString(key));
break;
default:
break;
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return payuHashes;
}
@Override
protected void onPostExecute(PayuHashes payuHashes) {
super.onPostExecute(payuHashes);
progressDialog.dismiss();
launchSdkUI(payuHashes);
}
}
public void launchSdkUI(PayuHashes payuHashes) {
Intent intent = new Intent(ActivityConfirmOrder.this, PayUBaseActivity.class);
intent.putExtra(PayuConstants.PAYU_CONFIG, payuConfig);
intent.putExtra(PayuConstants.PAYMENT_PARAMS, mPaymentParams);
intent.putExtra(PayuConstants.PAYU_HASHES, payuHashes);
intent.putExtra(PayuConstants.SALT, merchantSalt);
intent.putExtra("PaymentType", "PAYU");
startActivityForResult(intent, PayuConstants.PAYU_REQUEST_CODE);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PayuConstants.PAYU_REQUEST_CODE) {
if (data != null) {
Log.e("PayuResponse", data.getStringExtra("payu_response"));
if (!data.getStringExtra("payu_response").equals("")) {
PayUSuccessRequest request = new PayUSuccessRequest(ActivityConfirmOrder.this);
try {
JSONObject paySuccessRes = new JSONObject(data.getStringExtra("payu_response"));
request.setPayUSuccessResJsonObject(paySuccessRes);
} catch (JSONException e) {
e.printStackTrace();
}
new AsyncTaskExecutor<A2BRequest, Void, A2BResponse>().execute(
new RequestProcessor(ActivityConfirmOrder.this, ActivityConfirmOrder.this, true), request);
}
try {
JSONObject responseObject = new JSONObject(data.getStringExtra("payu_response"));
if (responseObject != null) {
if (responseObject.optString("status").equalsIgnoreCase("failure")) {
Toast.makeText(mContext, "Failure..", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(ActivityConfirmOrder.this, ActivityOrderFailure.class);
ActivityConfirmOrder.this.startActivity(intent);
} else {
//Toast.makeText(getActivity(), getString(R.string.could_not_receive_data), Toast.LENGTH_LONG).show();
}
} else {
//Toast.makeText(getActivity(), getString(R.string.could_not_receive_data), Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
e.printStackTrace();
//Toast.makeText(getActivity(), getString(R.string.could_not_receive_data), Toast.LENGTH_LONG).show();
}
} else {
//Toast.makeText(getActivity(), getString(R.string.could_not_receive_data), Toast.LENGTH_LONG).show();
}
} else {
Log.e("Log MSg", "No Payu SDK Request Code");
}
}
I found the solution but I haven't applied yet.
I emailed to customer support of PayUBiz and they responded well. Email IDs: [email protected] / [email protected]
As I mentioned in question I was using TEST ENVIRONMENT and TEST CREDENTIALS and OUR SERVER URL for generating hash, this is the place where I was wrong. It won't work if you are using TEST CREDENTIALS and YOUR SERVER URL for hash.
In TEST ENVIRONMENT use all TESTING RELATED stuff and for LIVE ENVIRONMENT use all LIVE RELATED stuff.
I replaced OUR SERVER URL with PayUBiz's TEST URL https://payu.herokuapp.com/get_hash and it's working.