Anonymous
Jazzcash – ОШИБКА интеграции API – «Указанный тип и версия транзакции не разрешены»
Сообщение
Anonymous » 08 ноя 2024, 14:01
Ошибка интеграции платежей JazzCash: тип и версия транзакции не разрешены
Проблема
Я пытаюсь интегрировать платежный шлюз JazzCash в PHP, но получаю ответ об ошибке: «Указанный тип и версия транзакции не разрешены». Для тестирования я использую их песочницу.
Код
Вот мой класс PHP для интеграции JazzCash:
Код: Выделить всё
class JazzCashPayment {
private $merchantId;
private $password;
private $integritySalt;
private $apiUrl;
public function __construct($merchantId, $password, $integritySalt, $isProduction = false) {
$this->merchantId = $merchantId;
$this->password = $password;
$this->integritySalt = $integritySalt;
$this->apiUrl = $isProduction
? 'https://payments.jazzcash.com.pk/ApplicationAPI/API/2.0/Purchase/DoMWalletTransaction'
: 'https://sandbox.jazzcash.com.pk/ApplicationAPI/API/2.0/Purchase/DoMWalletTransaction';
}
public function initializePayment($amount, $mobileNumber, $cnic) {
date_default_timezone_set('Asia/Karachi');
$DateTime = new DateTime();
$dateTime = $DateTime->format('YmdHis');
//------------------------------------------------------
//------------------------------------------------------
//expiry date, add 1 hour to $DateTime
$ExpiryDateTime = $DateTime;
$ExpiryDateTime->modify('+' . 1 . ' day');
$expiryDateTime = $ExpiryDateTime->format('YmdHis');
//------------------------------------------------------
$txnRefNo = 'Sol' . $dateTime;
// $amount = 100 * $amount;
// Create data array with exact structure and order
$data = array(
"pp_CNIC" => $cnic,
"pp_MobileNumber" => $mobileNumber,
"pp_Language" => "EN",
"pp_MerchantID" => $this->merchantId,
"pp_Password" => $this->password,
"pp_BankID" => "",
"pp_ProductID" => "",
"pp_TxnRefNo" => $txnRefNo,
"pp_Amount" => $amount,
"pp_TxnCurrency" => "PKR",
"pp_TxnDateTime" => $dateTime,
"pp_BillReference" => "billRef3781",
"pp_Description" => "Test case description",
"pp_TxnExpiryDateTime" => $expiryDateTime, // Can be modified for different expiry
"pp_SecureHash" => "",
"ppmpf_1" => $mobileNumber,
"ppmpf_2" => "",
"ppmpf_3" => "",
"ppmpf_4" => "",
"ppmpf_5" => ""
);
// Generate and add secure hash
$data['pp_SecureHash'] = $this->generateSecureHash($data);
echo '
';
print_r($data);
echo '';
return $this->makeApiRequest($data);
}
public function generateSecureHash($data) {
// Step 1: Collect only pp-prefixed fields, excluding pp_SecureHash, pp_TxnType, and pp_Version
$ppData = [];
foreach ($data as $key => $value) {
$lowerKey = strtolower($key);
if (strpos($lowerKey, 'pp') === 0 && $lowerKey !== 'pp_securehash' && $lowerKey !== 'pp_txntype' && $lowerKey !== 'pp_version') {
$ppData[$lowerKey] = $value;
}
}
// Step 2: Sort fields by ASCII alphabetical order of keys
ksort($ppData);
// Step 3: Build the hash string by concatenating values with `&` separator
$hashString = '';
foreach ($ppData as $key => $value) {
if ($value !== "") { // Only non-empty values
$hashString .= ($hashString ? '&' : '') . $value;
}
}
// Step 4: Prepend Integrity Salt
$finalHashString = $this->integritySalt . '&' . $hashString;
// Step 5: Generate the HMAC hash with SHA-256
return strtoupper(hash_hmac('sha256', $finalHashString, $this->integritySalt));
}
/**
* Debug method to verify hash generation
*/
public function debugHash($data) {
echo "Input Data:\n";
print_r($data);
// Remove pp_SecureHash
$ppData = $data;
unset($ppData['pp_SecureHash']);
// Sort by keys
ksort($ppData);
echo "\nSorted Data:\n";
print_r($ppData);
// Create hash string
$str = '';
foreach ($ppData as $value) {
if ($value !== "") {
$str = $str . '&' . $value;
}
}
// Add integrity salt
$str = $this->integritySalt . $str;
echo "\nHash String:\n$str\n";
// Generate hash
$hash = strtoupper(hash_hmac('sha256', $str, $this->integritySalt));
echo "\nGenerated Hash:\n$hash\n";
return $hash;
}
private function makeApiRequest($data) {
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $this->apiUrl,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Accept: application/json'
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
throw new Exception("cURL Error: " . $err);
}
return json_decode($response, true);
}
}
Использование
Код: Выделить всё
$jazzcash = new JazzCashPayment(
'XXXX', // Merchant ID
'XXXXX', // Password
'XXXX', // Integrity Salt
false // Use sandbox environment
);
$response = $jazzcash->initializePayment(
'100', // Amount
'03123456789', // Mobile Number
'345678' // CNIC
);
Ответ об ошибке
Код: Выделить всё
Array(
[pp_ResponseCode] => 110
[pp_ResponseMessage] => Provided Transaction Type and Version are not allowed.
// ... other response fields
)
Что я пробовал
Проверено, что все обязательные поля отправляются
< li>Дважды проверили создание безопасного хеша.
Подтвердили правильность URL-адреса конечной точки API.
Проверили учетные данные продавца.
< /ul>
Вопрос
Глядя на сообщение об ошибке, кажется, что мне не хватает типа и версии транзакции в запросе. Однако мне не удалось найти четкую документацию о том, как включить эти параметры. Кто-нибудь успешно интегрировал платежи JazzCash и может указать, чего мне не хватает?
Ожидаемое поведение
Платеж должен быть успешно инициализирован с предоставленными параметрами .
Дополнительный контекст
Использование PHP 7.4 и более поздних версий
Тестирование в песочнице среда
Согласно JazzCash API v2.0`
Подробнее здесь:
https://stackoverflow.com/questions/791 ... ersion-are
1731063668
Anonymous
Ошибка интеграции платежей JazzCash: тип и версия транзакции не разрешены Проблема Я пытаюсь интегрировать платежный шлюз JazzCash в PHP, но получаю ответ об ошибке: «Указанный тип и версия транзакции не разрешены». Для тестирования я использую их песочницу. Код Вот мой класс PHP для интеграции JazzCash: [code]class JazzCashPayment { private $merchantId; private $password; private $integritySalt; private $apiUrl; public function __construct($merchantId, $password, $integritySalt, $isProduction = false) { $this->merchantId = $merchantId; $this->password = $password; $this->integritySalt = $integritySalt; $this->apiUrl = $isProduction ? 'https://payments.jazzcash.com.pk/ApplicationAPI/API/2.0/Purchase/DoMWalletTransaction' : 'https://sandbox.jazzcash.com.pk/ApplicationAPI/API/2.0/Purchase/DoMWalletTransaction'; } public function initializePayment($amount, $mobileNumber, $cnic) { date_default_timezone_set('Asia/Karachi'); $DateTime = new DateTime(); $dateTime = $DateTime->format('YmdHis'); //------------------------------------------------------ //------------------------------------------------------ //expiry date, add 1 hour to $DateTime $ExpiryDateTime = $DateTime; $ExpiryDateTime->modify('+' . 1 . ' day'); $expiryDateTime = $ExpiryDateTime->format('YmdHis'); //------------------------------------------------------ $txnRefNo = 'Sol' . $dateTime; // $amount = 100 * $amount; // Create data array with exact structure and order $data = array( "pp_CNIC" => $cnic, "pp_MobileNumber" => $mobileNumber, "pp_Language" => "EN", "pp_MerchantID" => $this->merchantId, "pp_Password" => $this->password, "pp_BankID" => "", "pp_ProductID" => "", "pp_TxnRefNo" => $txnRefNo, "pp_Amount" => $amount, "pp_TxnCurrency" => "PKR", "pp_TxnDateTime" => $dateTime, "pp_BillReference" => "billRef3781", "pp_Description" => "Test case description", "pp_TxnExpiryDateTime" => $expiryDateTime, // Can be modified for different expiry "pp_SecureHash" => "", "ppmpf_1" => $mobileNumber, "ppmpf_2" => "", "ppmpf_3" => "", "ppmpf_4" => "", "ppmpf_5" => "" ); // Generate and add secure hash $data['pp_SecureHash'] = $this->generateSecureHash($data); echo ' '; print_r($data); echo ''; return $this->makeApiRequest($data); } public function generateSecureHash($data) { // Step 1: Collect only pp-prefixed fields, excluding pp_SecureHash, pp_TxnType, and pp_Version $ppData = []; foreach ($data as $key => $value) { $lowerKey = strtolower($key); if (strpos($lowerKey, 'pp') === 0 && $lowerKey !== 'pp_securehash' && $lowerKey !== 'pp_txntype' && $lowerKey !== 'pp_version') { $ppData[$lowerKey] = $value; } } // Step 2: Sort fields by ASCII alphabetical order of keys ksort($ppData); // Step 3: Build the hash string by concatenating values with `&` separator $hashString = ''; foreach ($ppData as $key => $value) { if ($value !== "") { // Only non-empty values $hashString .= ($hashString ? '&' : '') . $value; } } // Step 4: Prepend Integrity Salt $finalHashString = $this->integritySalt . '&' . $hashString; // Step 5: Generate the HMAC hash with SHA-256 return strtoupper(hash_hmac('sha256', $finalHashString, $this->integritySalt)); } /** * Debug method to verify hash generation */ public function debugHash($data) { echo "Input Data:\n"; print_r($data); // Remove pp_SecureHash $ppData = $data; unset($ppData['pp_SecureHash']); // Sort by keys ksort($ppData); echo "\nSorted Data:\n"; print_r($ppData); // Create hash string $str = ''; foreach ($ppData as $value) { if ($value !== "") { $str = $str . '&' . $value; } } // Add integrity salt $str = $this->integritySalt . $str; echo "\nHash String:\n$str\n"; // Generate hash $hash = strtoupper(hash_hmac('sha256', $str, $this->integritySalt)); echo "\nGenerated Hash:\n$hash\n"; return $hash; } private function makeApiRequest($data) { $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => $this->apiUrl, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => json_encode($data), CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Accept: application/json' ], ]); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { throw new Exception("cURL Error: " . $err); } return json_decode($response, true); } } [/code] Использование [code]$jazzcash = new JazzCashPayment( 'XXXX', // Merchant ID 'XXXXX', // Password 'XXXX', // Integrity Salt false // Use sandbox environment ); $response = $jazzcash->initializePayment( '100', // Amount '03123456789', // Mobile Number '345678' // CNIC ); [/code] Ответ об ошибке [code]Array( [pp_ResponseCode] => 110 [pp_ResponseMessage] => Provided Transaction Type and Version are not allowed. // ... other response fields ) [/code] Что я пробовал [list] [*]Проверено, что все обязательные поля отправляются < li>Дважды проверили создание безопасного хеша. [*]Подтвердили правильность URL-адреса конечной точки API. [*]Проверили учетные данные продавца. < /ul> Вопрос Глядя на сообщение об ошибке, кажется, что мне не хватает типа и версии транзакции в запросе. Однако мне не удалось найти четкую документацию о том, как включить эти параметры. Кто-нибудь успешно интегрировал платежи JazzCash и может указать, чего мне не хватает? Ожидаемое поведение Платеж должен быть успешно инициализирован с предоставленными параметрами . Дополнительный контекст [*]Использование PHP 7.4 и более поздних версий [*]Тестирование в песочнице среда [*]Согласно JazzCash API v2.0` [/list] Подробнее здесь: [url]https://stackoverflow.com/questions/79169744/jazz-cash-api-intergration-error-provided-transaction-type-and-version-are[/url]