Платежный шлюз 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,
    }

Теперь страница оплаты работает.

Вернуться на верх