Невозможно обработать Paytm в django rest framework
Я пытаюсь интегрировать paytm с django rest framework. Но не знаю, почему я получаю несоответствие контрольной суммы. То есть при инициации платежа генерируется checksum
, но при проверке контрольной суммы она отличается.
#Виды - инициирование платежа
context = {
"MID": settings.PAYTM_MERCHANT_ID,
"INDUSTRY_TYPE_ID": settings.PAYTM_INDUSTRY_TYPE_ID,
"WEBSITE": settings.PAYTM_WEBSITE,
"CHANNEL_ID": settings.PAYTM_CHANNEL_ID,
"CALLBACK_URL": settings.PAYTM_CALLBACK_URL,
"ORDER_ID": str(order.order_number),
"TXN_AMOUNT": str(amount),
"CUST_ID": str(user.id),
}
context["CHECKSUMHASH"] = Checksum.generate_checksum(
context, settings.PAYTM_MERCHANT_KEY
)
return Response({"context": context})
После инициации я отправляю CHECKSUMHASH
в почтовом запросе вместе с MID, ORDERID через postman и проверяю валидацию контрольной суммы
def VerifyPaytmResponse(response):
response_dict = dict()
print('in VerifyPaytmResponse 0')
if response.method == "POST":
data_dict = dict()
form = response.POST
for key in form.keys():
data_dict[key] = form[key]
print('ENTERING HERER')
if key == 'CHECKSUMHASH':
check_sum = data_dict[key]
MID = data_dict['MID']
ORDERID = data_dict['ORDERID']
verify = Checksum.verify_checksum(
data_dict, settings.PAYTM_MERCHANT_KEY, check_sum)
if verify:
STATUS_URL = settings.PAYTM_TRANSACTION_STATUS_URL
headers = {
'Content-Type': 'application/json',
}
data = '{"MID":"%s","ORDERID":"%s"}' % (MID, ORDERID)
check_resp = requests.post(
STATUS_URL, data=data, headers=headers).json()
if check_resp['STATUS'] == 'TXN_SUCCESS':
response_dict['verified'] = True
response_dict['paytm'] = check_resp
return (response_dict)
else:
response_dict['verified'] = False
response_dict['paytm'] = check_resp
return (response_dict)
else:
response_dict['verified'] = False
return (response_dict)
response_dict['verified'] = False
return response_dict
Выполняется ошибка, потому что функция проверки контрольной суммы не совпадает. Ниже приведена проверяющая функция
def generate_checksum(param_dict, merchant_key, salt=None):
params_string = __get_param_string__(param_dict)
salt = salt if salt else __id_generator__(4)
final_string = '%s|%s' % (params_string, salt)
hasher = hashlib.sha256(final_string.encode())
hash_string = hasher.hexdigest()
hash_string += salt
return __encode__(hash_string, IV, merchant_key)
def verify_checksum(param_dict, merchant_key, checksum):
# Remove checksum
if 'CHECKSUMHASH' in param_dict:
param_dict.pop('CHECKSUMHASH')
# Get salt
paytm_hash = __decode__(checksum, IV, merchant_key)
salt = paytm_hash[-4:]
return calculated_checksum == checksum
В приведенной выше функции verify_checksum
функция calculated_checksum
не равна checksum
. Поэтому верификация проходит неудачно.