Я недавно интегрировал подписки 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 на их портале.

Покупка подписки

Чтобы подписаться на один из наших планов, нам нужно сделать несколько шагов. Нам надо:

  1. Создайте запись о нашем клиенте в Braintree.
  2. Используйте идентификатор клиента и одноразовый номер платежа, чтобы получить токен способа оплаты
  3. Используйте токен способа оплаты, чтобы подписаться на план

Мы можем сделать это, обновив нашу конечную точку оформления заказа до следующего:

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 нового клиента.

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

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