Como coletar e dividir pagamentos com a API do Stripe
Published: 2023-11-19 02:43:45

## Antes de tudo: o que é o [Biome](https://biome.sigcoding.com)?

O Biome é um marketplace de aplicações web criado por desenvolvedores, para desenvolvedores. Nós da [Sig](https://dev.to/sigcoding) tivemos a ideia de criar um novo ambiente onde qualquer desenvolvedor possa publicar as suas novas aplicações e monetizá-las ou não, gerando assim uma nova oportunidade para novas pessoas criarem credibilidade no seu portfolio, conseguindo usar as suas vendas e métricas como parâmetro para a sua confiabilidade como um profissional da tecnologia -- ou uma pessoa com hobbie de criar coisas boas.


![Biome](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mjkhhrks4w9dygu5ndr2.png)

------

## Prefácio

Um dos maiores desafios que tivemos durante o desenvolvimento do nosso marketplace de aplicações web (Biome) foi como desenvolver um pagamento confiável e resiliente para que os nossos usuários tenham certeza de que serão corretamente monetizados por suas criações. Durante o processo de pesquisa e entendimento de gateways de pagamento, chegamos à conclusão de que o gateway que melhor atendia as nossas necessidades e expectativas agora a nível de MVP foi o Stripe, pelos seguintes motivos que serão explicados durante esta publicação:

1 - Comunidade 
2 - Certificação de documentos
3 - Pagamento parcelado
4 - Split Payment 
5 - API

## Opiniões da comunidade sobre o Stripe

A documentação do Stripe é elogiada por todos os desenvolvedores que precisam implementarem os seus serviços em uma de suas criações.

<blockquote class="twitter-tweet"><p lang="pt" dir="ltr">eu daria muito um premio pra um dev do stripe por ter criado o MELHOR dashboard de todos os tempos <a href="https://t.co/XTPxzu1AYR">pic.twitter.com/XTPxzu1AYR</a></p>&mdash; igor duca (@ducaswtf) <a href="https://twitter.com/ducaswtf/status/1724488056667857273?ref_src=twsrc%5Etfw">November 14, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="pt" dir="ltr">e a melhor documentação tbm, padrão rubista de qualidade</p>&mdash; cherry 🏳️‍⚧️🍒 (@cherry_ramatis) <a href="https://twitter.com/cherry_ramatis/status/1724581852663451721?ref_src=twsrc%5Etfw">November 15, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[Confiram os artigos da Cherry](https://dev.to/cherryramatis)

----------

Tendo isso em mente, foi ainda mais fácil tomar a decisão de usar o Stripe como principal gateway de pagamento, mesmo sabendo sobre o seu principal ponto negativo: a falta de suporte a Pix.

### Não tem Pix????

Por ser um gateway de pagamento usado globalmente, mas, principalmente nos Estados Unidos, o Stripe tende a ter mais suporte para tecnologias americanas do que a queridinha brasileira, mas, de qualquer forma, temos alguns outros pontos que fazem a falta de suporte a Pix ser apenas um "dá pra esperar lançar".

## Certificação de Documentos

A responsabilidade de programar um marketplace do zero é muito grande, e é por isso que temos que fazer ótimas escolhas pensando principalmente na UX e confiança dos nossos usuários. Um dos nossos maiores receios era o de acontecerem calotes ou falhas de pagamento na plataforma, e, uma das saídas que encontramos foi a certificação de documentos (RG, CNPJ, CNH) dentro da implementação de uma conta de parceiro do Biome -- usando a API de pagamentos do Stripe.

### Por trás do código da criação de uma conta de parceiro

O Stripe tem essa funcionalidade muito legal chamada Stripe Connect. O Stripe Connect te permite a criar uma conta para o seu negócio e cadastrar parceiros que vão receber uma certa porcentagem (programática) por cada uma das suas vendas. No código abaixo está sendo demonstrada a forma mais simples de se criar uma conta de parceiro no Stripe:

```ts
// createStripeAccount.ts

import Stripe from "stripe";
import { createAccountLink } from "./createAccountLink";

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY as string, {
  apiVersion: "2023-08-16",
});

export const createStripeAccount = () => {
  return stripe.accounts.create({
      type: "express",
      email: "youremail@email.com",
      country: "BR",
      capabilities: {
        card_payments: { requested: true },
        transfers: { requested: true },
      },
  });
};
```

A única funcionalidade do código acima é registrar uma conta para o usuário parceiro da sua empresa no Stripe usando apenas o seu email como referência. Para que o usuário consiga receber os pagamentos, ele precisa preencher alguns outros dados obrigatórios, mas, para isso, você deve gerar um `accountLink` para que ele forneça as outras informações para o próprio Stripe.

```ts
// createStripeAccountLink.ts

import Stripe from "stripe";

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY as string, {
  apiVersion: "2023-08-16",
});

export const createAccountLink = (
  accountId: string,
  returnUrl: string
) => {
  return stripe.accountLinks.create({
    account: accountId,
    refresh_url: "https://biome.sigcoding.com/reauth",
    return_url: returnUrl,
    type: "account_onboarding",
  });
};
```

O account link deve ser enviado para o usuário -- ou o usuario também pode ser redirecionado para ele, que é a forma como eu lido com esse link -- e nele, serão pedidas as outras informações sobre endereço e documentação.

![Tela de configuração para ser parceiro do Biome](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7h8dl9c8qjn9z7jz63oz.jpeg)

### FAQ: Tentei fazer uma cobrança com o usuário criado com o código acima e não funcionou por conta de falta de requerimentos

A falta de requerimento pode significar uma lista de coisas:
- O usuário não preencheu todos os documentos necessários
- Você não especificou os requerimentos na função de criação do usuário e então não foram requisitadas as informações
- Os documentos ainda estão em tempo de análise

A última observação foi algo que aprendi enquanto debugava os pagamentos do Biome: o Stripe não especifica nos retornos quanto tempo demorará para que eles consigam confirmar os documentos do seu usuário e assim fazer com que ele esteja elegível para receber ou para ser cobrado, mas, você ainda pode conferir isso pelo CMS do próprio Stripe:

![Tela de usuários cadastrados no Stripe Connect](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nmc2ueg8c1bdwn1cch2s.png)

[Aqui está o link que te leva para a tela de overview das contas do Stripe Connect](https://dashboard.stripe.com/test/connect/accounts/overview). Esse link vai te ajudar a ter uma noção de quantos usuários parceiros estão cadastrados hoje na sua plataforma.

### Tenho usuários cadastrados, como faço para receber um pagamento e repassar uma parte do pagamento para essas pessoas?

Se você quer criar uma espécie de marketplace e repassar valores de compras para usuários, a solução de transferências do Stripe resolve muito bem o seu problema, e tudo o que você precisa é da seguinte implementação:

```ts
// Código retirado da própria documentação do Stripe

// Set your secret key. Remember to switch to your live secret key in production.
// See your keys here: https://dashboard.stripe.com/apikeys
const stripe = require('stripe')('sk_test_51O4brBKOx2aErhkvVXzbwdtFk99FvB1M94fbbvwnJPJDMUNs97SATizCSqjSosH9CfBOcwEVVSJeckuabmcBiM3K003TXv4Rdr');

const session = await stripe.checkout.sessions.create({
  mode: 'payment',
  line_items: [
    {
      price: '{{PRICE_ID}}',
      quantity: 1,
    },
  ],
  payment_intent_data: {
    application_fee_amount: 123,
    transfer_data: {
      destination: '{{CONNECTED_ACCOUNT_ID}}',
    },
  },
  success_url: 'https://example.com/success',
  cancel_url: 'https://example.com/cancel',
});
```

O código acima foi retirado [dessa documentação do Stripe](https://dashboard.stripe.com/test/connect/accounts/overview). Basicamente o que está acontecendo aí é que esse código gera um checkout -- ou seja, esse código gera uma tela onde os seus usuários podem fazer um pagamento com o cartão de crédito -- e quando a compra é completa, um valor automaticamente é transferido para uma conta do Stripe.

#### FAQ: Mas e se meus usuários não tiverem uma conta no Stripe?

Não tem problema nenhum, por isso você vai apenas usar a conta do Stripe Connect criada com um dos códigos citados anteriormente aqui para fazer essa função, já que você cria uma conta pro usuário, independente se ele tiver uma conta ou não, evitando assim que pessoas tenham de "perder tempo" criando uma conta do Stripe só para receber o dinheiro delas no seu app.

## Algumas outras perguntas legais:
### FAQ: Quando os usuários são pagos?

O Stripe Connect paga os usuários diariamente, mas você pode ter mais informações sobre isso [aqui](https://stripe.com/br/connect/payouts).

#### FAQ: Quanto de taxa o Stripe tem?

O Stripe Connect tem uma taxa de 0,25% + USD 0,25 por transação enviada. Você pode ter mais detalhes [aqui](https://stripe.com/pt-br-us/connect/pricing).

#### FAQ: Funciona localmente?

A API do Stripe é bem amigável com devs, então você pode não só testar pagamentos e cobranças localmente (ou em prod, se estiver com coragem) usando as chaves de teste mas eles também te deixam testar webhooks usando o Stripe CLI.

[Documentação do Stripe](https://stripe.com/docs/connect)

------ 

Sig Coding
Sig is a community-first DAO startup that produces SaaS applications powered by its own community. We spend time thinking on how to make things better and how to make tech be more environment-friendly.

------

Thumbnail feita por [Igor Duca](https://twitter.com/ducaswtf).