0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-01-27 22:49:56 -05:00
ghost/core/server/services/stripe/config.js

108 lines
3.4 KiB
JavaScript
Raw Normal View History

const logging = require('@tryghost/logging');
const tpl = require('@tryghost/tpl');
const messages = {
remoteWebhooksInDevelopment: 'Cannot use remote webhooks in development. See https://ghost.org/docs/webhooks/#stripe-webhooks for developing with Stripe.'
};
// @TODO Refactor to a class w/ constructor
/**
* @typedef {object} StripeURLConfig
* @prop {string} checkoutSessionSuccessUrl
* @prop {string} checkoutSessionCancelUrl
* @prop {string} checkoutSetupSessionSuccessUrl
* @prop {string} checkoutSetupSessionCancelUrl
*/
module.exports = {
getConfig(settings, config, urlUtils) {
/**
* @returns {StripeURLConfig}
*/
function getStripeUrlConfig() {
const siteUrl = urlUtils.getSiteUrl();
const checkoutSuccessUrl = new URL(siteUrl);
checkoutSuccessUrl.searchParams.set('stripe', 'success');
const checkoutCancelUrl = new URL(siteUrl);
checkoutCancelUrl.searchParams.set('stripe', 'cancel');
const billingSuccessUrl = new URL(siteUrl);
billingSuccessUrl.searchParams.set('stripe', 'billing-update-success');
const billingCancelUrl = new URL(siteUrl);
billingCancelUrl.searchParams.set('stripe', 'billing-update-cancel');
return {
checkoutSessionSuccessUrl: checkoutSuccessUrl.href,
checkoutSessionCancelUrl: checkoutCancelUrl.href,
checkoutSetupSessionSuccessUrl: billingSuccessUrl.href,
checkoutSetupSessionCancelUrl: billingCancelUrl.href
};
}
/**
* @param {'direct' | 'connect'} type - The "type" of keys to fetch from settings
* @returns {{publicKey: string, secretKey: string} | null}
*/
function getStripeKeys(type) {
const secretKey = settings.get(`stripe_${type === 'connect' ? 'connect_' : ''}secret_key`);
const publicKey = settings.get(`stripe_${type === 'connect' ? 'connect_' : ''}publishable_key`);
if (!secretKey || !publicKey) {
return null;
}
return {
secretKey,
publicKey
};
}
/**
* @returns {{publicKey: string, secretKey: string} | null}
*/
function getActiveStripeKeys() {
const stripeDirect = config.get('stripeDirect');
if (stripeDirect) {
return getStripeKeys('direct');
}
const connectKeys = getStripeKeys('connect');
if (!connectKeys) {
return getStripeKeys('direct');
}
return connectKeys;
}
const keys = getActiveStripeKeys();
if (!keys) {
return null;
}
const env = config.get('env');
let webhookSecret = process.env.WEBHOOK_SECRET;
if (env !== 'production') {
if (!webhookSecret) {
webhookSecret = 'DEFAULT_WEBHOOK_SECRET';
logging.warn(tpl(messages.remoteWebhooksInDevelopment));
}
}
const webhookHandlerUrl = new URL('members/webhooks/stripe/', urlUtils.getSiteUrl());
const urls = getStripeUrlConfig();
return {
...keys,
...urls,
enablePromoCodes: config.get('enableStripePromoCodes'),
webhookSecret: webhookSecret,
webhookHandlerUrl: webhookHandlerUrl.href
};
}
};