PayUBiz - Android:由于计算哈希参数不正确,交易失败。

4

我正在尝试在我的Android应用程序中集成PayUBiz。在测试环境下它运行良好。

我使用的内容如下所示:

  1. 测试商户密钥/盐: gtKFFx / eCwWELxi
  2. 生成哈希的服务器URL:http://xx.xxx.xx.xx/payment/getPaymentData
  3. 成功URL-失败URL: https://payu.herokuapp.com/success - https://payu.herokuapp.com/failure
  4. 我在我们的服务器URL中传递订单ID用户ID以生成哈希。

我可以进入屏幕,输入测试卡详细信息。但是,在输入卡详细信息后,我收到"错误原因:由于计算不正确的哈希参数而导致交易失败"

整个错误截图如下。

enter image description here enter image description here

我在代码中所做的如下所示。

ActivityConfirmOrder.java

private String merchantKey = "gtKFFx";
private String merchantSalt = "eCwWELxi";
private String userCredentials = merchantKey + ":" + "maulik@techniche.co";

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("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) == '&' ? 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个回答

2

我找到了解决方案,但尚未应用。

我给PayUBiz的客户支持发送了电子邮件,他们回复得很好。 电子邮件地址:tech@payu.in / mobile-integration@payu.in

正如我在问题中提到的,我正在使用测试环境测试凭据我们的服务器URL来生成哈希值,这就是我错了的地方。如果您正在使用测试凭据您的服务器URL进行哈希,则无法工作。

测试环境中使用所有与测试相关的内容,在生产环境中使用所有与生产相关的内容。

我将我们的服务器URL替换为PayUBiz的测试URL https://payu.herokuapp.com/get_hash,现在它可以工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接