Monday, 2 May 2016

Braintree payment gateway integration with Django

Introduction

Here Im going to tell you How to integrate the Braintree payment gateway with Django based application. I really thankful to Braintree support team because when i t try tart to integrate  it  feel really hard. But their help me lot and i completed my project successfully . In this blog i have attached the demo code for the same.

Workflow diagram






Step by Step Integration

    Step 1 :  Create Sandbox account with  Barintree  :- Create sandox account
    Step 2 :  Setup Client
    Step 3 :  Setup Server
    Step 4  :  Have fun .... with Brain tree

BrainTree Integration with Django Project

  Create the Sandbox account with  braintree , they will provide the merchant id, private and public key
Install braintree in your env using pip ( pip install braintree ).

Add the keys and merchant id with project settings

settings.py

BRAINTREE_MERCHANT = 'dznq5k44zc3qrycm'
BRAINTREE_PUBLIC_KEY = 'ttkr358rbpfnjvgn'
BRAINTREE_PRIVATE_KEY = 'dcfa177a5f71e00370323f17221e6cea'

Configure the Braintree with this above credentials

Views.py

from django.conf import settings

import braintree

braintree.Configuration.configure(braintree.Environment.Sandbox,
         merchant_id=settings.BRAINTREE_MERCHANT,
         public_key=settings.BRAINTREE_PUBLIC_KEY,

         private_key=settings.BRAINTREE_PRIVATE_KEY)



Genrate a client token in server side and render to the client side for processing 
payment method nonce.

Views.py

@login_required
@csrf_exempt
def checkout(request):
    rg = request.POST.get
    amount =  request.POST.get('prise') // when user click the subscription for payment
    user = Staff.objects.get(id=request.user.id)
    a_customer_id = ''
    if not user.customer_id:
        result = braintree.Customer.create
          ({
            "first_name": user.first_name,
            "last_name": user.last_name,
            "company": "Braintree",
            "email": user.email,
            "phone": "312.555.1234",
            "fax": "614.555.5678",
            "website": "www.example.com"
            })
  if result.is_success:
      user.customer_id = result.customer.id
      user.save()
      a_customer_id = user.customer_id
  else:
      a_customer_id = user.customer_id
  if not user.client_token:
      client_token = client_token = braintree.ClientToken.generate
        ({
          "customer_id": a_customer_id
        })
      user.client_token = client_token
      user.save()
  else:
      client_token = user.client_token
  varibles ={'amount':amount,'client_token':client_token}
  return render(request, 'checkout.html',varibles)

Setup Client 

checkout.html

<div class="form-style-5">
    {{amount}}
<input type='hidden' id='client_token' value='{{client_token}}'> // client token from server side
<form id="checkout" method="post" action="/payment">
    <div id="payment-form">
       <input type='hidden' name='amount' value='{{amount}}'> // amount
       <input type='text' name='amount' value='{{amount}}' readonly>
    </div>
    <input type="submit" value="Subcribe"> // Submit Button
</form>

</div>
<script src="https://js.braintreegateway.com/v2/braintree.js"></script>
<script>

var clientToken = document.getElementById('client_token').value;
// creating payment method nonse

braintree.setup(clientToken, "dropin", {
  container: "payment-form"
});
</script>

How the Client look ?


When the user click on the submit button it will post the payment method nonce to server side.


Create Transcation

@login_required
@csrf_exempt
def payment(request):
if request.POST:
if request.POST.get("payment_method_nonce"):
                        // payment method nonce from client side.
nonce_from_the_client =  request.POST.get("payment_method_nonce")
staff = Staff.objects.get(id=request.user.id)
sub = Subscription()
sub.staff = staff
sub.payment_nonce = nonce_from_the_client
sub.amount = request.POST.get("amount")
sub.save()
result = braintree.Transaction.sale({
    "amount": sub.amount,
    "payment_method_nonce": sub.payment_nonce
})
transaction_id =  result.transaction.id
sub.txnid = transaction_id
sub.save()
message = ''
if result.is_success: // transaction success or not
sub.result = True
sub.save()
message =  'Transaction successfully completed'+' : '+ transaction_id
varibles ={'message':message}
return render(request, 'success.html',varibles)
else:
message = 'Error Transaction Faild'

varibles ={'message':message,}
return render(request, 'checkout.html',varibles)
else:
message = 'No transaction'

varibles ={'message':message,}
return render(request, 'checkout.html',varibles)


Transaction Results in my braintree account


Demo Project i have pushed in to the github , you can download and check it yourself.

Braintree payment gateway django demo project

No comments:

Post a Comment