【发布时间】:2020-06-20 09:23:31
【问题描述】:
我正在开发一个 django webapp。我将paytm payment gateway 与 django 应用程序连接起来。我按照文档做了一切,一切正常。差不多。
付款结束后,我在调用回调 URL 时遇到问题。
这里是代码
views.py
def donate(request):
if request.method == "POST":
form = DonateForm(request.POST)
name = request.POST.get('firstName')
phone = request.POST.get('phone')
email = request.POST.get('email')
amount = float("{0:.2f}".format(int(request.POST.get('amount'))))
ord_id = OrdID()
cust_id = CustID()
paytm_params = {
"MID" : MERCHANTID,
"WEBSITE" : "WEBSTAGING",
"INDUSTRY_TYPE_ID" : "Retail",
"CHANNEL_ID" : "WEB",
"ORDER_ID" : ord_id,
"CUST_ID" : cust_id,
"MOBILE_NO" : phone,
"EMAIL" : email,
"TXN_AMOUNT" : str(amount),
"CALLBACK_URL" : "http://127.0.0.1:8000/payment/status",
}
paytm_params['CHECKSUMHASH'] = Checksum.generate_checksum(paytm_params, MERCHANTKEY)
return render(request, 'paytm.html', {'paytm_params': paytm_params})
else:
form = DonateForm()
context = {'Donate': form}
return render(request, 'donate.html', context=context)
@csrf_exempt
def handlerequest(request):
if request.method == 'POST':
form = request.POST
response_dict = {}
for i in form.keys():
response_dict[i] = form[i]
if i == 'CHECKSUMHASH':
checksum = form[i]
print(checksum)
verify = Checksum.verify_checksum(response_dict, MERCHANTKEY, checksum)
if verify:
if response_dict['RESPCODE'] == '01':
print('order successful')
else:
print('error: ' + response_dict['RESPMSG'])
return render(request, 'paymentstatus.html', {'response': response_dict})
urls.py
path('donate', views.donate, name='donate'),
path('payment/status', views.handlerequest, name='handlerequest'),
donate.html
<form class="test_paytm" action="{% url 'donate' %}" method="post">
{% csrf_token %}
<div class="row">
<div class="col">
{{ Donate.firstName|as_crispy_field }}
</div>
<div class="col">
{{ Donate.lastName|as_crispy_field }}
</div>
</div>
<div class="row">
<div class="col">
{{ Donate.email|as_crispy_field }}
</div>
<div class="col">
{{ Donate.phone|as_crispy_field }}
</div>
</div>
<div class="row">
<div class="col">
{{ Donate.amount|as_crispy_field }}
</div>
</div>
<button type="submit" name="button" class="btn btn-lg mb-5 contact_submit">Donate</button>
</form>
paytm.html
<html>
<head>
<title>Merchant Check Out Page</title>
</head>
<body>
<center>
<h1>Please do not refresh this page...</h1>
</center>
<form method="post" action="https://securegw.paytm.in/order/process" name="paytm">
{% for key, value in paytm_params.items %}
<input type="hidden" name="{{key}}" value="{{value}}">
{% endfor %}
</form>
</body>
<script type="text/javascript">
document.paytm.submit()
</script>
</html>
paymentstatus.html
<div class="container">
{% if response_dict.RESPCODE == 01 %}
<center>
<h2>Thank you for your donation</h2>
<p>
We are thrilled to have your support. Through your donation we will be able to accomplish our goal. You truly make the difference for us, and we are
extremely grateful!
</p>
</center>
<h3>Order ID: {{response_dict.ORDERID}}</h3>
<h3>Order Date: {{response_dict.TXNDATE}}</h3>
<h3>Amount: {{response_dict.TXNAMOUNT}}</h3>
<h3>Payment Mode: {{response_dict.PAYMENTMODE}}</h3>
{% else %}
<center>
<p>
There seems to be a problem. We will try to fix this from our end.
</p>
</center>
{% endif %}
</div>
但是一旦付款结束,网站就不能正确地从views.py 调用handlerequest。这就是为什么我添加了@csrf_exempt 以便外部页面可以毫无问题地调用该网址。但我仍然收到 403 错误。我不确定我做错了什么
编辑1
我已将paytm.html 代码添加到问题中。我个人不觉得这个页面有问题,因为页面所做的只是重定向到 paytm 的支付网关页面。我面临的问题是返回我的网址时,即。 paymentstatus.html。那是通过handlerequest 视图。捐赠流程如下
- 用户在
donate.html填写表格并点击捐赠按钮。 -
paytm.html获取信息并自动路由到 paytm 支付网关 - 用户捐款。
- URL 从 paytm 支付网关路由回我的 URL。
- 将显示
paymentstatus.html页面。
由于 paymentstatus.html 页面是从外部 url 调用的,csrf_exempt 是必需的,这是我提供的。但是由于某种原因不起作用
[编辑 2]
当我与 Paytm 的技术团队交谈时,他们告诉我必须接受 POST 中的回调 URL。我与之交谈的人在 django 方面几乎没有经验,无法进一步帮助我。我不太确定 在 POST 中接受响应 是什么意思。有人可以帮帮我吗?
[编辑 3]
编辑handlerequest view
【问题讨论】:
-
我想知道您是在本地主机上运行应用程序还是通过 HTTP 在实际的 Web 服务器上运行应用程序?
-
两种方式都试过了。两者都不起作用
-
这可能是 CORS 标头问题。检查浏览器开发者控制台 - 在 paytm 支付页面上提交支付时会发出什么请求 -
OPTIONS请求是否发送到您的回调 url? -
从支付网关,一个 POST 请求被发送到 URL:
127.0.0.1:8000/handlerequest。请求的状态码是403。我在浏览器控制台中没有看到任何OPTIONS请求 -
运行
Checksum.verify_checksum时会发生什么。我找不到那个的python包