- Spegnimento
- 6 settembre 2026 alle ore 21:39 UTC
- Autore
- Kamo
- Impegno
- 5cfc969
Un audit della console Plans & Billing contro le chiavi Live Stripe ha trovato la cucitura tra lo schermo e Stripe rotto in ogni direzione subito, e silenzioso in Tutti. Nessuna organizzazione aveva mai completato un abbonamento a pagamento, quindi ogni uno di questi avrebbe sparato sul primo vero cliente. CHE COSA IL CLIENTE E' CHIAMATO L'offerta pubblicizzata non è mai stata applicata. Le promozioni erano un concetto di visualizzazione: risolto da PlanCatalogService, portato al browser, colpito attraverso carte di piano, conteggiato nel banner — e poi l'abbonamento è stato creato senza coupon, senza sconto e senza codice promozionale. Una grana per uno dei tre attraverso il servizio non ha trovato nulla. StripePromotionService rispecchia il live promozione come un vero e proprio Stripe coupon, con oggetto con vale to. prodotti al piano proprio prodotto in modo che sconti i sedili e NON gli add-ons cavalcare accanto a loro, E' quello che ha sempre fatto. Il coupon id codifica la percentuale e la durata, in modo da modificare il catalogo mints un nuovo coupon invece di riutilizzare silenziosamente il vecchio tasso. La tassa di avvio non è mai stata addebitata. Entrambi i piani pagati portano $99 per posto, quindi un l'ordine di cinque posti deve $495 prima di un mese è fatturato. calcolarePrezzo cita, generare fatture fattura, ConsumerCheckoutService lo fattura — e questo percorso, il uno un'organizzazione effettivamente acquista attraverso, fatturato da nessuna parte, quindi lo stesso piano costa $495 meno a seconda di quale porta il cliente è venuto attraverso. SetupFeeBiller post come fattura in sospeso prima dell'apertura dell'abbonamento, quindi atterra su che l'abbonamento è la prima fattura, e chiede SetupFees per l'importo così un accordo negoziato (WAIVED, FLAT, PER SEAT OVERRIDE) è onorato. Una volta per il conto sul primo ordine, e per persona come la squadra cresce. I prezzi delle strisce si erano spostati verso la metà del catalogo. garantirePlanPrezzi cortocircuiti su una mappatura esistente, quindi un ri-prezzo ha cambiato ogni superficie tranne l'accusa: Business mensile quotato $119 e fatturato $72. L'unico rimedio era un piattaforma-admin endpoint nessuno aveva chiamato. Gli acquisti ora controllano la mappatura contro il catalogo e il punto prima della fatturazione, e una notte spazzare i rapporti alla deriva attraverso la tenuta. Il riconciliatore rifiuta ancora di spostare gli abbonati dal vivo, perché è una decisione commerciale piuttosto che una riconciliazione. Ciò che è successo quando ha funzionato Non è stata richiesta alcuna carta e nessuno è stato raccolto. Stripe ha aperto l'abbonamento con nulla da caricare, ha risposto `incompleto` — una risposta normale, non un'eccezione — e tutto a valle continuato: la fila è stata timbrata PAID, la prova è stata cancellato, e il cliente è stato detto che il loro piano è stato aggiornato su un abbonamento Stripe cancellerebbe entro il giorno. Un abbonamento a pagamento richiede ora un pagamento metodo, si apre con... la transazione torna con il processo intatto, e afferma uno stato live dopo. L'acquisto di un piano non firmato ogni sede nell'organizzazione. creare() cancellato ogni la licenza e li ha ricostruiti senza firma, e nulla ha messo nessuno indietro — compreso su un acquisto che è riuscito. rebalanceSubscription già riconcilia le righe dei sedili in entrambe le direzioni, quindi l'eliminazione non ha mai riconciliato nulla; è andato. Un add-on senza prezzo Stripe è stato concesso gratuitamente. desideratoEsems loggato "sarà non essere fatturato" e continuato, mentre il codice da solo concede l'app. Ora rifiuta. Che cosa è stato detto il cliente Ogni rifiuto legge "errore interno del server". Il servizio non aveva @ControllerAdvice, così una dozzina di frasi attentamente formulate, di fronte al cliente — il rifiuto Enterprise, il soffitto del sedile, la posta add-on guard — è diventato il corpo predefinito di primavera 500. BillingException Handler risponde 400 con il messaggio per una regola, 402 per un decoder, e una frase generica più un riferimento tracciabile per qualsiasi altra cosa, che non è mai echeggiato. Nessuna posta in sospeso potrebbe essere consegnata. DunningNotifier inviato a ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** /api/email/templates/send, che fa ed è dietro InternalAuthFilter, con segreto condiviso collegato attraverso i manifesti. I modelli atterrano in Kamo-shared-library 941c2421. Niente ha detto a un proprietario che il conto della loro organizzazione era fallito. /auto / avvisi sollevati avvisi solo per il proprio posto di un membro e gruppi che gestiscono — suono per un membro, che non può agire, ma il proprietario è esattamente chi può. Sono andato dal proprietario, quindi... la regola originale è ancora valida per tutti gli altri. L'impresa ha portato un prezzo fisso. I suoi termini sono negoziati e EnterprisePlanGuard rifiuta qualsiasi richiesta, ma il catalogo ha servito 119/109/99 mentre il sito pubblico ha detto "Custom" — una società, due risposte. Un piano CUSTOM arriva ora senza tariffa e senza tassa di installazione a meno che il chiamante possa effettivamente venderlo. Inoltre: quantità aggiuntive sono sul filo, quindi una bozza della console può iniziare da quello che l'abbonamento in realtà detiene piuttosto che da una mappa vuota che resetta lo storage blocchi a uno su salvare. Passo 282 test esistenti; 15 aggiunto che copre la derivazione coupon, la tassa di installazione compresi gli accordi negoziati, e che cosa un rifiuto assomiglia a un cliente.