Не удается настроить быстрый тест для примера Braintree - PullRequest
0 голосов
/ 26 августа 2018

Мы попытались настроить план ежемесячной подписки, используя braintree.

Смотрим на https://developers.braintreepayments.com/start/hello-client/javascript/v3

Я загружаю следующий фрагмент кода и сохраняю его как локальный файл HTML на своем компьютере. (Я знаю, что мне нужно использовать внутренний сервер, чтобы сгенерировать токен и приведенный ниже фрагмент HTML-кода для клиентского браузера. Я просто хочу провести быстрый тест без предварительной настройки сервера.)

<head>
  <meta charset="utf-8">
  <script src="https://js.braintreegateway.com/web/dropin/1.12.0/js/dropin.min.js"></script>
</head>
<body>
  <div id="dropin-container"></div>
  <button id="submit-button">Request payment method</button>
  <script>
    var button = document.querySelector('#submit-button');

    braintree.dropin.create({
      authorization: 'CLIENT_TOKEN_FROM_SERVER',
      container: '#dropin-container'
    }, function (createErr, instance) {
      button.addEventListener('click', function () {
        instance.requestPaymentMethod(function (err, payload) {
          // Submit payload.nonce to your server
        });
      });
    });
  </script>
</body>

Нажимаем на кнопку. instance.requestPaymentMethod выполняется.

Я ожидаю, что клиентский браузер начнет взаимодействовать с сервером braintree, как описано в шаге 3. Но это не так.

enter image description here

Могу ли я знать, есть ли какой-то шаг, который я пропустил?

1 Ответ

0 голосов
/ 27 августа 2018

Вам нужно настроить надлежащий бэкэнд-сервер, чтобы заставить работать код переднего плана.Так как без правильного client_token (сгенерированного из внутреннего сервера) интерфейсный код не будет работать.

Код переднего плана не выдаст предупреждение о неправильном client_token.

Обратите внимание, что вам будет трудно настроить внутренний сервер, так как документация Braintree плохо написана

Потратив 2 дня подряд, я публикую свой фрагмент кода, касающийся ежемесячного регулярного выставления счетов.

views.py

from django.views.generic import TemplateView
import braintree
import json
from django.shortcuts import redirect

from pprint import pprint

gateway = braintree.BraintreeGateway(
    braintree.Configuration(
        braintree.Environment.Sandbox,
        merchant_id="???",
        public_key="???",
        private_key="???"
    )
)

class PaymentMethodView(TemplateView):
    template_name = 'payment_method.html'

    def get_context_data(self, **kwargs):        
        # Call the base implementation first to get a context
        context = super(PaymentMethodView, self).get_context_data(**kwargs)

        subscribe = self.request.GET.get('subscribe')

        client_token = gateway.client_token.generate()     

        context['client_token_from_server'] = client_token
        return context


class SubscribeView(TemplateView):
    template_name = 'subscribe.html'

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super(SubscribeView, self).get_context_data(**kwargs)

        payload_nonce = self.request.GET.get('payload_nonce')

        user = self.request.user

        result = gateway.customer.create({
            "email": user.email,
            "id": str(user.id),
            "payment_method_nonce": payload_nonce
        })

        if result.is_success:
            customer_id = result.customer.id

            payment_method_token = result.customer.payment_methods[0].token

            result = gateway.subscription.create({
                "payment_method_token": payment_method_token,
                "plan_id": "individual",
            })
        else:
            result = gateway.payment_method.create({
                "customer_id": str(user.id),
                "payment_method_nonce": payload_nonce
            })

            #pprint(vars(result))

            payment_method_token = result.payment_method.token

            result = gateway.subscription.create({
                "payment_method_token": payment_method_token,
                "plan_id": "individual",
            })

        context['is_success'] = result.is_success

        if result.is_success:
            print('success')
        else:
            for error in result.errors.deep_errors:
                print(error.attribute)
                print(error.code)
                print(error.message)

        return context

payment_method.html

<head>
  <meta charset="utf-8">
  <script src="https://js.braintreegateway.com/web/dropin/1.12.0/js/dropin.min.js"></script>
</head>
<body>
  <div id="dropin-container"></div>
  <button id="submit-button">Request payment method</button>
  <script>
    var button = document.querySelector('#submit-button');

    braintree.dropin.create({
      authorization: '{{ client_token_from_server }}',
      container: '#dropin-container'
    }, function (createErr, instance) {
      button.addEventListener('click', function () {
        instance.requestPaymentMethod(function (err, payload) {
          // Submit payload.nonce to your server
          url = '{% url 'subscribe' %}' + '?payload_nonce=' + payload.nonce;
          window.location.replace(url);
        });
      });
    });
  </script>
</body>

Примечание:

  1. Различные вызовы API приведут к другому объекту Result, но с другими атрибутами.Как я узнаю, что мне нужно позвонить payment_method_token = result.payment_method.token, чтобы получить payment_method_token.Вы не можете сказать, читая документациюВам необходимо выполнить отладку для объекта результата, используя pprint(vars(result)). Я буду очень рад, если кто-то из Брэйнтри может дать мне знать, как я могу найти такую ​​информацию, прочитав документацию.

  2. Именование плохое исбивает с толку.Например, Merchant Account и Merchant Account ID - это две разные вещи.

...