2017-10-23 17 views
1

Braintreeを支払いソリューション(サンドボックス)として使用しています。フォームを塗りつぶすと、同じページにリダイレクトされます。私のエラーは、フォームがプロセスを取得しないということです。 FormViewコントロールにのみget_context_data()が実行されたではなく、form_valid()FormViewはform_valid()メソッドを実行しません

HTML

<script src="https://js.braintreegateway.com/web/dropin/1.6.1/js/dropin.min.js"></script> 

<form action="{% url 'checkout_braintree' %}" method="POST" id="payment-form"> 
    {% csrf_token %} 
    <h3>Method of Payment</h3> 
    <p>378282246310005</p> 
    <input type="hidden" id="nonce" name="payment_method_nonce" /> 

    <div class="bt-drop-in-wrapper"> 
     <div id="bt-dropin"></div> 
    </div> 
    <button class="button" type="submit" id="submit-button"><span>Test Transaction</span></button> 
</form> 

するvarフォーム= document.querySelector( '#支払いフォーム');

braintree.dropin.create({ 
    authorization: '{{ client_token }}', 
    container: '#bt-dropin', 
    paypal: { 
    flow: 'vault' 
    } 
}, function (createErr, instance) { 
    form.addEventListener('submit', function (event) { 
    event.preventDefault(); 

    instance.requestPaymentMethod(function (err, payload) { 
     if (err) { 
     console.log('Error', err); 
     return; 
     } 

     // Add the nonce to the form and submit 
     document.querySelector('#nonce').value = payload.nonce; 
     form.submit(); 
    }); 
    }); 
}); 

urls.py

url(r'^checkout/$', 
    BraintreePaymentProcessFormView.as_view(), 
    name='checkout_braintree'), 

views.py

class BraintreePaymentProcessFormView(FormView): 
    template_name = 'startupconfort/cart.html' 
    success_url = '/' 
    form_class = BraintreeSaleForm 
    http_method_names = ['post'] 

    def get_context_data(self, **kwargs): 
     # import ipdb; ipdb.set_trace() 
     context = super().get_context_data(**kwargs) 
     context['client_token'] = get_braintree_client_token() 
     return context 

    def form_valid(self, form): 
     # import ipdb; ipdb.set_trace() 
     user = self.request.user 
     nonce = form.cleaned_data['payment_method_nonce'] 

     result = braintree.Transaction.sale({ 
      "amount": get_total_price_of_the_shipping_cart(user), 
      "payment_method_nonce": nonce, 
      "options": { 
       "submit_for_settlement": True 
      } 
     }) 

     # import ipdb; ipdb.set_trace() 
     if result.is_success or result.transaction: 
      print(result.transaction) 
      messages.success(self.request, 'Payment proceed successfully') 
      # Add Total into db with User Name and Product + Quantity 

      #send email 
      user = self.request.user 
      billing_email = user.shipping_address.billing_email 
      customer_name = user.shipping_address.customer_name 
      #total values 
      #msg 

      # Email with mailjet.. 
      msg = EmailMultiAlternatives(
       subject="Please activate your account", 
       body="Click to activate your account: http://localhost:8000/", 
       from_email="Example <[email protected]>", 
       to=[ 
        "New User <[email protected]>" 
        ], 
       reply_to=["Helpdesk <[email protected]>"] 
      ) 

      # Send it: 
      # msg.send() 

      #Clear Cart 
      CartItem.objects.filter(customer=user).all().delete() 
      # return super().form_valid(form) 
      import ipdb; ipdb.set_trace() 
      return reverse_lazy('my_shopping_cart') 
     else: 
      print(result.errors) 
      messages.success(self.request, 'An error occured while processing the payment') 
      return super().form_invalid(form) 

ブレインサンドボックスのクレジットカード enter image description here

あなたはform_validform_invalidメソッドを持っており、また、あなたがこれまであなたsuccess_url同様のを編集している場合、フォーム

from django import forms 
class BraintreeSaleForm(forms.Form): 
    payment_method_nonce = forms.CharField() 
+0

ajaxを使用する場合、ajaxを検証する必要があります。 – ytsejam

+0

フォームは実際に有効ですか? –

答えて

1

はあなたのviews.pyが良くなります。

class BraintreePaymentProcessFormView(FormView): 
    template_name = 'startupconfort/cart.html' 
    success_url = '/' 
    form_class = BraintreeSaleForm 
    http_method_names = ['post'] 
    success_url = reverse_lazy('my_shopping_cart') 

    def get_context_data(self, **kwargs): 
     # import ipdb; ipdb.set_trace() 
     context = super().get_context_data(**kwargs) 
     context['client_token'] = get_braintree_client_token() 
     return context 

    def form_valid(self, form): 
     # import ipdb; ipdb.set_trace() 
     user = self.request.user 
     nonce = form.cleaned_data['payment_method_nonce'] 

     result = braintree.Transaction.sale({ 
      "amount": get_total_price_of_the_shipping_cart(user), 
      "payment_method_nonce": nonce, 
      "options": { 
       "submit_for_settlement": True 
      } 
     }) 
     reverse_lazy('my_shopping_cart') 
     # import ipdb; ipdb.set_trace() 
     if result.is_success or result.transaction: 
      print(result.transaction) 
      messages.success(self.request, 'Payment proceed successfully') 
      # Add Total into db with User Name and Product + Quantity 

      #send email 
      user = self.request.user 
      billing_email = user.shipping_address.billing_email 
      customer_name = user.shipping_address.customer_name 
      #total values 
      #msg 

      # Email with mailjet.. 
      msg = EmailMultiAlternatives(
       subject="Please activate your account", 
       body="Click to activate your account: http://localhost:8000/", 
       from_email="Example <[email protected]>", 
       to=[ 
        "New User <[email protected]>" 
        ], 
       reply_to=["Helpdesk <[email protected]>"] 
      ) 

      # Send it: 
      # msg.send() 

      #Clear Cart 
      CartItem.objects.filter(customer=user).all().delete() 
      # return super().form_valid(form) 
      import ipdb; ipdb.set_trace()  
     return HttpResponseRedirect(self.get_success_url()) 

     def form_invalid(self,form): 
     # Add action to invalid form phase 
      messages.success(self.request, 'An error occured while processing the payment') 
      return self.render_to_response(self.get_context_data(form=form)) 
関連する問題