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

Django集成Paystack验证支付触发AttributeError如何解决?

Paystack交易校验报错修复方案

报错根因

Paystack类中没有定义process_payment方法,你调用了不存在的类方法触发属性错误;同时调用时传入的self.reference属于无效引用,当前函数作用域中不存在self实例对象,也没有对应reference属性。

具体修改步骤

  • 替换调用的方法名:将paystack.process_payment改为Paystack类中实际定义的verify_payment校验方法
  • 替换入参:将不存在的self.reference替换为当前函数中已经从请求参数获取的交易参考号变量transaction_id
  • 调整返回值接收逻辑:verify_payment方法会返回两个值(状态标识 + 业务数据/错误信息),需要对应接收两个返回值
  • 修正状态判断逻辑:Paystack接口返回的status为布尔值,原来判断status == "success"的逻辑不生效,需要改为布尔值判断

修正后的代码

def process_payment(request, slug, amount, award, votes):
    reason = request.GET.get('reason')
    transaction_id = request.GET.get('reference')
    amount = (str(int(amount) / 100))
    paystack = Paystack()
    # 修正方法调用、入参、返回值接收
    status, result = paystack.verify_payment(transaction_id)
    # 修正状态判断逻辑
    if status:
        transaction = SuccessfulTransactionHistory(
            nominee_name=slug,
            transaction_id=transaction_id,
            amount=amount,
            award=award
        )
        transaction.save()
        Nomination.objects.filter(slug=slug).update(votes=F('votes') + votes)
        Award.objects.filter(slug=award).update(amount=F('amount') + amount)
        return redirect('vote:paymentsuccess', slug=slug)
    else:
        context = {
            'error': reason if reason else result
        }
        transaction = FailedTransactionHistory(
            nominee_name=slug,
            transaction_id=transaction_id,
            amount=amount,
            award=award
        )
        transaction.save()
        return render(request, 'payment_error.html', context=context)

额外优化建议

  • 不要将Paystack密钥硬编码在类定义中,建议放到settings.py配置文件,调用时通过from django.conf import settings读取settings.PAYSTACK_SECRET_KEY,避免密钥意外泄露
  • 可以添加网络请求异常捕获逻辑,处理Paystack接口超时、访问失败的场景,避免服务直接抛出500错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:54:02