2017-05-03 47 views
1

我正在將PayUBiz集成到我的Android應用程序中。我已經從here.下載示例應用程序PayUBiz - Android:獲取必要的參數哈希丟失

它在測試環境中工作正常。雖然把live merchaidId和其他的東西比如我的服務器url來生成哈希,但它不起作用。它給出「強制參數哈希丟失」

我試過的東西就像下面這樣。

步驟1:致電makePayment方法。

private void makePayment() { 
    int environment = PayuConstants.PRODUCTION_ENV; 
    double totalProductPrice = 1.0; 
    double conveniencePrice = 0.0; 
    double totalPayableAmount = totalProductPrice + (totalProductPrice * (conveniencePrice/100)); 
    //int environment = PayuConstants.STAGING_ENV; 

    sharedPref = new UserSharedPref(this); 

    userCredentials = merchantKey + ":" + sharedPref.getUserEmail(); 

    mPaymentParams = new PaymentParams(); 

    mPaymentParams.setKey(merchantKey); 
    mPaymentParams.setAmount(String.valueOf(totalPayableAmount)); 
    mPaymentParams.setProductInfo("Our Store"); 
    mPaymentParams.setFirstName(sharedPref.getUserName()); 
    mPaymentParams.setEmail(sharedPref.getUserEmail()); 
    mPaymentParams.setTxnId("" + System.currentTimeMillis()); 
    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); 
    //TODO Sets the payment environment in PayuConfig object 
    payuConfig = new PayuConfig(); 
    payuConfig.setEnvironment(environment); 
    //TODO It is recommended to generate hash from server only. Keep your key and salt in server side hash generation code. 
    generatePayUHashFromServer(mPaymentParams); 
} 

步驟2:主叫generatePayUHashFromServer方法。

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(); 
    Log.e("Post PAram for Hash", postParams); 
    // lets make an api call 
    GetHashesFromServerTask getHashesFromServerTask = new GetHashesFromServerTask(); 
    getHashesFromServerTask.execute(postParams); 
} 

步驟3:調用GetHashesFromServerTask方法。

private class GetHashesFromServerTask extends AsyncTask<String, 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(String... postParams) { 
     PayuHashes payuHashes = new PayuHashes(); 
     try { 
      URL url = new URL(AppConstant.BASE_URL + "/payment/getPaymentData"); 
      String postParam = postParams[0]; 
      Log.e("Post Params", postParams[0]); 
      byte[] postParamsByte = postParam.getBytes("UTF-8"); 

      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      conn.setRequestMethod("POST"); 
      conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
      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)); 
      } 
      Log.e("Hash Response:::", responseStringBuffer.toString()); 

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

步驟4:其他方法

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

      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(); 


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

protected String concatParams(String key, String value) { 
    return key + "=" + value + "&"; 
} 

回答

1

在Android應用程序有3個強制性的哈希鍵,你必須設置否則你會得到錯誤「強制哈希鍵失蹤」。確保你已經設置這3個鍵來支持哈希對象。

  1. payuHashes.setPaymentHash(response.getString(key));

  2. payuHashes.setVasForMobileSdkHash(response.getString(key));

  3. payuHashes.setPaymentRelatedDetailsForMobileSdkHash(response.getString(key));

0

強制性帕拉姆哈希缺少

時商家不是在產生從他們的服務器PaymentRelatedDetailsForMobileSDK 哈希值,而不是被傳遞給調用PayU的Webservice的這個錯誤來。

下面是生成該散列下式:sha512(key|command|var1|salt)

Key - 商家密鑰/測試鍵

Command - payment_related_details_for_mobile_sdk

Var1 - 默認/ user_credentials

Salt - 商家鹽/測試鹽

set payuHashes.setVasForMobileSdkHash(hash); with same generated hash

看到no。在這link 2和5錯誤。