単純なストライプペイメントを使用して再生するとカードを正常に充電できますが、失敗した場合、 '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。
、私はまだ同じエラーを取得しています。私は問題がこの形式のフォームから来ているようだと思う。 raise forms.ValidationError( 'Error:%s'%(instance.messages)) – Xixecal
ただ変更する必要がある raise forms.ValidationError( 'Error:%s' %(インスタンス。['メッセージ']))ありがとうございました! – Xixecal
それがあなたを助けたら答えを受け入れてください –