Jazzcash – ОШИБКА интеграции API – «Указанный тип и версия транзакции не разрешены»Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Jazzcash – ОШИБКА интеграции API – «Указанный тип и версия транзакции не разрешены»

Сообщение Anonymous »

Ошибка интеграции платежей 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»