You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Snipcart向Strapi发送购买确认请求以开通课程权限?

使用Snipcart Webhooks实现购课后Strapi课程权限自动开通

Webhooks完全是解决你这个需求的正确方案——Snipcart会在订单状态触发指定事件时,主动向你的Strapi后端发送请求,你只需要在Strapi中处理这个请求,完成用户课程权限的开通。下面是具体实现步骤:

1. 配置Snipcart Webhooks

  • 登录Snipcart后台,进入Settings > Webhooks页面
  • 添加新Webhook:
    • 触发事件选择order.completed(或order.paid,根据你对"购买完成"的定义选择)
    • 填写Payload URL为Strapi后端的自定义接口地址,比如https://your-strapi-domain/api/grant-course-access
    • 设置Secret(推荐):生成一个随机字符串,后续Strapi会用它验证请求合法性

2. 在Strapi中创建Webhook处理接口

步骤1:创建自定义控制器

在Strapi中新建一个course-access控制器,编写处理权限开通的逻辑:

// src/api/course-access/controllers/course-access.js
module.exports = {
  async grant(ctx) {
    // 验证Snipcart请求签名,防止非法请求
    const snipcartSecret = process.env.SNIPCART_SECRET;
    const requestSignature = ctx.request.headers['x-snipcart-request-signature'];
    const payload = ctx.request.body;
    
    const hmac = require('crypto').createHmac('sha256', snipcartSecret)
      .update(JSON.stringify(payload))
      .digest('base64');
    
    if (hmac !== requestSignature) {
      return ctx.unauthorized('Invalid request from Snipcart');
    }

    // 解析订单中的关键信息
    const userEmail = payload.customer.email;
    // 从订单商品中提取课程ID(需确保Snipcart商品ID与Strapi课程ID一致)
    const purchasedCourseIds = payload.items.map(item => item.id);

    // 查询Strapi中对应用户
    const user = await strapi.db.query('plugin::users-permissions.user').findOne({
      where: { email: userEmail },
      populate: ['enrolledCourses']
    });

    if (!user) {
      return ctx.notFound('User not found in Strapi');
    }

    // 避免重复添加课程权限
    const existingCourseIds = user.enrolledCourses.map(course => course.id);
    const newCourseIds = purchasedCourseIds.filter(id => !existingCourseIds.includes(id));

    // 更新用户的课程权限关联
    await strapi.db.query('plugin::users-permissions.user').update({
      where: { id: user.id },
      data: {
        enrolledCourses: [...existingCourseIds, ...newCourseIds].map(id => ({ id }))
      }
    });

    return ctx.send('Course access granted successfully', 200);
  }
};

步骤2:配置路由

在course-access的路由文件中添加接口路由:

// src/api/course-access/routes/course-access.js
module.exports = {
  routes: [
    {
      method: 'POST',
      path: '/grant-course-access',
      handler: 'course-access.grant',
      config: {
        auth: false, // 无需Strapi授权,因为是Snipcart直接调用
      }
    }
  ]
};

3. 关键注意事项

  • 确保Strapi的Webhook接口能被公网访问(本地开发可使用ngrok等工具做端口转发)
  • 必须保证Snipcart商品的id字段与Strapi课程的ID完全一致,否则无法正确关联
  • 测试阶段可以用Snipcart后台的"发送测试请求"功能验证接口逻辑,也可以用Snipcart的测试支付方式模拟真实订单
  • 记得在Strapi的环境变量中配置SNIPCART_SECRET,不要硬编码密钥

内容的提问来源于stack exchange,提问作者Kiwi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:28:01