You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django集成Paytm支付时Payment.user需为Account实例报错如何解决

错误根因

你触发报错的核心原因是:payments 视图是Paytm支付网关的回调接收接口,该请求是Paytm官方服务器发起的,并非当前登录用户的浏览器发出,请求不会携带用户的Django会话凭证,因此request.user默认是匿名用户(AnonymousUser),不符合Payment.user要求的Account实例类型,因此触发赋值错误。

解决方案

无需依赖request.user获取用户信息,你在发起支付时已经将订单号ORDER_ID传递给了Paytm,回调时Paytm会将该参数原封不动返回,直接通过订单号查询关联的订单记录即可拿到对应用户:

  1. 从回调返回的response_dict中取出ORDER_ID
  2. 查询对应的Order实例,直接使用Order表中存储的user字段赋值给Payment.user
  3. 补充订单状态更新的逻辑,完成支付后将订单标记为已下单

修改后的核心代码示例

@csrf_exempt
def payments(request,total=0, quantity=0,):
    form = request.POST
    response_dict = {}
    checksum = None
    for i in form.keys():
        response_dict[i] = form[i]
        if i == 'CHECKSUMHASH':
            checksum = form[i]

    verify = Checksum.verify_checksum(response_dict, MERCHANT_KEY, checksum)
    if verify:
        # 先通过回调返回的订单号查询订单
        order_number = response_dict['ORDER_ID']
        try:
            order = Order.objects.get(order_number=order_number)
        except Order.DoesNotExist:
            return HttpResponse("无效订单", status=400)
        
        pay = Payment()
        pay.payment_id = response_dict['TXNID']
        pay.payment_method = response_dict['PAYMENTMODE']
        # 直接使用订单关联的用户,不用request.user
        pay.user = order.user
        pay.amount_paid = response_dict['TXNAMOUNT']
        pay.status = response_dict['STATUS']
        pay.created_at = response_dict['TXNDATE']
        pay.save()

        # 补充更新订单状态逻辑
        if response_dict['RESPCODE'] == '01':
            order.is_ordered = True
            order.payment = pay
            order.status = 'Accepted'
            order.save()
            print('order succesfull')
        else:
            print('order was not succesfull')
    return render(request,'orders/payments.html', {'response':response_dict})

注意事项

  • 不要给payments视图添加@login_required装饰器,否则Paytm的回调请求会被拦截重定向到登录页,支付回调会失败
  • 建议给订单查询逻辑添加异常捕获,避免非法回调请求导致服务报错

内容的提问来源于stack exchange,提问作者Saif Malik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:36:04