Merge pull request #432 from siarheipuhach/feature/task3637

task/3637/Added stripe failed payment error handler
This commit is contained in:
Pcoder 2017-08-17 20:50:18 +02:00 committed by GitHub
commit a80b0668a2
5 changed files with 67 additions and 40 deletions

View file

@ -438,6 +438,11 @@ class OrderConfirmationView(DetailView):
stripe_utils = StripeUtils() stripe_utils = StripeUtils()
card_details = stripe_utils.get_card_details( card_details = stripe_utils.get_card_details(
customer.stripe_id, request.session.get('token')) customer.stripe_id, request.session.get('token'))
if not card_details.get('response_object') and not card_details.get('paid'):
msg = card_details.get('error')
messages.add_message(self.request, messages.ERROR, msg, extra_tags='failed_payment')
return HttpResponseRedirect(reverse('datacenterlight:payment') + '#payment_error')
context = { context = {
'site_url': reverse('datacenterlight:index'), 'site_url': reverse('datacenterlight:index'),
'cc_last4': card_details.get('response_object').get('last4'), 'cc_last4': card_details.get('response_object').get('last4'),
@ -462,15 +467,12 @@ class OrderConfirmationView(DetailView):
stripe_utils = StripeUtils() stripe_utils = StripeUtils()
charge_response = stripe_utils.make_charge(amount=final_price, charge_response = stripe_utils.make_charge(amount=final_price,
customer=customer.stripe_id) customer=customer.stripe_id)
charge = charge_response.get('response_object')
# Check if the payment was approved # Check if the payment was approved
if not charge: if not charge_response.get('response_object') and not charge_response.get('paid'):
context = {} msg = charge_response.get('error')
context.update({ messages.add_message(self.request, messages.ERROR, msg, extra_tags='make_charge_error')
'paymentError': charge_response.get('error') return HttpResponseRedirect(reverse('datacenterlight:payment') + '#payment_error')
})
return render(request, self.payment_template_name, context)
charge = charge_response.get('response_object') charge = charge_response.get('response_object')

View file

@ -557,6 +557,10 @@ a.unlink:hover {
border-radius: 3px; border-radius: 3px;
padding: 5px; padding: 5px;
} }
.card-warning-error {
border: 1px solid #EB4D5C;
color: #EB4D5C;
}
.card-warning-addtional-margin { .card-warning-addtional-margin {
margin-top: 15px; margin-top: 15px;

View file

@ -59,7 +59,6 @@
{% csrf_token %} {% csrf_token %}
{% bootstrap_field field show_label=False type='fields'%} {% bootstrap_field field show_label=False type='fields'%}
{% endfor %} {% endfor %}
{% bootstrap_form_errors form type='non_fields'%}
</form> </form>
</div> </div>
<div class="col-xs-12 col-sm-7 col-md-6 creditcard-box dcl-creditcard"> <div class="col-xs-12 col-sm-7 col-md-6 creditcard-box dcl-creditcard">
@ -86,13 +85,29 @@
</form> </form>
<div class="row"> <div class="row">
<div class="col-xs-12"> <div class="col-xs-12">
<p class="card-warning-content card-warning-addtional-margin"> {% if not messages and not form.non_field_errors %}
{% blocktrans %} <p class="card-warning-content card-warning-addtional-margin">
You are not making any payment yet. After submitting your card {% blocktrans %}
information, you will be taken to the Confirm Order Page. You are not making any payment yet. After submitting your card
{% endblocktrans %} information, you will be taken to the Confirm Order Page.
</p> {% endblocktrans %}
</div> </p>
{% endif %}
<div id='payment_error'>
{% for message in messages %}
{% if 'failed_payment' or 'make_charge_error' in message.tags %}
<ul class="list-unstyled"><li>
<p class="card-warning-content card-warning-error">{{ message|safe }}</p>
</li></ul>
{% endif %}
{% endfor %}
{% for error in form.non_field_errors %}
<p class="card-warning-content card-warning-error">
{{ error|escape }}
</p>
{% endfor %}
</div>
</div>
<div class="col-xs-12"> <div class="col-xs-12">
<div class="col-xs-6 pull-right"> <div class="col-xs-6 pull-right">
<button id="payment_button_with_creditcard" class="btn btn-success stripe-payment-btn" <button id="payment_button_with_creditcard" class="btn btn-success stripe-payment-btn"
@ -130,12 +145,29 @@
<div id="card-errors" role="alert"></div> <div id="card-errors" role="alert"></div>
<div class="row"> <div class="row">
<div class="col-xs-12"> <div class="col-xs-12">
<p class="card-warning-content"> {% if not messages and not form.non_field_errors %}
{% blocktrans %} <p class="card-warning-content">
You are not making any payment yet. After submitting your card {% blocktrans %}
information, you will be taken to the Confirm Order Page. You are not making any payment yet. After submitting your card
{% endblocktrans %} information, you will be taken to the Confirm Order Page.
</p> {% endblocktrans %}
</p>
{% endif %}
<div id='payment_error'>
{% for message in messages %}
{% if 'failed_payment' or 'make_charge_error' in message.tags %}
<ul class="list-unstyled"><li>
<p class="card-warning-content card-warning-error">{{ message|safe }}</p>
</li></ul>
{% endif %}
{% endfor %}
{% for error in form.non_field_errors %}
<p class="card-warning-content card-warning-error">
{{ error|escape }}
</p>
{% endfor %}
</div>
</div> </div>
<div class="col-xs-12"> <div class="col-xs-12">
<div class="col-xs-6 pull-right"> <div class="col-xs-6 pull-right">
@ -150,15 +182,6 @@
<p class="payment-errors"></p> <p class="payment-errors"></p>
</div> </div>
</div> </div>
{% if paymentError %}
<div class="row">
<div class="col-xs-12">
<p>
{% bootstrap_alert paymentError alert_type='danger' %}
</p>
</div>
</div>
{% endif %}
</form> </form>
{% endif %} {% endif %}

View file

@ -556,8 +556,9 @@ class PaymentVMView(LoginRequiredMixin, FormView):
customer = StripeCustomer.get_or_create(email=owner.email, customer = StripeCustomer.get_or_create(email=owner.email,
token=token) token=token)
if not customer: if not customer:
form.add_error("__all__", "Invalid credit card") msg = _("Invalid credit card")
return self.render_to_response(self.get_context_data(form=form)) messages.add_message(self.request, messages.ERROR, msg, extra_tags='make_charge_error')
return HttpResponseRedirect(reverse('hosting:payment') + '#payment_error')
# Create Billing Address # Create Billing Address
billing_address = form.save() billing_address = form.save()
@ -566,15 +567,12 @@ class PaymentVMView(LoginRequiredMixin, FormView):
stripe_utils = StripeUtils() stripe_utils = StripeUtils()
charge_response = stripe_utils.make_charge(amount=final_price, charge_response = stripe_utils.make_charge(amount=final_price,
customer=customer.stripe_id) customer=customer.stripe_id)
charge = charge_response.get('response_object')
# Check if the payment was approved # Check if the payment was approved
if not charge: if not charge_response.get('response_object') and not charge_response.get('paid'):
context.update({ msg = charge_response.get('error')
'paymentError': charge_response.get('error'), messages.add_message(self.request, messages.ERROR, msg, extra_tags='make_charge_error')
'form': form return HttpResponseRedirect(reverse('hosting:payment') + '#payment_error')
})
return render(request, self.template_name, context)
charge = charge_response.get('response_object') charge = charge_response.get('response_object')

View file

@ -11,7 +11,7 @@ def handleStripeError(f):
'error': None 'error': None
} }
common_message = "Currently its not possible to make payments." common_message = "Currently it's not possible to make payments."
try: try:
response_object = f(*args, **kwargs) response_object = f(*args, **kwargs)
response = { response = {