首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法为braintree示例设置快速测试

无法为braintree示例设置快速测试
EN

Stack Overflow用户
提问于 2018-08-26 09:53:15
回答 1查看 498关注 0票数 2

我们尝试建立一个每月订阅计划,使用braintree。

我们看看https://developers.braintreepayments.com/start/hello-client/javascript/v3

我下载以下代码片段,并将其保存为机器中的本地HTML文件。(我知道我需要使用后端服务器来为客户端浏览器生成令牌和下面的HTML代码片段。我只想在不首先设置服务器的情况下进行快速测试。)

代码语言:javascript
运行
复制
<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一样,但它没有。

我能知道我错过了什么步骤吗?

EN

Stack Overflow用户

回答已采纳

发布于 2018-08-27 20:58:27

您需要设置适当的后端服务器,以获得前端代码工作。因为,如果没有正确的client_token (从后端服务器生成),前端代码将无法工作。

前端代码不会对不正确的client_token发出任何警告。

注意,设置后端服务器将遇到困难,因为Braintree文档编写得很糟糕,

在连续花了两天之后,我发布了我的代码片段,关于每月重复计费。

views.py

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
<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))对结果对象执行调试。我会很高兴的,如果来自Braintree的人能告诉我,我如何通过阅读文档来查找这样的信息.
  2. 命名很糟糕,令人困惑。例如,商户商户Id是两种不同的东西。
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52025084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档