title: PayUBiz - Android: Transaction failed due to incorrectly calculated hash parameter
body: <p>I'm trying to integrate PayUBiz in my Android Application. It is working fine in test environment.</p>
  
  <p>What I'm using is like below.</p>
  
  <ol>
  <li>Test Merchant Key / Salt : <strong>gtKFFx</strong> / <strong>eCwWELxi</strong></li>
  <li>Our server URL for generating hash: <strong><a href="http://xx.xxx.xx.xx/payment/getPaymentData" rel="nofollow noreferrer">http://xx.xxx.xx.xx/payment/getPaymentData</a></strong></li>
  <li>Success URL - Failure URL: <strong><a href="https://payu.herokuapp.com/success" rel="nofollow noreferrer">https://payu.herokuapp.com/success</a> - <a href="https://payu.herokuapp.com/failure" rel="nofollow noreferrer">https://payu.herokuapp.com/failure</a></strong></li>
  <li>I'm passing <strong>orderId</strong> and <strong>userId</strong> in our server URL for generating hash.</li>
  </ol>
  
  <p>I can go to the screen where I can enter test card details. But after entering card details I'm getting <strong>"Error Reason: Transaction failed due to incorrectly calculated hash parameter"</strong></p>
  
  <p>Whole error screen-shots are below.</p>
  
  <p><a href="https://i.stack.imgur.com/EbvoO.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/EbvoO.png" alt="enter image description here"></a>
  <a href="https://i.stack.imgur.com/WBv6O.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/WBv6O.png" alt="enter image description here"></a></p>
  
  <p>What I done in code is like below.</p>
  
  <p><strong>ActivityConfirmOrder.java</strong></p>
  
  <pre><code>private String merchantKey = "gtKFFx";
  private String merchantSalt = "eCwWELxi";
  private String userCredentials = merchantKey + ":" + "maulik@techniche.co";
  
  private PayuConfig payuConfig;
  private PaymentParams mPaymentParams;
  </code></pre>
  
  <p>In onCreate I put</p>
  
  <pre><code>// PayUBiz initialisation
  Payu.setInstance(this);
  </code></pre>
  
  <p>Below methods are not in onCreate method.</p>
  
  <pre><code>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("maulik@techniche.co");
      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) == '&amp;' ? 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 + "&amp;";
  }
  
  private class GetHashesFromServerTask extends AsyncTask&lt;JSONObject, String, PayuHashes&gt; {
      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&lt;String&gt; 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&lt;A2BRequest, Void, A2BResponse&gt;().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");
      }
  }
  </code></pre>