Cobrar o que o catálogo diz, uma vez, para a quantidade certa

FixBillingService
Shipped
10 de agosto de 2026 às 23:54 UTC
Author
Kamo
Commit
c54414c

Cinco defeitos que todos moveram dinheiro real, mais o IDOR sub-recurso abaixo deles. Ciclos de faturamento. Os preços anuais foram enviados à Stripe à taxa de armazenagem por mês em um intervalo de ANO, de modo que um plano semeado como "$28/mo anual" cobrado $28 uma vez por ano — um Faltam 12 vezes. QUARTA e SEMI ANUAL mapeados para um intervalo de meses e nunca definir intervalo conte, apesar de um comentário reivindicando o contrário, faturando o total montante do período por mês. BillingCycles agora possui a conversão e documentos as duas convenções de preços que a base de códigos tem genuinamente: SubscriptionPlanPrice Tem uma taxa por mês, **************** um total. Modelo de preços. Cada complemento foi faturado em quantidade = assentos, independentemente de sua preçoModelo, portanto, o org-wide armazenamento add-on custo 25x em uma org de 25 lugares, e porque Stripe rejeita uma quantidade sobre um preço medido, incluindo fez o toda a assinatura criar lançamento. Quantidade agora segue o modelo: assentos para PER SEAT, 1 para FLAT, ausente para USAGE BASED, pulou para ONE TIME. Mudança de planos. Os posts do console create() para "Alterar Plano"; create() chamado Subscription.create incondicionalmente e overwrite o id armazenado, deixando o assinatura anterior da Stripe ao vivo e sem referência — faturada duas vezes, para sempre. Ele Agora altera a assinatura existente quando há uma. update () ganhou o plano mudar tinha sido silenciosamente descartar, e reconcilia cada item de linha em vez do que apenas os itens[0], que deixaram congeladas quantidades adicionais em qualquer lugar do banco A contagem foi no dia em que a assinatura foi aberta. Add-on authorization. update() escreveu addonCodes diretamente do corpo da solicitação, o exato buraco auto-grant create() foi endurecido contra: um chamador de nível GRATUITO poderia enviar {"addonCodes":["MLOS"]} e intitular a aplicação hipotecária, sem facturação. Ambos os caminhos passam agora pela resoluçãoAddonCodes. Assets. assign () apenas perguntou se existia uma linha UNASSIGNED, e as linhas eram nunca destruído quando o número de assentos encolheu, então uma org que cortou 10 lugares para 3 Pode reatribuir os dez. Verifica agora a capacidade tanto do fresco como do Reactivação da sucursal, recusa-se a emitir lugares numa subscrição caducada, e assecureSeatRows recupera slots de reposição. Assinatura Stripe cancelada ou não agora caduca suas licenças — o webhook escreveu o status e parou, então membros Mantidos recursos pagos indefinidamente. Autorização. Provar a propriedade de {accountUid} foi toda a verificação; manipuladores depois carregaram assinaturas e licenças por seu próprio id e nunca compararam, então parear o seu próprio ID de conta com um UUID estrangeiro cancelou o pagamento de outra pessoa Assinatura ou revogação da sua sede. Limitado centralmente no interceptor assim rotas mais tarde são cobertos por padrão. Adiciona os primeiros testes sobre a conversão de preço, que não tinha nenhum.

All changes

Como o que vês no transporte?

Cada uma dessas atualizações pousa automaticamente em seu espaço de trabalho. Comece grátis e veja crescer semana após semana.

Começar Livre Para SempreVer Preços