0

我有一个在线商店,用户在 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')
4

1 回答 1

0

您可能以错误的方式解决了这个问题,尤其是当它与付款相关时。在您done看来,有一个先决条件来检查付款是否已经完成。

另一方面,为了回答这个问题,检查用户是从重定向登陆还是通过手动输入 URL,(一个 hacky 解决方案)在用户本地上下文中生成一个令牌(一个唯一标识符)并将其添加为查询参数在重定向 URL 中,进一步验证重定向视图中的令牌(存在于本地上下文中),如果令牌与本地上下文不同或不存在 - 用户手动输入!

于 2020-09-26T20:09:52.740 回答