2017-03-09 14 views
0

単純なストライプペイメントを使用して再生するとカードを正常に充電できますが、失敗した場合、 'CardError'オブジェクトでAttributeErrorを取得しています'を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 

私のフォームは、フィールドをセットアップし、モデルから電荷を取得します。

#1 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 

私の見解は、ちょうどフォームを表示し、成功のページに移動したり、フォームを再ロードのどちらか。

#ここ

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}) 

は、任意の助け

<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>

おかげsales.html

#1 sales.htmlのためのHTMLテンプレートでのviews.py。

答えて

1

スローされている例外にはmessages属性がありません。 messages属性は、DjangoのValidationErrorタイプ例外とそのサブクラスでのみ使用できます。ストライプのエラーを処理するには、この例を参照してください。

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' %(インスタンス。['メッセージ']))ありがとうございました! – Xixecal

+0

それがあなたを助けたら答えを受け入れてください –

関連する問題