Braintree Client token generate method throws an XML error inside Django

Question:

I am using the below code to generate Client Token from the braintree gateway inside my payment View in Django.

def generate_token(request,id,token):
    if not validate_user_session(id,token):
        return JsonResponse({"error":"Invalid session"})


    gateway = braintree.BraintreeGateway(
    braintree.Configuration(
    braintree.Environment.Sandbox,
    merchant_id="xxxxxxxxxx",
    public_key="xxxxxxxxxxxx",
    private_key="xxxxxxxxxxxxxxxxxxxxxx"
    )

    print(gateway.client_token.generate())
    return JsonResponse({"clientToken":gateway.client_token.generate(), "success":True})

This throws an error

xml.parsers.expat.ExpatError: not well-formed (invalid token): line 1, column 0

However, the code works fine outside Django and in Python Shell and generates the token successfully. I don’t seem to understand what is the issue ? The Ids and tokens are same in both the cases. Any help is appreciated.

Asked By: Sumit Kumar

||

Answers:

Replace
client_token = gateway.client_token.generate()

by
client_token = gateway.client_token.generate(
params={‘merchant_account_id’: settings.BRAINTREE_MERCHANT_ID})

As it turns out, Braintree has some issues with latest python versions . So making these changes solved the issue for me .

In file (or wherever braintree is installed)

/.local/share/virtualenvs/django_backend-ctIb9mpQ/lib/python3.8/site-packages/braintree/util/http.py line:125

Replacing the code

return [response.status_code, response.text]

with

ver = sys.version_info

if ver.major == 3 and ver.minor > 5:
    return [response.status_code, response.content]
else:
    return [response.status_code, response.text]

solves this issue inside django.

Answered By: Sumit Kumar
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.