【问题标题】:Error in generating checksumhash(Paytm Gateway) on Django在 Django 上生成校验和哈希(Paytm 网关)时出错
【发布时间】:2019-08-01 02:16:24
【问题描述】:

我正在尝试将来自 Djnago 的 PayTm 网关集成为后端,但我的程序在生成校验和哈希时遇到错误。 以下是我的代码片段:

models.py

​​>
from django.db import models
class TrxnDetail(models.Model):
    MID = models.CharField(max_length=20)
    ORDER_ID = models.CharField(max_length=50)
    CUST_ID = models.CharField(max_length=64)
    TXN_AMOUNT = models.CharField(max_length=10)
    CHANNEL_ID = models.CharField(max_length=3)
    WEBSITE = models.CharField(max_length=30)
    INDUSTRY_TYPE_ID = models.CharField(max_length=20)
    MOBILE_NO = models.CharField(max_length=15)
    EMAIL = models.CharField(max_length=50)

    def __str__(self):
        return self.ORDER_ID

views.py

​​>
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from gateway.models import TrxnDetail
from gateway.serializers import TrxnSerializer
from gateway.Checksum import generate_checksum
from django.conf import settings


@api_view(['GET', 'POST'])
def snippet_list(request):
    """
    List all code snippets, or create a new snippet.
    """
    if request.method == 'GET':
        snippets = TrxnDetail.objects.all()
        serializer = TrxnSerializer(snippets, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = TrxnSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            sdata=serializer.data

            mid,order_id,cust_id,
            txn_amount,channel_id,
            website,industry_type_id,
            mobile_no,email=sdata.get('MID'),sdata.get('ORDER_ID'),
            sdata.get('CUST_ID'),sdata.get('TXN_AMOUNT'),
            sdata.get('CHANNEL_ID'),sdata.get('WEBSITE'),
            sdata.get('INDUSTRY_TYPE_ID'),sdata.get('MOBILE_NO'),
            sdata.get('EMAIL'),
            param_dict = dict()
            param_dict['MID']=mid
            param_dict['ORDER_ID']=order_id
            param_dict['CUST_ID']=cust_id
            param_dict['TXN_AMOUNT']=txn_amount
            param_dict['CHANNEL_ID']=channel_id
            param_dict['WEBSITE']=website
            param_dict['INDUSTRY_TYPE_ID']=industry_type_id
            param_dict['MOBILE_NO']=mobile_no
            param_dict['EMAIL']=email
            print(generate_checksum(param_dict,settings.PAYTM_MERCHANT_KEY))
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)

我正在使用 ModelSerializer 和 CheckSum.py

我收到以下错误:Error Image

【问题讨论】:

    标签: django python-3.x django-rest-framework payment-gateway paytm


    【解决方案1】:

    如果您使用的是 python 3,请确保您已经安装了 pycryptodome。 Checksum 文件中编码和解码函数的 AES.new() 函数需要 utf-8 编码参数。

    用下面的代码替换函数:

    def __encode__(to_encode, iv, key):
        # Pad
        to_encode = __pad__(to_encode)
        # Encrypt
        c = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
        to_encode = c.encrypt(to_encode.encode('utf-8'))
        # Encode
        to_encode = base64.b64encode(to_encode)
        return to_encode
    
    
    def __decode__(to_decode, iv, key):
        # Decode
        to_decode = base64.b64decode(to_decode)
        # Decrypt
        c = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
        to_decode = c.decrypt(to_decode)
        # remove pad
        return __unpad__(to_decode)
    
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 2020-11-02
      • 1970-01-01
      • 2020-12-08
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 2019-05-21
      相关资源
      最近更新 更多