无法为 braintree 示例设置快速测试
Not able to setup up a quick test for braintree example
我们尝试使用 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 步一样。但它没有。
请问有没有漏掉的步骤?
您需要设置适当的后端服务器,以便前端代码正常工作。因为,如果没有正确的 client_token
(从后端服务器生成),前端代码将无法工作。
前端代码不会就不正确的 client_token
.
给出任何形式的警告
请注意,您将很难设置后端服务器,因为 Braintree 文档写得不好
连续使用 2 天后,我 post 我的代码片段,关于每月定期计费。
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>
旁注
不同的 API 调用,将产生不同的 Result
对象,但具有不同的属性。我怎么知道我需要调用 payment_method_token = result.payment_method.token
来检索 payment_method_token。您无法通过阅读文档来判断。您需要使用 pprint(vars(result))
对结果对象执行调试。 我会很高兴,如果 Braintree 的人可以告诉我,我如何通过阅读文档来查找此类信息。
命名不当且令人困惑。例如,Merchant Account 和 Merchant Account Id 是两个不同的东西。
我们尝试使用 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 步一样。但它没有。
请问有没有漏掉的步骤?
您需要设置适当的后端服务器,以便前端代码正常工作。因为,如果没有正确的 client_token
(从后端服务器生成),前端代码将无法工作。
前端代码不会就不正确的 client_token
.
请注意,您将很难设置后端服务器,因为 Braintree 文档写得不好
连续使用 2 天后,我 post 我的代码片段,关于每月定期计费。
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>
旁注
不同的 API 调用,将产生不同的
Result
对象,但具有不同的属性。我怎么知道我需要调用payment_method_token = result.payment_method.token
来检索 payment_method_token。您无法通过阅读文档来判断。您需要使用pprint(vars(result))
对结果对象执行调试。 我会很高兴,如果 Braintree 的人可以告诉我,我如何通过阅读文档来查找此类信息。命名不当且令人困惑。例如,Merchant Account 和 Merchant Account Id 是两个不同的东西。