2017-05-06 98 views
3

我正在尝试将PayUBiz集成到我的Android应用程序中。它在测试环境中工作正常。PayUBiz - Android:因错误计算散列参数导致交易失败

我使用的是如下所示。

  1. 测试商家密钥/盐:gtKFFx/eCwWELxi
  2. 我们产生hash服务器网址:http://xx.xxx.xx.xx/payment/getPaymentData
  3. 成功URL - 失败网址:https://payu.herokuapp.com/success - https://payu.herokuapp.com/failure
  4. 我'正在通过orderIduserId在我们的服务器URL中生成哈希。

我可以去我可以输入测试卡细节的屏幕。但输入卡详细信息后,我得到“错误原因:由于错误计算散列参数导致交易失败”

整个错误屏幕截图如下。

enter image description here enter image description here

我在做的代码是什么样的下方。

ActivityConfirmOrder.java

private String merchantKey = "gtKFFx"; 
private String merchantSalt = "eCwWELxi"; 
private String userCredentials = merchantKey + ":" + "[email protected]"; 

private PayuConfig payuConfig; 
private PaymentParams mPaymentParams; 

在我的onCreate把

// PayUBiz initialisation 
Payu.setInstance(this); 

下面的方法不是在onCreate方法。

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"); 
    } 
} 

回答

1

我找到了解决方案,但我还没有申请。

我通过电子邮件发送给PayUBiz的客户支持,他们回复良好。 电子邮件ID:[email protected]/[email protected]

正如我在问题中提到我用测试环境测试凭据生成散列我们的服务器URL,这是我错了的地方。如果您使用测试证书您的服务器URL为散列,它将不起作用。

测试环境使用的所有相关的测试东西和LIVE环境使用的所有LIVE相关东西。

我更换我们的服务器URL与PayUBiz的测试网址https://payu.herokuapp.com/get_hash,它的工作。

相关问题