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
相关产品推荐
相关产品推荐

