- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将 PayUBiz 集成到我的 Android 应用程序中。我已经从 here. 下载了示例应用程序
它在测试环境中运行良好。虽然将实时 merchantId 和其他东西(如我的服务器 url)用于生成哈希,但它不起作用。它给出“缺少强制参数散列”。
我试过的如下。
第一步:调用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);
}
第二步:调用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);
}
第三步:调用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);
}
}
第四步:其他方法
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 + "&";
}
最佳答案
在 Android 应用程序中,您必须设置 3 个强制哈希键,否则您将收到错误“强制哈希键丢失”。确保您已将这 3 个键设置为 payuHashes 对象。
payuHashes.setPaymentHash(response.getString(key));
payuHashes.setVasForMobileSdkHash(response.getString(key));
payuHashes.setPaymentRelatedDetailsForMobileSdkHash(response.getString(key));
关于android - PayUBiz-安卓 : getting Mandatory param hash is missing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43762234/
当另一个 [关联] 字段具有特定值时,如何使必填字段成为非必填字段? 假设我有以下模型: class foo(models.Model): bar = models.CharField(max
我有一个父表 Venue (venueId[PK],venueName) 和两个子表,Performance (performanceId[PK], performanceName) 和 Meal (
总结:我需要将 YAML 格式的数据解析为 golang 结构。是否有一种方法(库、属性)使某些字段成为必需字段,即如果某些字段不存在,则使 Unmarshal 函数返回错误? 例如想要什么:此代码中
我想知道 SSL 证书和以 https:// 开头的 URL 是否对于 Telegram 机器人的 webhook 是必需的?正如它在 https://core.telegram.org/bots/a
我需要强制使用 Django User 模型中的电子邮件字段。如何做到这一点对我来说并不明显。欢迎提出建议。我目前正在使用: from django.contrib.auth.forms import
我有以下 XSD 验证: SchemaFactory schemaFactory = SchemaFactory .newInstance(XMLConstants.W3C_XM
使用带有 的响应式图像集时如果没有断点(即没有 sizes 属性),您通常会提供不同分辨率的同一图像的多个版本,然后您在 srcset 中定义这些版本使用像素密度语法的属性,例如1x , 2x ,
不少网站不需要注册人验证他们的电子邮件,而且它们似乎运行良好,而无需您经历这种(轻微的)考验。 这种机制可以确保电子邮件的有效性并阻止不受欢迎的机器人似乎是合乎逻辑的,但是它是否适用于低用户功能的网站
我正在尝试在 wildfly 8.2.0-Final 上定义带有注释和部署描述符的消息驱动 bean。我想用注释声明配置的静态部分,用 xml 部署描述符声明变量部分。部署以下 mdb 时,出现异常。
我需要在没有沙盒的情况下分发我的应用程序,因为我需要可访问性 API。有谁知道如果我在没有启用沙盒的情况下提交应用程序是否会被拒绝(有充分的理由)? 在 Mac 中 App Store Guideli
我们有一个通过 Web Start 使用 JNLP 启动的应用程序,使用以下内容来确保应用程序仅使用最新代码运行: title.... vendor nam
我发现这令人费解且违反直觉: 为什么会这样: LoggingConfiguration config = LogManager.Configuration; config.LoggingRules.A
我在 Play 中发现了有趣的东西!框架表单验证。例如我有这样的形式: case class Foo(mystring: String, myint: Int, mybool: Boolean) {
我有一个 Activity 类,它被注释为一个调用 Action 类的组件: @Transactional(propagation = Propagation.REQUIRED, readOnly
我是 azure 管道的新手。我有使用 azure 管道的构建作业,源代码位于同一分支开发中并且运行良好,但是是否可以在单独的分支中拥有 azure 管道和源代码? 如果是这样,请帮助我 此外,我如何
我们正在尝试以编程方式在开发测试实验室中启用强制工件。我们发现:https://learn.microsoft.com/en-us/azure/templates/microsoft.devtestl
我们正在尝试以编程方式在开发测试实验室中启用强制工件。我们发现:https://learn.microsoft.com/en-us/azure/templates/microsoft.devtestl
我希望我可以设置一个 cmdlet,以便它可以使用环境变量作为参数值(如果存在),或者以其他方式提示。 function Test-Mandatory { [CmdletBinding()]
好的,首先是一些代码。这是我的 displayCollection.tag 的内容: ${irc.mgrid} 这是我从 (myq.jsp) 调用它的 JSP: 这是 irColle
这是BeanClass.java package com.practice.spring; import org.springframework.beans.factory.annotation.Re
我是一名优秀的程序员,十分优秀!