Stripe-dotnet: Criando Assinatura Pagando com Cartão Específico

Criado em 23 mai. 2017  ·  10Comentários  ·  Fonte: stripe/stripe-dotnet

Ok, me cansei tentando examinar sua documentação, assim como a de Stripe, e simplesmente não consigo resolver o seguinte:

Parece que quando eu uso o StripeSubscriptionService para criar uma assinatura , a assinatura é criada, faturada e paga com o cartão de crédito padrão do cliente. Não importa que pareça um pouco demais, mas gostaria de fornecer um token de cartão de crédito para que esse cartão específico seja usado para pagar.

Tentei de tudo em que posso pensar para fazer isso acontecer, então devo estar perdendo algo simples. Você pode ajudar?

Obrigado Jayme, posso doar para a sua causa em algum lugar? Este utilitário está me economizando muito tempo e energia ... muito apreciado.


PS: Eu adoraria ver a documentação para ter um controle mais granular sobre assinaturas / faturas / pagamentos ... Por que você não cria uma assinatura; em seguida, crie um item de linha para essa assinatura; em seguida, crie uma fatura; em seguida, adicione essa linha à fatura; então pagar a fatura com cartão de crédito? De qualquer forma, agradeço antecipadamente por sua ajuda.

Comentários muito úteis

Eu encontrei uma solução alternativa: tornar o cartão selecionado o padrão antes de criar a assinatura, mas isso ainda parece "errado" para mim ... Eu ainda adoraria ouvir você.

Todos 10 comentários

Eu encontrei uma solução alternativa: tornar o cartão selecionado o padrão antes de criar a assinatura, mas isso ainda parece "errado" para mim ... Eu ainda adoraria ouvir você.

@zorpiedoman sim, esta é a única maneira que funciona a partir de agora. Eu tentei fazer isso também, mas não funcionará a menos que você defina o cartão selecionado como o padrão.

Além disso, você enfrentou um problema em que obteve um erro dizendo "nenhum token deste tipo:"? Isso não acontece o tempo todo, mas às vezes acontece

Acho que enfrentei esse problema desde que atualizei de 8.4 para 9.0, não tinha nenhum erro antes da atualização.

Estou apenas começando, então ainda fiz apenas alguns testes. Que ligação você está fazendo quando recebe esse erro? Além disso, se você não se importa, quais são os erros de processamento mais comuns com os quais você tem que lidar .. isso seria bom saber agora para que eu possa estar pronto para eles .. OBRIGADO!

Não tive muitos erros, mas este é um que eu adoraria que fosse corrigido.
O erro que mencionei acima é ao tentar atualizar o plano de uma assinatura fornecendo-lhe uma identificação de cartão como fonte

No momento, o Stripe sempre cobra a fonte padrão de um cliente por uma assinatura. Isso significa que se você tiver um cliente com duas assinaturas e 3 cartões, ambas as assinaturas criarão faturas em cada novo ciclo de faturamento e essas faturas serão sempre pagas pela fonte padrão e ignoram completamente os outros cartões disponíveis. No entanto, essa é uma limitação conhecida do produto que adoraríamos corrigir no futuro.

Se um cliente deseja começar a pagar com um novo cartão, você precisa primeiro colocar este cartão como a fonte padrão. Existem várias abordagens aqui:

1. O cartão já está salvo no cliente

Se o cartão já existe no cliente, você precisa chamar a API de atualização do cliente e definir o ID do cartão existente card_XXXXX como a fonte padrão. O código é parecido com este:

var myCustomer = new StripeCustomerUpdateOptions();
myCustomer.DefaultSource = "card_XXXXXX";
var customerService = new StripeCustomerService();
StripeCustomer stripeCustomer = customerService.Update("cus_AAAAA", myCustomer);

2. O cartão não é salvo no cliente e você deseja substituir o padrão

Nesse caso, você simplesmente atualizaria o cliente e colocaria o novo token do cartão tok_XXXX como a fonte. Isso excluirá automaticamente a fonte padrão atual e, em seguida, colocará o novo cartão como padrão. O código é parecido com este:

var myCustomer = new StripeCustomerUpdateOptions();
myCustomer.SourceToken = "tok_XXXXXX";
var customerService = new StripeCustomerService();
StripeCustomer stripeCustomer = customerService.Update("cus_AAAAA", myCustomer);

3. O cartão não é salvo e você deseja manter o cartão padrão atual

Nesse caso, primeiro você precisa usar a API Create Card para adicionar o cartão ao cliente. Em seguida, você coloca o novo cartão como o padrão, conforme explicado acima. O código ficaria assim:

// Add the card to the customer
var myCard = new StripeCardCreateOptions();
myCard.SourceToken = "tok_XXXXXX";
var cardService = new StripeCardService();
StripeCard stripeCard = cardService.Create("cus_AAAAA", myCard);

// Put the new card as the default
var myCustomer = new StripeCustomerUpdateOptions();
myCustomer.DefaultSource = stripeCard.Id;
var customerService = new StripeCustomerService();
StripeCustomer stripeCustomer = customerService.Update("cus_AAAAA", myCustomer);

4. Coloque o novo cartão como padrão, exclua o antigo, enquanto atualiza a assinatura

Existe uma solução extra semelhante à segunda que pode ser feita ao atualizar uma assinatura. A API Update Subscription no final do Stripe também terá um parâmetro de origem . Isso permite que você atualize (ou crie) uma assinatura e, ao mesmo tempo, substitua a fonte padrão no cliente associado. Este parâmetro espera uma id de token tok_XXXX . O código ficaria assim:

var subscriptionService = new StripeSubscriptionService();
subscriptionService.Source = "tok_XXXXX";
StripeSubscription stripeSubscription = subscriptionService.Update(*subscriptionId*);

@ remi-stripe Como eu agiria no seguinte caso:

  • Os clientes têm vários cartões
  • Ao atualizar sua assinatura ou criar uma nova, apresente a lista de cartões (StripeCard) para escolher
    * Realize a atualização da assinatura com o cartão selecionado

O que estou fazendo agora é:

  • Atualize o cliente com o cartão selecionado para torná-lo padrão
  • em StripeSubscriptionUpdateOptions / CreateOptions, Source = SelectedCard.Id

Isso costumava funcionar no passado sem erros, mas estou recebendo o erro no such token. Estou perdendo algo ou fazendo algo errado?

Em um estudo mais aprofundado, isso parece estar acontecendo apenas com algumas cartas, e ocasionalmente. Eu tinha três cartões diferentes, tentei com todos os três, mas só falhou com "nenhum token" para um cartão específico.

@ n1schal Isso provavelmente não é um problema com a biblioteca e mais um problema com seu código ou os identificadores que você passa como um parâmetro. Eu recomendo falar com nossa equipe de suporte diretamente para que eles possam olhar seus logs e ajudá-lo a depurar isso. Você pode alcançá-los aqui .

O erro No such token: XXXX ocorre quando seu código tenta passar um id que nosso sistema não espera. Se você colocar um cartão específico como fonte padrão, a API exceto o novo ID de cartão card_XXXXX e deve existir no cliente. Se você deseja passar Source na atualização ou criação da assinatura, não esperamos uma id de cartão, em vez disso, esperamos uma nova id de token tok_XXXXX .

Com base no que você está tentando fazer, nunca defina o parâmetro Source na atualização ou criação da assinatura, pois o cartão já está salvo no cliente.

@ remi-stripe O cartão é registrado para o cliente, caso contrário, como ele retornaria o cartão com a id específica que estou obtendo para o erro "Nenhum token: card_xxxxx"? E se funcionar para outras placas e falhar para algumas, como pode haver um problema com o meu código?

Com certeza tentarei entrar em contato com a equipe de suporte. Mas, de qualquer forma, qual é a maneira correta se quisermos permitir que os assinantes escolham um cartão para a atualização ou criação de sua assinatura? Ou devo simplesmente ignorar a possibilidade de os clientes escolherem um cartão?

@ n1schal Quando você passa source , apenas aceitamos um token de cartão tok_XXXX . Isso significa que você tokenizou um cartão do lado do cliente e está adicionando esse cartão como um novo cartão para o cliente e o coloca como padrão enquanto exclui a fonte padrão antiga.

Isso nunca funcionará se você passar uma identificação de cartão card_XXXX de um cartão já salvo no cliente. É apenas para novos cartões. Se você já tiver um cartão salvo, primeiro atualize o cliente e coloque esse cartão como padrão e, em seguida, crie a assinatura sem passar source .

encerrando - obrigado @ remi-stripe!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

joakimsansan picture joakimsansan  ·  5Comentários

MatteoMichelotti picture MatteoMichelotti  ·  14Comentários

rkrubeck picture rkrubeck  ·  5Comentários

bzbetty picture bzbetty  ·  5Comentários

goodyes picture goodyes  ·  8Comentários