package Ġde . paul we ber . routes . web hooks Ċ Ċ import Ġcom . stripe . model . Event Ċ import Ġcom . stripe . model . Payment Intent Ċ import Ġcom . stripe . net . Webhook Ċ import Ġde . paul we ber . profile Store Ċ import Ġde . paul we ber . routes . transaction . Transaction Ċ import Ġde . paul we ber . transaction Store Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . request .* Ċ import Ġio . ktor . response .* Ċ import Ġio . ktor . routing .* Ċ Ċ fun ĠApplication . register Webhook Routes () Ġ{ ĊĠĠĠ Ġval Ġwebhook Secret Ġ= Ġenvironment . config . property (" stripe . webhook Secret "). getString () ĊĠĠĠ Ġval Ġsignature Header Ġ= Ġ" Stripe - Signature " ĊĊĠĠĠ Ġfun Ġon Payment Intent Success ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( event . data Object Deserializer .` object ` ?. get () Ġas ĠPayment Intent ). let Ġ{ Ġpayment Intent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Store . find Ġ{ Ġit . payment Intent Id Ġ== Ġpayment Intent . id Ġ} ?. let Ġ{ Ġtransaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdon ation Value Ġ= Ġpayment Intent . metadata [" don ation Value "] !!. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . amount Ġ= Ġdon ation Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . amount With Fees Ġ= Ġpayment Intent . amount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . state Ġ= ĠTransaction . State . COMPLETE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Store [ transaction . recipient . id ]?. balance ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Store [ transaction . recipient . id ]?. balance Ġ= Ġit Ġ+ Ġdon ation Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Payment Intent Processing ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( event . data Object Deserializer .` object ` ?. get () Ġas ĠPayment Intent ). let Ġ{ Ġpayment Intent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Store . find Ġ{ Ġit . payment Intent Id Ġ== Ġpayment Intent . id Ġ} ?. let Ġ{ Ġtransaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . amount With Fees Ġ= Ġpayment Intent . amount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . amount Ġ= Ġpayment Intent . metadata [" don ation Value "] !!. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . state Ġ= ĠTransaction . State . PENDING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Payment Intent Failed ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( event . data Object Deserializer .` object ` ?. get () Ġas ĠPayment Intent ). let Ġ{ Ġpayment Intent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Store . find Ġ{ Ġit . payment Intent Id Ġ== Ġpayment Intent . id Ġ} ?. let Ġ{ Ġtransaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( transaction . state Ġ== ĠTransaction . State . PENDING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . state Ġ= ĠTransaction . State . FAILED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . amount With Fees Ġ= Ġpayment Intent . amount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . amount Ġ= Ġpayment Intent . metadata [" don ation Value "] !!. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhandle Stripe Event ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" payment _ intent . succeeded " Ġ-> Ġon Payment Intent Success ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" payment _ intent . payment _ failed " Ġ-> Ġon Payment Intent Failed ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" payment _ intent . processing " Ġ-> Ġon Payment Intent Processing ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠ Ġpost ("/ web hooks ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . request . headers [ signature Header ]?. let Ġ{ Ġsignature Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= Ġcall . receive < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeb hook . construct Event ( payload , Ġsignature , Ġwebhook Secret )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Stripe Event ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . OK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ Ġcall . respond ( HttpStatusCode . BadRequest ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ Ġcall . respond ( HttpStatusCode . BadRequest ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }