Braintree Client token generate method throws an XML error inside Django

Viewed 299

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.

2 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 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.

Related