2017-03-09 47 views
0

我设置了一个简单的条带付款以供玩耍,并且我可以成功为一张卡充电,但是当它失败时,我得到一个AttributeError且'CardError'对象没有属性'消息'而不是HTML页面上的错误消息。尝试从失败的条纹费用中获取错误

在我的模型中,我得到了一个条带电荷,并返回一个元组,其中包含充电成功和充电或错误消息的详细信息。

#models.py中

class Sale(models.Model): 
def __init__(self, *args, **kwargs): 
    super(Sale, self).__init__(*args, **kwargs) 

    import stripe 
    stripe.api_key = settings.STRIPE_SECRET_KEY 
    self.stripe = stripe 

customer = models.OneToOneField(settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE) 
charge_id = models.CharField(max_length=32) 



def charge(self, price_in_cents, number, exp_month, exp_year, cvc, address_zip): 

    if self.charge_id: 
     return False, Exception(message='This charge has already been issued.') 

    try: 
     response = self.stripe.Charge.create(
      amount = price_in_cents, 
      currency = 'usd', 
      card = { 
       'number': number, 
       'exp_month': exp_month, 
       'exp_year': exp_year, 
       'cvc': cvc, 
       'address_zip': address_zip, 
      }, 
      description = 'Thank you for signing up for our program.') 
     self.charge_id = response.id 
     self.customer = request.user 

    except self.stripe.error.CardError as ce: 
     return False, ce 
    except Exception as e: 
     return False, e 

    return True, response 

我的形式设置了现场,并得到从模型上的电荷。

#forms.py

class SalePaymentForm(forms.Form): 
    number = CreditCardField(required=True, label="Card Number") 
    expiration = CCExpField(required=True, label="Expiration") 
    cvc = forms.IntegerField(required=True, label="CCV Number", max_value=9999, widget=forms.TextInput(attrs={'size': '4'})) 
    address_zip = forms.IntegerField(required=True, label='Address Zip Code', max_value=99999, widget=forms.TextInput(attrs={'size': '5'})) 

def clean(self): 
    cleaned = super(SalePaymentForm, self).clean() 

    if not self.errors: 
     number = self.cleaned_data['number'] 
     exp_month = self.cleaned_data['expiration'].month 
     exp_year = self.cleaned_data['expiration'].year 
     cvc = self.cleaned_data['cvc'] 
     address_zip = self.cleaned_data['address_zip'] 

     sale = Sale() 

     success, instance = sale.charge(2500, number, exp_month, exp_year, cvc, address_zip) 

     if not success: 
      raise forms.ValidationError('Error: %s' % (instance.messages)) 
     else: 
      instance.save() 
      # Send Email 
      pass 

    return cleaned 

我的观点只是显示的形式,要么去一个成功页面重新加载或形式。

#的views.py

def charge(request): 
if request.method == "POST": 
    form = SalePaymentForm(request.POST) 

    if form.is_valid(): # charges the card 
     return HttpResponse('Success!') 
else: 
    form = SalePaymentForm() 

return render(request, 'sales.html', {'form': form}) 

这里是sales.html

#sales.html HTML模板

<html> 
 
<head> 
 
    <title>Stripe Example</title> 
 
</head> 
 
<body> 
 
    
 
<div class="wrapper"> 
 
    
 
    {% for key, value in form.errors.items %} 
 
     <p>{{ value }}</p> 
 
    {% endfor %} 
 
    
 
    <form action="" method="post">{% csrf_token %} 
 
    
 
    {% for field in form %} 
 
     <div class="field-wrapper"> 
 
    
 
     <div class="field-label"> 
 
      {{ field.label_tag }}: 
 
     </div> 
 
    
 
     <div class="field-field"> 
 
      {{ field }} 
 
      {{ field.errors }} 
 
     </div> 
 
    
 
     </div> 
 
    {% endfor %} 
 
    
 
    <br> 
 
    <input type="submit" value="Charge Me!" /> 
 
    </form> 
 
    
 
</div> 
 
    
 
</body> 
 
</html>

感谢您的帮助。

回答

1

正在抛出的异常没有messages属性。 messages属性仅适用于Django的ValidationError s类型异常及其子类。为了处理条纹的错误,请参见下面的例子:

try: 
    # Use Stripe's library to make requests... 
    pass 
except stripe.error.CardError as e: 
    # Since it's a decline, stripe.error.CardError will be caught 
    body = e.json_body 
    err = body['error'] 

https://stripe.com/docs/api/python#errors

+0

我仍然得到同样的错误。我猜这个问题似乎来自这个行 raise forms.ValidationError('Error:%s'%(instance.messages)) – Xixecal

+0

只需更改 raise forms.ValidationError('Error:%s' %(instance.messages)) to raise forms.ValidationError('Error:%s'%(instance。['message']))谢谢! – Xixecal

+0

如果它对你有帮助,请接受答案 –

相关问题