Я получаю ошибку проверки контрольной суммы в приложении PayTM для Android. Я создал контрольную сумму в php и отправляю с сервера на приложение Android. Только что приложение получило контрольную сумму, параметры снова отправятся на сервер для проверки контрольной суммы.
код приложения
public void onStartTransaction (View view){
String orderId = pref.getoId();
String uid = pref.getuid();
String email = pref.getemail();
String mobile = pref.getMobileNumber();
String checksum = pref.getchecksum();
PaytmPGService Service = PaytmPGService.getProductionService();
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("MID", "Goa3038161");
paramMap.put("ORDER_ID", orderId);
paramMap.put("CUST_ID", uid);
paramMap.put("INDUSTRY_TYPE_ID", "Retail109");
paramMap.put("CHANNEL_ID", "WAP");
paramMap.put("TXN_AMOUNT", "99");
paramMap.put("WEBSITE", "GWEB");
paramMap.put("CALLBACK_URL", "https://goalert.in/verifyChecksum.php ");
paramMap.put("EMAIL", email);
paramMap.put("MOBILE_NO", mobile);
paramMap.put("CHECKSUMHASH", checksum);
PaytmOrder Order = new PaytmOrder(paramMap);
Service.initialize(Order, null);
код сервера
generateChecksum.php
эта функция генерирует контрольную сумму и возвращает в приложение значение контрольной суммы
<?php
header("Pragma: no-cache");
header("Cache-Control: no-cache");
header("Expires: 0");
require_once("./lib/config_paytm.php");
require_once("./lib/encdec_paytm.php");
require_once 'include/DB_Functions.php';
$db = new DB_Functions();
if (isset($_POST['email']) && isset($_POST['mobile']) && isset($_POST['uid']) && isset($_POST['orderId'])){
$email = $_POST['email'];
$mobile = $_POST['mobile'];
$uid = $_POST['uid'];
$orderId = $_POST['orderId'];
}else {
// required post params is missing
$response["error"] = TRUE;
$response["error_msg"] = "Unknown error";
echo json_encode($response);
}
$checkSum = "";
// below code snippet is mandatory, so that no one can use your checksumgeneration url for other purpose .
$findme = 'REFUND';
$findmepipe = '|';
$paramList = array();
$paramList["MID"] = 'Goa8161';
$paramList["ORDER_ID"] = $orderId;
$paramList["CUST_ID"] = $uid;
$paramList["INDUSTRY_TYPE_ID"] = 'Retail109';
$paramList["CHANNEL_ID"] = 'WAP';
$paramList["TXN_AMOUNT"] = '99';
$paramList["WEBSITE"] = 'GoB';
foreach($_POST as $key=>$value)
{
$pos = strpos($value, $findme);
$pospipe = strpos($value, $findmepipe);
if ($pos === false || $pospipe === false)
{
$paramList[$key] = $value;
}
}
//Here checksum string will return by getChecksumFromArray() function.
$checkSum= getChecksumFromArray($paramList,"gPFC");
//print_r($_POST);
$response["user"]= array("CHECKSUMHASH" => $checkSum,"orderId" => $_POST["orderId"], "payt_STATUS" => "1");
echo json_encode($response);
verifyChecksum.php
эта функция проверяет контрольную сумму с сервера PayTM
Примечание: игнорируйте значения параметров ключа в середине, они заданы неверно
<?php
header("Pragma: no-cache");
header("Cache-Control: no-cache");
header("Expires: 0");
// following files need to be included
require_once("./lib/config_paytm.php");
require_once("./lib/encdec_paytm.php");
$paytmChecksum = "";
$paramList = array();
$isValidChecksum = FALSE;
$paramList = $_POST;
$return_array = $_POST;
$paytmChecksum = isset($_POST["CHECKSUMHASH"]) ? $_POST["CHECKSUMHASH"] : ""; //Sent by Paytm pg
//Verify all parameters received from Paytm pg to your application. Like MID received from paytm pg is same as your application’s MID, TXN_AMOUNT and ORDER_ID are same as what was sent by you to Paytm PG for initiating transaction etc.
$isValidChecksum = verifychecksum_e($paramList, "gPFZSi", $paytmChecksum); //will return TRUE or FALSE string.
if ($isValidChecksum===TRUE){
$return_array["IS_CHECKSUM_VALID"] = "Y";
else
$return_array["IS_CHECKSUM_VALID"] = "N";
}
$return_array["IS_CHECKSUM_VALID"] = $isValidChecksum ? "Y" : "N";
$return_array["TXNTYPE"] = "";
$return_array["REFUNDAMT"] = "";
unset($return_array["CHECKSUMHASH"]);
$encoded_json = htmlentities(json_encode($return_array));
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-I">
<title>Paytm</title>
<script type="text/javascript">
function response(){
return document.getElementById('response').value;
}
</script>
</head>
<body>
Redirect back to the app<br>
<form name="frm" method="post">
<input type="hidden" id="response" name="responseField" value='<?php echo $encoded_json?>'>
</form>
</body>
</html>
когда транзакция обрабатывается, она выдает ошибку из платежного сеанса, закрытого из-за неактивности. Когда я проверил на paytm порядок, в котором говорится об ошибке контрольной суммы
Пожалуйста, помогите решить проблему
Там может быть несколько вещей, которые могли пойти не так.
Позвольте мне кратко изложить сначала пошаговый процесс, поэтому, если вы найдете что-то, что отличается от того, что вы сделали, мы можем быстро определить ошибку.
1) Приложение обычно инициирует оплату и при этом отправляет все данные, с помощью которых необходимо сгенерировать checkSum.
2) Только сервер должен генерировать контрольную сумму (исключительно по соображениям безопасности)
3) Способ генерации контрольной суммы для оплаты и возврата отличается. По крайней мере, в Java и Python. (Это действительно глупо от Paytm, и это немного беспорядок, но это история для другого дня)
4) Приложение должно вызывать Paytm API (с SDK или без SDK), и как только ответ получен, необходимо попросить сервер проверить отправку контрольной суммы в ответе.
Предостережения: —
1) Параметры, отправляемые в Paytm, должны совпадать с параметрами, используемыми при генерации checkSum. Не менее, не более и, разумеется, пробел, введите, разбейте все значения и не пройдут проверку CheckSum.
2) Если вы обрабатываете возврат, не отправлено REFID
в генерации checkSum, но отправьте его при вызове Paytm API.
Других решений пока нет …