/
stripe-provider.ts
64 lines (55 loc) 路 2.05 KB
/
stripe-provider.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import {getStripeSdk} from '@skillrecordings/stripe-sdk'
import {first} from 'lodash'
import Stripe from 'stripe'
import {
StripeProviderFunction,
PurchaseMetadata,
PurchaseInfo,
PurchaseInfoSchema,
} from './default-payment-options'
export const StripeProvider: StripeProviderFunction = (config) => {
const stripeClient =
'defaultStripeClient' in config
? config.defaultStripeClient
: new Stripe(config.stripeSecretKey, {
apiVersion: config.apiVersion,
})
const getStripePurchaseInfo = async (checkoutSessionId: string) => {
const {getCheckoutSession} = getStripeSdk({ctx: {stripe: stripeClient}})
const checkoutSession = await getCheckoutSession(checkoutSessionId)
const {customer, line_items, payment_intent, metadata} = checkoutSession
const {email, name, id: stripeCustomerId} = customer as Stripe.Customer
const lineItem = first(line_items?.data) as Stripe.LineItem
const stripePrice = lineItem.price
const quantity = lineItem.quantity || 1
const stripeProduct = stripePrice?.product as Stripe.Product
const {charges} = payment_intent as Stripe.PaymentIntent
const stripeCharge = first<Stripe.Charge>(charges.data)
const stripeChargeId = stripeCharge?.id as string
const stripeChargeAmount = stripeCharge?.amount || 0
// extract MerchantCoupon identifier if used for purchase
const discount = first(lineItem.discounts)
const stripeCouponId = discount?.discount.coupon.id
const parsedMetadata = metadata
? PurchaseMetadata.parse(metadata)
: undefined
const info: PurchaseInfo = {
customerIdentifier: stripeCustomerId,
email,
name,
productIdentifier: stripeProduct.id,
product: stripeProduct,
chargeIdentifier: stripeChargeId,
couponIdentifier: stripeCouponId,
quantity,
chargeAmount: stripeChargeAmount,
metadata: parsedMetadata,
}
return PurchaseInfoSchema.parse(info)
}
return {
name: 'stripe',
paymentClient: stripeClient,
getPurchaseInfo: getStripePurchaseInfo,
}
}