You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.4 KiB
47 lines
1.4 KiB
2 years ago
|
import { API } from "../../lib/api.js";
|
||
|
import logging from '../../lib/logging.js';
|
||
|
import assert from 'assert';
|
||
|
import * as queues from "../../lib/queues.js";
|
||
|
import stripe_setup from "stripe";
|
||
|
import { stripe_private } from "../../lib/config.js";
|
||
|
|
||
|
const API_VERSION = stripe_private.api_version;
|
||
|
const log = logging.create("api/payments/stripe_webhook.js");
|
||
|
const hook_q = queues.create("stripe/webhook");
|
||
|
const stripe = stripe_setup(stripe_private.secret);
|
||
|
|
||
|
const validate_stripe = (api) => {
|
||
|
try {
|
||
|
assert(stripe_private.endpoint_secret, "Must set endpoint_secret in stripe. The stripe CLI prints this out.");
|
||
|
|
||
|
const sig = api.req.headers['stripe-signature'];
|
||
|
|
||
|
const event = stripe.webhooks.constructEvent(api.req.raw_body, sig, stripe_private.endpoint_secret);
|
||
|
|
||
|
// simulate the api.validate method for now
|
||
|
event._valid = true;
|
||
|
return event;
|
||
|
} catch (err) {
|
||
|
log.error(err);
|
||
|
return {_valid: false};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export const post = async (req, res) => {
|
||
|
const api = new API(req, res);
|
||
|
|
||
|
const msg = validate_stripe(api);
|
||
|
|
||
|
log.debug(`Stripe WebHook event ${msg.type} ID ${msg.id}`);
|
||
|
|
||
|
if(msg._valid) {
|
||
|
assert(msg.api_version == API_VERSION, `Stripe version is ${msg.api_version} but we use ${API_VERSION} created ${msg.created}`);
|
||
|
hook_q.add(msg);
|
||
|
api.reply(200, "OK");
|
||
|
} else {
|
||
|
api.error(400, "Bad Request");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export const get = post;
|