django - 在 Django 上生成校验和哈希(Paytm 网关)时出错
问题描述
我正在尝试将来自 Djnago 的 PayTm 网关集成为后端,但我的程序在生成校验和哈希时遇到错误。以下是我的代码片段:
模型.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
视图.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
我收到以下错误:错误图片
解决方案
如果您使用的是 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)
我希望这会有所帮助。
推荐阅读
- reactjs - 在 React 中使用 Jest 和 Enzyme 进行测试时遇到错误
- android - 我们可以使用多个按钮从内部存储中选择文件并使用相同的按钮上传到数据库吗
- .net - 如何将 Docker 容器的相对路径重新映射到外部环境中的绝对路径?
- python - 将嵌套 python 列表简化为结构化树的最佳方法(同时保留顺序)
- spring-boot - 在 Axios 中向 Spring Boot Server 发送 RequestParam
- flutter - Dart 生成器:为什么我得到类型“LibraryDirectiveImpl”不是“Statement”类型的子类型
- javascript - 如何使用 REST API 作为托管应用程序从客户端上传和获取 SharePoint 文档库中的项目?
- python - 如何快速将 csv 表导出到 python 字典?
- r - 基于另一列的分类条件的列中的数据总和
- c# - 如何从元素集合中更改多个属性值?