| 1133 | } |
| 1134 | |
| 1135 | async function webhookHandler(event: HandlerEvent<"HTTP">, logger: Logger) { |
| 1136 | logger.debug("[@trigger.dev/stripe] Handling webhook payload"); |
| 1137 | |
| 1138 | const { rawEvent: request, source } = event; |
| 1139 | |
| 1140 | if (!request.body) { |
| 1141 | logger.debug("[@trigger.dev/stripe] No body found"); |
| 1142 | |
| 1143 | return { events: [] }; |
| 1144 | } |
| 1145 | |
| 1146 | const rawBody = await request.text(); |
| 1147 | |
| 1148 | const signature = request.headers.get("stripe-signature"); |
| 1149 | |
| 1150 | if (signature) { |
| 1151 | const stripeClient = new StripeClient("", { apiVersion: "2022-11-15" }); |
| 1152 | |
| 1153 | try { |
| 1154 | const event = await stripeClient.webhooks.constructEventAsync(rawBody, signature, source.secret); |
| 1155 | |
| 1156 | return { |
| 1157 | events: [ |
| 1158 | { |
| 1159 | id: event.id, |
| 1160 | payload: event.data.object, |
| 1161 | source: "stripe.com", |
| 1162 | name: event.type, |
| 1163 | timestamp: new Date(event.created * 1000), |
| 1164 | context: { |
| 1165 | apiVersion: event.api_version, |
| 1166 | livemode: event.livemode, |
| 1167 | request: event.request, |
| 1168 | previousAttributes: event.data.previous_attributes, |
| 1169 | }, |
| 1170 | }, |
| 1171 | ], |
| 1172 | }; |
| 1173 | } catch (error) { |
| 1174 | if (error instanceof Error) { |
| 1175 | logger.error("[@trigger.dev/stripe] Error while validating webhook signature", { |
| 1176 | error: { name: error.name, message: error.message }, |
| 1177 | }); |
| 1178 | } else { |
| 1179 | logger.error("[@trigger.dev/stripe] Unknown Error while validating webhook signature"); |
| 1180 | } |
| 1181 | |
| 1182 | return { events: [] }; |
| 1183 | } |
| 1184 | } |
| 1185 | |
| 1186 | return { |
| 1187 | events: [], |
| 1188 | }; |
| 1189 | } |