如何在Keystone 6中访问底层express应用以集成Stripe?
Keystone 6 集成Stripe访问底层Express实现方案
你可以通过Keystone 6内置的server.extendExpress配置钩子直接操作底层Express实例,实现自定义路由返回Stripe Payment Intent的client secret,完整实现流程如下:
- 第一步:安装Stripe服务端SDK并完成初始化,敏感密钥统一从环境变量读取
- 第二步:在Keystone配置文件的
server配置块中添加extendExpress钩子,钩子入参即为当前Keystone使用的Express实例 - 第三步:在钩子内注册自定义接口路由,实现Payment Intent创建逻辑并返回client secret给前端
代码示例
import { config } from '@keystone-6/core'; import Stripe from 'stripe'; // 初始化Stripe实例 const stripe = new Stripe(process.env.STRIPE_SECRET_KEY as string, { apiVersion: '2023-10-16', // 替换为你实际使用的Stripe API版本 }); export default config({ // 此处省略你的其他Keystone配置:数据库配置、列表定义、session配置等 server: { // 此处省略其他server配置:端口、跨域规则等 extendExpress: (app) => { // 注册自定义Stripe支付接口,添加自定义前缀避免和Keystone内置路由冲突 app.post('/api/create-payment-intent', async (req, res) => { // 可在此处添加自定义鉴权逻辑,比如校验用户登录状态、参数合法性校验 const { amount } = req.body; // 创建Stripe Payment Intent const paymentIntent = await stripe.paymentIntents.create({ amount: amount, // 单位为对应币种的最小货币单位,例如人民币为分 currency: 'cny', // 替换为实际业务使用的币种 }); // 返回client secret给前端 res.send({ clientSecret: paymentIntent.client_secret }); }); }, }, });
注意事项
- 自定义路由请统一添加
/api等专属前缀,避免和Keystone内置的/api/graphql等系统路由冲突- 自定义接口默认没有鉴权逻辑,建议根据业务需求复用Keystone的session能力做身份校验,防止接口被恶意调用
- 请勿将Stripe密钥等敏感信息硬编码到配置文件中,统一通过环境变量注入
内容的提问来源于stack exchange,提问作者FRMR
相关产品推荐
相关产品推荐

