
Я недавно интегрировал подписки Braintree в проект Next.js как часть создания screengrab.it - и это было непросто, как я ожидал, поэтому подумал, что документирую этот процесс здесь. Я понимаю, что первый вопрос здесь - Почему вы не используете полосу?. Stripe не поддерживает учетные записи из юрисдикции, в которой я живу, и мы ждали ~ 6 лет.
Stripe, Paypal и Braintree предоставляют аналогичные функции и цены. Paypal печально известен наличием плохой документации и является одной из причин, по которой они купили Braintree в 2013 году. Хорошим преимуществом Braintree является то, что он позволяет пользователям расплачиваться с помощью учетных записей Paypal.
Создайте учетную запись песочницы и подписки
Перейдите на https://www.braintreepayments.com/je/sandbox и зарегистрируйтесь с помощью учетной записи песочницы.
Перейдите в Подписки, затем в Планы, где вы можете создавать новые планы. Я создал 3 плана с идентификаторами «basic_monthly», «Recommended_monthly» и «enterprise_monthly».

Добавить в проект next.js
Перейдите к своему проекту next.js и добавьте braintree-web-drop-in-react. braintree-web-drop-in-react - это оболочка реакции для Drop-in UI от Braintree.
yarn add braintree-web-drop-in-react # or npm install braintree-web-drop-in-react
Добавьте в свой проект следующий компонент.
import React, { Component } from 'react'
import DropIn from "braintree-web-drop-in-react";
export default class Subscriptions extends Component {
instance;
state = {
clientToken: null,
purchaseComplete: false
};
render() {
if (this.state.purchaseComplete) {
return (
<div>
<h1>Completed.</h1>
</div>
);
} else {
return (
<div>
<DropIn
options={{ authorization: TOKENIZATION_KEY}}
onInstance={(instance) => (this.instance = instance)}
/>
<button onClick="">Submit</button>
</div>
);
}
}
}
Ваш TOKENIZATION_KEY создается на портале Braintree, щелкнув значок настроек в правом верхнем углу и выбрав API. Прокрутите вниз и нажмите Создать новый ключ токенизации. С ключом, добавленным при запуске проекта, вы должны увидеть всплывающий пользовательский интерфейс:

Обновите свой компонент, чтобы зацепить кнопку покупки. Метод берет одноразовый номер из всплывающего пользовательского интерфейса Braintree и отправляет его в конечную точку на вашем сервере; в моем случае я использовал / api / payment / checkout.
import React, { Component } from 'react'
import DropIn from "braintree-web-drop-in-react";
export default class Subscriptions extends Component {
instance;
state = {
clientToken: null,
purchaseComplete: false
};
async buy() {
// Send the nonce to your server
const { nonce } = await this.instance.requestPaymentMethod();
const res = await fetch('/api/payment/checkout',
{
body: JSON.stringify({
paymentMethodNonce: nonce,
user_id: "1234"
}),
headers: {
'Content-Type': 'application/json'
},
method: 'POST'
}
)
const result = await res.json()
if (result.result == "success") {
this.setState({
purchaseComplete: true
});
}
}
render() {
if (this.state.purchaseComplete) {
return (
<div>
<h1>Completed.</h1>
</div>
);
} else {
return (
<div>
<DropIn
options={{ authorization: TOKENIZATION_KEY}}
onInstance={(instance) => (this.instance = instance)}
/>
<button onClick={this.buy.bind(this)}>Submit</button>
</div>
);
}
}
}
Создайте конечную точку API
Создайте конечную точку api, которую вы добавили в действие покупки на предыдущем шаге. Для меня это был / api / payment / checkout.
Добавьте следующий код:
import gateway from '../../../utils/gateway'
export default async function checkout (req, res) {
// Use the payment method nonce here
const nonceFromTheClient = req.body.paymentMethodNonce;
// Create a new transaction for $10
const newTransaction = gateway.transaction.sale({
amount: '10.00',
paymentMethodNonce: nonceFromTheClient,
options: {
// This option requests the funds from the transaction
// once it has been authorized successfully
submitForSettlement: true
}
}, (error, result) => {
if (result) {
res.status(201).json({'result': 'success'})
} else {
res.status(500).send(error);
}
});
}
Этот код позволит совершить единовременную покупку на сумму 10,00 долларов США. Добавьте Braintree в свой проект:
npm install braintree
и импортируйте шлюз из папки utils или libs:
import braintree from 'braintree'
const environment = process.env.BRAINTREE_ENVIRONMENT
const gateway = new braintree.BraintreeGateway({
environment: braintree.Environment[environment],
merchantId: process.env.BRAINTREE_MERCHANT_ID,
publicKey: process.env.BRAINTREE_PUBLIC_KEY,
privateKey: process.env.BRAINTREE_PRIVATE_KEY
})
export default gateway;
Что импортирует мои ключи из моего .env
# Braintree BRAINTREE_ENVIRONMENT=Sandbox BRAINTREE_MERCHANT_ID=XXXXXXXXX BRAINTREE_PUBLIC_KEY=XXXXXXXXX BRAINTREE_PRIVATE_KEY=XXXXXXXXX
Вы можете найти свои собственные настройки обратно в винчестере настроек портала Braintree и выбрать Просмотр в разделе Ключи API.
Протестируйте разовую покупку
Если вы запустите проект и добавите карту с номером 4242 4242 4242 4242 и любой будущей датой истечения срока действия. Нажав на «Отправить», вы должны увидеть «Завершено». сообщение и иметь возможность видеть транзакции, попавшие в Braintree на их портале.

Покупка подписки
Чтобы подписаться на один из наших планов, нам нужно сделать несколько шагов. Нам надо:
- Создайте запись о нашем клиенте в Braintree.
- Используйте идентификатор клиента и одноразовый номер платежа, чтобы получить токен способа оплаты
- Используйте токен способа оплаты, чтобы подписаться на план
Мы можем сделать это, обновив нашу конечную точку оформления заказа до следующего:
import gateway from '../../../utils/gateway'
export default async function checkout (req, res) {
// Use the payment method nonce here
const nonceFromTheClient = req.body.paymentMethodNonce;
gateway.customer.create({
id: req.body.user_id,
email: "[email protected]",
}, (err) => {
if (err) return res.status(500).send(error);
gateway.paymentMethod.create({
customerId: req.body.user_id,
paymentMethodNonce: nonceFromTheClient
}, (err, result) => {
if (err) return res.status(500).send(error);
gateway.subscription.create({
paymentMethodToken: result.paymentMethod.token,
planId: "basic_monthly"
}, (err, result) => {
if (err) return res.status(500).send(error);
res.status(201).json({'result': 'success', 'subscription': result.subscription})
});
});
});
}
Здесь у нас есть идентификатор пользователя, который передается от клиента. PlanId - это идентификатор, который мы ввели при создании планов, для меня «basic_monthly».
Опять же, когда мы запустим это, мы должны увидеть «Завершено». На портале Braintree в Vault вы сможете найти клиентов и увидеть 1 нового клиента.

Если вы перейдете в Подписки и выполните поиск, вы должны увидеть активную подписку.

Если вы нажмете Планы, вы увидите список активных и отмененных подписок.
