- Navios
- 6 de setembro de 2026 às 21:39 UTC
- Autor
- Kamo
- Enviar
- 5cfc969
Uma auditoria do console Plans & Billing contra chaves live Stripe encontrou a costura entre a tela e Stripe quebrado em todas as direções de uma vez, e silencioso em Todos eles. Nenhuma organização tinha concluído uma assinatura paga, então cada Um destes teria disparado contra o primeiro cliente de verdade. O QUE O CLIENTE FOI CHARGADO A oferta anunciada nunca foi aplicada. As promoções foram um conceito de exibição: resolvido pelo PlanCatalogService, levado ao navegador, plan cards, contados no banner — e então a assinatura foi criada sem cupom, sem desconto e sem código de promoção. Um grep para qualquer um dos três através do serviço não encontrou nada. StripePromotionService espelhos ao vivo promoção como um cupom Stripe real, escopo com applys to. produtos ao plano produto próprio para que ele descontos os assentos e não os add-ons montando ao lado deles, que é o que sempre fez. Identificação do cupão codifica a percentagem e a duração, pelo que a edição do catálogo contém um novo cupão Em vez de reutilizar silenciosamente a taxa antiga. A taxa de inicialização nunca foi cobrada. Ambos os planos pagos carregam $99 por assento, então a O pedido de cinco lugares deve 495 dólares antes de um mês ser cobrado. calcularPreço aspas-lo, Gerar a factura, ConsumerCheckoutService, e este caminho, o uma organização realmente compra através, faturado em nenhum lugar, então o mesmo plano custa $495 a menos dependendo de qual porta o cliente passou. ConfiguraçãoFeeBiller publica-o como um item de fatura pendente antes da assinatura abrir, para que pouse em essa assinatura é a primeira fatura própria, e pede SetupFees para o montante de Acordo negociado (WAIVED, FLAT, PER SEAT OVERRIDE) é honrado. Uma vez para conta na primeira ordem, e por pessoa como a equipe cresce. Os preços das listras tinham passado para cerca de metade do catálogo. garantirPlanPrices curto-circuitos em um mapeamento existente, então um re-preço mudou cada superfície, exceto a carga: Negócio mensal citado $119 e faturado $72. O único remédio era Endpoint plataforma-administração ninguém tinha ligado. Compras agora verificar o mapeamento contra o catálogo e remarcar antes de faturar, e uma varredura noturna relatórios Atravessar a propriedade. O reconciliador ainda se recusa a mover assinantes ao vivo, porque é uma decisão comercial e não uma reconciliação. O QUE ACONTECEU QUANDO FALHOU Nenhum cartão foi necessário e nenhum foi coletado. Stripe abriu a assinatura com nada a cobrar, respondeu `incompleto` — uma resposta normal, não uma exceção — E tudo a jusante continuou: a fila foi carimbada PAID, o julgamento foi apagado, e o cliente foi informado de que seu plano foi atualizado por meio de uma assinatura Stripe apagaria dentro do dia. Uma subscrição paga exige agora um pagamento método, abre com ************* então um decodificador lança e a transação volta com o julgamento intacto, e afirma um estado de vida Depois. Comprar um plano sem atribuir todos os lugares da organização. create() apagado a cada licença e reconstruí-los sem atribuição, e nada colocar ninguém de volta — incluindo em uma compra que teve sucesso. ReequilíbrioAssinatura já reconcilia as filas de lugares ambas as direções, de modo que o delete nunca estava reconciliando nada; ele se foi. Um complemento sem preço Stripe foi concedido gratuitamente. DesejedItems logado "ll will não ser cobrado" e continuou, enquanto o código sozinho concede o aplicativo. Agora. recusa-se. O QUE Foi DIZIDO AO CLIENTE Cada recusa leu "Erro no Servidor Interno". O serviço não tinha @ControllerAdvice, assim, uma dúzia de sentenças cuidadosamente formuladas, voltadas para o cliente — a recusa da empresa, o teto do assento, o guarda adicional do correio — tornou-se o corpo padrão da Spring 500. BillingException Handler responde 400 com a mensagem para uma regra, 402 para um decodificador, e uma frase genérica mais uma referência rastreável para qualquer outra coisa, que nunca é ecoado. Nenhum e-mail pode ser entregue. DunningNotifier postou em ************* que não existe; agora chama /api/email/templates/enviar, que faz e está por trás do InternalAuthFilter, com Um segredo partilhado ligado aos manifestos. Os modelos caem em Kamo-shared-library 941c2421. Nada dizia que a conta da organização tinha falhado. /auto/alertas levantadas alertas apenas para o lugar e grupos de um membro que gerem — som para um membro, que não pode agir, mas o dono é exatamente quem pode. Alcançado ao proprietário, assim o A regra original ainda é válida para todos os outros. A empresa tinha um preço firme. Seus termos são negociados e EnterprisePlanGuard recusa qualquer pedido que o nomeie, mas o catálogo serviu 119/109/99 enquanto site público disse "Alfândega" — uma empresa, duas respostas. Chega agora um plano ADUANEIRO sem taxa e sem taxa de instalação, a menos que o chamador possa realmente vendê-la. Além disso: as quantidades adicionais estão no fio, então um rascunho de console pode começar do que a assinatura realmente detém em vez de um mapa vazio que reinicia o armazenamento blocos para um em salvo. 282 teste existente passe; 15 adicionado cobertura derivação de cupom, a taxa de instalação incluindo acordos negociados, e o que uma recusa parece para um cliente.