Платежный шлюз PayTm показывает "KeyError at /payments/response/ 'CHECKSUMHASH'" в django
Я устанавливаю платежный шлюз paytm для моего django webapp. но у меня возникла такая проблема KeyError at /payments/response/ 'CHECKSUMHASH' .
views.py
def VerifyPaytmResponse(response):
response_dict = {}
if response.method == "POST":
data_dict = {}
for key in response.POST:
data_dict[key] = response.POST[key]
MID = data_dict['MID']
ORDERID = data_dict['ORDERID']
verify = Checksum.verify_checksum(data_dict, settings.PAYTM_MERCHANT_KEY, data_dict['CHECKSUMHASH'])
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
# response_dict['pack_type'] = data_dict['PACK_TYPE']
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
@login_required
def payment(request):
order_id = Checksum.__id_generator__()
pack_type = request.GET.get('pack_type')
bill_amount = None
if pack_type == '1':
bill_amount = "199"
elif pack_type == '2':
bill_amount = "999"
data_dict = {
'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,
# 'MOBILE_NO': '7405505665',
'EMAIL': request.user.email,
'CUST_ID': '123123',
'ORDER_ID':order_id,
'TXN_AMOUNT': bill_amount,
'PACK_TYPE': pack_type,
} # This data should ideally come from database
data_dict['CHECKSUMHASH'] = Checksum.generate_checksum(data_dict, settings.PAYTM_MERCHANT_KEY)
context = {
'payment_url': settings.PAYTM_PAYMENT_GATEWAY_URL,
'comany_name': settings.PAYTM_COMPANY_NAME,
'data_dict': data_dict
}
return render(request, 'payments/payment.html', context)
@csrf_exempt
def response(request):
resp = VerifyPaytmResponse(request)
if resp['verified']:
# save success details to db; details in resp['paytm']
print(resp['paytm'])
return HttpResponse("<center><h1>Transaction Successful</h1><center>", status=200)
else:
# check what happened; details in resp['paytm']
return HttpResponse("<center><h1>Transaction Failed</h1><center>", status=400)
payment.html
<html>
<head>
<title>Redirecting...</title>
</head>
<body>
<br><br><h1><center>{{ company_name }}</center></h1><br><br><br>
<h1><center>Redirecting to payment gateway<br>Please do not refresh or go back.</center></h1>
<form method="POST" action="{{ payment_url }}", name="form1">
{% csrf_token %}
{% for key, value in data_dict.items %}
<input type="hidden" name="{{key}}" value="{{value}}">
{% endfor %}
<script type="text/javascript">
document.form1.submit();
</script>
</form>
</body>
</html>
settings.py
PAYTM_COMPANY_NAME = "Name" # For representation purposes
PAYTM_INDUSTRY_TYPE_ID = "Retail" # For staging environment
PAYTM_CHANNEL_ID = "WEB"
PAYTM_MERCHANT_KEY = "VaVxV@xUggjht6%Kx"
PAYTM_MERCHANT_ID = "lSLEKI68544667587304"
PAYTM_CALLBACK_URL = "http://localhost:8000/payments/response/" # Hardcode
PAYTM_WEBSITE = "WEBSTAGING"
PAYTM_PAYMENT_GATEWAY_URL = "https://securegw-stage.paytm.in/order/process"
PAYTM_TRANSACTION_STATUS_URL = "https://securegw-stage.paytm.in/order/status"
Когда я нажимаю на кнопку оплаты, я получаю эту ошибку, Страница оплаты не отображается.
Internal Server Error: /payments/response/
Traceback (most recent call last):
File "D:\vaitheeswaran\restaurant_qr_venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "D:\vaitheeswaran\restaurant_qr_venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\vaitheeswaran\restaurant_qr_venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "D:\vaitheeswaran\restaurant_qr_venv\Restarant_QR\payments\views.py", line 45, in response
resp = VerifyPaytmResponse(request)
File "D:\vaitheeswaran\restaurant_qr_venv\Restarant_QR\payments\utils.py", line 14, in VerifyPaytmResponse
verify = Checksum.verify_checksum(data_dict, settings.PAYTM_MERCHANT_KEY, data_dict['CHECKSUMHASH'])
KeyError: 'CHECKSUMHASH'
[09/Mar/2022 15:50:08] "POST /payments/response/ HTTP/1.1" 500 76098
В функции response(request) я получил данные, приведенные ниже. Ключи CHECKSUMHASH
ORDERID 'DnpifH'
MID 'CJhAzb77364189315875'
TXNAMOUNT '199.00'
CURRENCY 'INR'
STATUS 'TXN_FAILURE'
RESPCODE '330'
RESPMSG 'Invalid checksum'
BANKTXNID ''
Пожалуйста, помогите мне решить эту проблему. Я не могу найти ошибку.
Я решил эту ошибку. Проблема заключалась в том, что в функции payment я передал больше данных в переменную data_dict для своего использования. Поэтому процесс оплаты не вернул правильные данные в функции response.
Я просто удаляю некоторые данные в этой словарной переменной
data_dict = {
'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,
'CUST_ID': '123123',
'ORDER_ID':order_id,
'TXN_AMOUNT': bill_amount,
}
Теперь страница оплаты работает.