问题描述
我有一个在线商店,用户在domain.com/pay上付款,然后在domain.com/done上付款后收到他们的产品
但是,当我进行测试时,我发现用户可以转到URL并手动输入domain.com/pay,突然之间,他们无需付费就可以购买产品! 我想以某种方式检查用户是手动访问还是通过重定向访问
如果手动,则举起http403 如果通过重定向,则该功能将正常发生
这是我的process_pay视图
def payment_process(request,Trade_id):
Trade = get_object_or_404(Trade,id=Trade_id)
host = request.get_host()
paypal_dict = {
'business': Trade.seller.email,'amount': Decimal(Trade.price),'item_name': Trade.filename,'invoice': str(Trade.id),'currency_code': 'USD','notify_url': 'http://{}{}'.format(host,reverse('paypal-ipn')),'return_url': 'http://{}{}/{}'.format(host,*reverse('payment_done',kwargs={'Trade_id': Trade.id})),'cancel_return': 'http://{}{}'.format(host,reverse('home')),}
form = PayPalPaymentsForm(initial=paypal_dict)
return render(request,'payment/payment_process.html',{'Trade': Trade,'form': form})
我的done_process视图
@csrf_exempt
def payment_done(request,Trade_id):
# if user entered from a redirection:
# Give product to user
# elif user entered manually:
raise http403
# else:
messages.error(request,'something went wrong')
return redirect('home')
return redirect('Trade:inBox')
解决方法
您可能正在以错误的方式解决此问题,尤其是与付款有关的问题时。
在您的var value = (await _whiteLabel.GetWhiteLabel("aaa").ConfigureAwait(false)).ContactNumber;
视图中,有一个先决条件来检查付款是否已经完成。
另一方面,要回答问题,检查用户是否通过重定向登陆或通过手动输入URL,(一种骇人听闻的解决方案)会在用户本地上下文中生成令牌(唯一标识符)并将其添加为重定向URL中的查询参数,如果令牌与本地上下文不同或不存在,则进一步验证重定向视图中的令牌(存在于本地上下文中)-用户手动输入!