Liberar saldo bloqueado em custodia na Moip

Quando a plataforma utiliza o gateway Wirecard, o gerenciamento do saldo disponível para saque dos vendedores é manual e realizado pelo próprio vendedor através de sua conta na plataforma.

a1c830d5-4dbf-4805-aa88-523d9825f434

Adicionalmente, quando a plataforma trabalha com pagamentos em garantia, essa função passa a depender primeiramente da liberação desse saldo, que por sua vez ocorre automaticamente após o prazo configurado na plataforma:

d9b6d847-aa10-4502-868c-514505d9f8eb

Ou quando o comprador manualmente "aprova" que deu tudo certo com o pedido e libera o pagamento ao vendedor:

a0f23691-8b0f-4a69-ac4f-a8d693184ee3

Contudo, pode acontecer do saldo não ser liberado corretamente e permanecer bloqueado.


Como resolver

Acesse seu banco de dados (preferencialmente uma cópia para evitar "problemas" produção), você precisará do token de autenticação "GatewayApiToken" do vendedor em questão.

O "GatewayApiToken" fica na tabela "GatewayRegistrationLog" e pode ser filtrado pelo "SellerId" do vendedor (pegue sempre o mais atual, analisando a coluna "CreatedAt" pois esta tabela é um histórico de alterações, então podem haver várias para o mesmo usuário).
Para obter o "SellerId" do vendedor, você poderá encontra-lo na tabela "dbo.Person" ou acessando a plataforma via painel admin, clicando no perfil do vendedor:

Plataforma:

128856df-4cde-4bff-92d9-7582abd11750

Banco de dados:

830da23a-a3cc-42d7-92cc-1b2733ac5322

Query:

SELECT *
FROM GatewayRegistrationLog
WHERE SellerId ='SELLER-ID';

2 - Esse código será utilizado como autenticação (OAuth 2.0) no Postman, para você poder enviar as requisições. Serão 3 requisições no total, para cada pedido afetado por essa "trava" de bloqueio de saldo:

92d33a74-f6da-4d4f-9bae-cabe0ec91c89

Observação:

→ Antes de avançar para os pontos seguintes, vale tentar essa alternativa, que pode ser mais fácil: seria utilizar o endpoint "https://api.moip.com.br/v2/entries/" para tentar filtrar todos os lançamentos cujos pagamentos atrelados tiveram, em algum momento, saldo bloqueado, utilizando os filtros "limit" e "type":

"https://api.moip.com.br/v2/entries/?limit=1000&filters=type::in(ESCROW_BLOCKED)"

Com isso, talvez se torne possível saber com mais facilidade quais pagamentos deverá investigar para descobrir se estão com o escrow ativo (isto é, saldo bloqueado).


3 - Caso não dê certo por qualquer motivo, será preciso saber quais pedidos foram afetados. Para isso, basta consultar o banco de dados, pela tabela "OrderTransaction", e tomar nota do código da coluna "TransactionId" (ORD-############). Este é o código que identifica o pedido atrelado àquela transação, no gateway.

8e78de3d-67ee-4113-a29f-7c6094e5c5d3

4 - Muito bem. Agora vamos às requisições. A primeira será para consultar os dados dos pedidos da plataforma que você identificou como sendo os afetados pela "custodia", utilizando o token de acesso da etapa 1 como autenticação. Isso pode ser feito através do endpoint "https://api.moip.com.br/v2/orders/ORD-############".


5 - Com isso, será possível identificar a transação de pagamento associada a tal pedido (PAY-########):

Payments

6 - Tomando nota do ID da transação, passamos para a segunda requisição, através do endpoint "https://api.moip.com.br/v2/payments/PAY-############". Na resposta dessa requisição, será possível identificar o bloqueio de saldo, chamado pela Wirecard de "escrow" (ECW-############):

Escrows

7 - Caso o bloqueio de saldo esteja em efeito, o parâmetro "status" estará constando como "HELD". Nesse caso, tome nota do ID desse "escrow", pois o mesmo será usado na próxima requisição.


8 - Por fim, realizar a terceira e última requisição para o endpoint "https://api.moip.com.br/v2/escrows/ECW-############/release", com método POST. Isso realizará a liberação do saldo bloqueado para o respectivo pedido, permitindo uma nova tentativa de saque por parte do vendedor:

EscrowRelease

→ Caso o retorno da requisição seja o status "415 Unsupported Media Type", basta adicionar um header à requisição, informando o parâmetro Content-Type como "application/json":

ContentType