EdgeOne Makers 电商支付与其他集成
上一篇讲了数据库和 AI 模型的集成,这篇再往前迈一步,聊聊支付和更多第三方服务的对接。做电商要接支付、做工具站要接邮件服务、做数据分析要接统计平台,这些都属于”第三方服务集成”。Makers 的函数可以调用任何外部 API,所以理论上你能对接任何提供 HTTP 接口的服务。
支付系统集成
为什么要接支付
如果你的项目涉及收费,不管是卖商品、卖会员还是卖课程,都需要一个支付系统来处理收款。主流方案有几种:
| 支付方式 | 适用地区 | 接入难度 | 费率 |
|---|---|---|---|
| Stripe | 全球(中国大陆暂不支持) | 低,API 设计优秀 | 约 2.9% + 0.30 美元/笔 |
| 微信支付 | 中国大陆 | 中,需要企业资质 | 0.6% |
| 支付宝 | 中国大陆 | 中,需要企业资质 | 0.6% |
| Shopify Payments | 全球 | 低,Shopify 内置 | 因地区而异 |
集成 Stripe
Stripe 是海外项目最常用的支付方案,API 设计很友好。Makers 的 SaaS 模板就内置了 Stripe 集成。
第一步: 创建 Stripe 账号
- 去 Stripe 注册
- 在 Developers -> API keys 页面获取密钥
- 拿到 Publishable key(前端用)和 Secret key(后端用)
第二步: 配置环境变量
在 Makers 控制台添加:
STRIPE_PUBLISHABLE_KEY = pk_test_xxxxx
STRIPE_SECRET_KEY = sk_test_xxxxx
第三步: 安装 Stripe SDK
npm install stripe
第四步: 创建支付会话
// cloud-functions/api/create-checkout.js
// 创建 Stripe 支付会话
import Stripe from 'stripe';
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
export default async function onRequestPost(context) {
const body = await context.request.json();
const { priceId, successUrl, cancelUrl } = body;
try {
// 创建 Checkout Session
const session = await stripe.checkout.sessions.create({
payment_method_types: ['card'],
line_items: [
{
price: priceId, // 在 Stripe 控制台创建的价格 ID
quantity: 1
}
],
mode: 'payment', // 一次性支付,订阅用 'subscription'
success_url: successUrl, // 支付成功跳转地址
cancel_url: cancelUrl // 取消支付跳转地址
});
return Response.json({
sessionId: session.id,
url: session.url // 前端跳转到这个 URL 完成支付
});
} catch (err) {
return Response.json(
{ message: '创建支付会话失败', detail: err.message },
{ status: 500 }
);
}
}
第五步: 处理支付回调
用户支付完成后,Stripe 会向你注册的回调地址发送通知。你需要验证签名并处理订单状态更新。
// cloud-functions/api/webhook.js
// Stripe 支付回调处理
import Stripe from 'stripe';
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
export default async function onRequestPost(context) {
const request = context.request;
const signature = request.headers.get('stripe-signature');
const body = await request.text();
try {
// 验证 Webhook 签名,确保请求来自 Stripe
const event = stripe.webhooks.constructEvent(
body,
signature,
process.env.STRIPE_WEBHOOK_SECRET // 在 Stripe 控制台设置 Webhook 时获取
);
// 处理不同事件类型
switch (event.type) {
case 'checkout.session.completed':
// 支付成功,更新订单状态
const session = event.data.object;
await handlePaymentSuccess(session);
break;
case 'payment_intent.failed':
// 支付失败,记录失败信息
await handlePaymentFailure(event.data.object);
break;
}
return new Response('ok', { status: 200 });
} catch (err) {
return Response.json(
{ message: 'Webhook 验证失败', detail: err.message },
{ status: 400 }
);
}
}
async function handlePaymentSuccess(session) {
// 这里更新你的数据库中的订单状态
// 比如用 Supabase 更新
console.log("支付成功", {
sessionId: session.id,
customerId: session.customer,
amount: session.amount_total
});
}
async function handlePaymentFailure(paymentIntent) {
console.log("支付失败", {
intentId: paymentIntent.id,
lastError: paymentIntent.last_payment_error?.message
});
}
使用 Shopify 搭建电商
如果你想做电商平台,Makers 提供了 Shopify 模板,可以直接用。
Shopify 模板整合了:
| 功能 | 说明 |
|---|---|
| 商品管理 | 在 Shopify 后台管理商品、库存、价格 |
| 购物车 | Storefront API 实现自定义购物车 |
| 结算支付 | Shopify 内置支付处理 |
| 订单管理 | Shopify 后台统一管理订单 |
接入步骤:
- 在 Shopify Dev 创建商店
- 添加商品并配置 Headless 主题
- 获取 Storefront API Access Token
- 在 Makers 部署 Shopify 模板,配置环境变量
- 部署上线
环境变量配置:
SHOPIFY_STORE_DOMAIN = your-store.myshopify.com
SHOPIFY_STOREFRONT_ACCESS_TOKEN = xxxxx
SHOPIFY_API_VERSION = 2025-04
第三方服务对接
除了支付,实际项目中经常需要对接各种第三方服务。
邮件服务
发送注册验证、订单通知等邮件。
| 服务 | 免费额度 | 特点 |
|---|---|---|
| Resend | 每月 3000 封 | API 简洁,适合开发者 |
| SendGrid | 每天 100 封 | 老牌邮件服务 |
| Mailgun | 每月 5000 封(试用期) | 功能全面 |
以 Resend 为例:
// cloud-functions/api/send-email.js
// 发送验证邮件
export default async function onRequestPost(context) {
const body = await context.request.json();
const { to, username } = body;
const response = await fetch('https://api.resend.com/emails', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.RESEND_API_KEY}`
},
body: JSON.stringify({
from: 'noreply@yourdomain.com',
to: to,
subject: '欢迎注册',
html: `<h1>你好 ${username}</h1><p>感谢注册我们的服务!</p>`
})
});
const result = await response.json();
return Response.json({ emailId: result.id });
}
短信服务
验证码、通知类短信。
| 服务 | 适用地区 | 说明 |
|---|---|---|
| 腾讯云 SMS | 中国大陆 | 国内到达率高 |
| 阿里云 SMS | 中国大陆 | 国内到达率高 |
| Twilio | 全球 | 海外短信首选 |
对象存储
文件上传、图片处理等场景。
| 方案 | 说明 |
|---|---|
| Makers Blob 存储 | 平台内置,无需额外配置 |
| Supabase Storage | 和 Supabase 数据库配合使用 |
| 腾讯云 COS | 大容量、国内访问快 |
| AWS S3 | 全球覆盖,生态成熟 |
统计分析
网站流量统计和用户行为分析。
| 服务 | 特点 |
|---|---|
| Umami | 开源、隐私友好、可自部署 |
| Plausible | 轻量、不需要 Cookie |
| Google Analytics | 功能最全,但有隐私争议 |
实战案例: 会员订阅系统
下面把支付、数据库、邮件串起来,做一个完整的会员订阅系统。
整体架构
用户注册 -> 验证邮件 -> 选择套餐 -> Stripe 支付 -> Webhook 回调 -> 更新数据库 -> 开通会员
注册和发送邮件
// cloud-functions/api/register.js
// 用户注册
import { createClient } from '@supabase/supabase-js';
const supabase = createClient(
process.env.SUPABASE_URL,
process.env.SUPABASE_SERVICE_KEY
);
export default async function onRequestPost(context) {
const body = await context.request.json();
const { email, password, name } = body;
// 创建用户(Supabase 内置认证)
const { data, error } = await supabase.auth.admin.createUser({
email,
password,
email_confirm: true
});
if (error) {
return Response.json(
{ message: '注册失败', detail: error.message },
{ status: 400 }
);
}
// 在 users 表创建用户记录
await supabase.from('users').insert({
id: data.user.id,
email,
name,
plan: 'free' // 默认免费套餐
});
return Response.json({ message: '注册成功', userId: data.user.id });
}
创建订阅支付
// cloud-functions/api/subscribe.js
// 创建订阅支付会话
import Stripe from 'stripe';
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
export default async function onRequestPost(context) {
const body = await context.request.json();
const { priceId, userId } = body;
const session = await stripe.checkout.sessions.create({
payment_method_types: ['card'],
mode: 'subscription',
customer_email: await getUserEmail(userId),
line_items: [{ price: priceId, quantity: 1 }],
success_url: 'https://yoursite.com/success?session_id={CHECKOUT_SESSION_ID}',
cancel_url: 'https://yoursite.com/pricing',
metadata: { userId } // 把 userId 传到 metadata,回调时使用
});
return Response.json({ url: session.url });
}
async function getUserEmail(userId) {
// 从数据库查询用户邮箱
// ...
}
处理订阅回调
// cloud-functions/api/webhook.js
// 处理 Stripe 订阅相关事件
import Stripe from 'stripe';
import { createClient } from '@supabase/supabase-js';
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
const supabase = createClient(
process.env.SUPABASE_URL,
process.env.SUPABASE_SERVICE_KEY
);
export default async function onRequestPost(context) {
const body = await context.request.text();
const signature = context.request.headers.get('stripe-signature');
const event = stripe.webhooks.constructEvent(
body,
signature,
process.env.STRIPE_WEBHOOK_SECRET
);
switch (event.type) {
case 'checkout.session.completed': {
// 订阅成功,更新用户套餐
const session = event.data.object;
const userId = session.metadata.userId;
await supabase
.from('users')
.update({
plan: 'pro',
stripe_customer_id: session.customer,
stripe_subscription_id: session.subscription
})
.eq('id', userId);
break;
}
case 'customer.subscription.deleted': {
// 订阅取消,降级为免费套餐
const subscription = event.data.object;
await supabase
.from('users')
.update({ plan: 'free' })
.eq('stripe_subscription_id', subscription.id);
break;
}
}
return new Response('ok');
}
这个案例把注册、支付、回调、数据库更新完整串了起来。实际项目中还需要加上权限中间件(检查用户是否是付费用户才能访问某些功能)、退款处理、发票生成等,但核心流程就是这样。
集成清单
不管对接什么第三方服务,集成的步骤基本一样:
| 步骤 | 操作 |
|---|---|
| 注册服务 | 去第三方平台注册账号 |
| 获取密钥 | 拿到 API Key 或 Token |
| 配置环境变量 | 把密钥存到 Makers 环境变量或 GitHub Secrets |
| 安装 SDK(可选) | 有些服务有官方 SDK,用起来更方便 |
| 编写函数 | 在 Cloud Function 中调用第三方 API |
| 测试验证 | 先用测试环境跑通,再切到正式环境 |
| 处理回调(可选) | 支付等场景需要写 Webhook 回调函数 |
速查卡片
| 要点 | 说明 |
|---|---|
| Stripe 集成 | 创建支付会话 + 处理 Webhook 回调 |
| Shopify 电商 | Makers 提供模板,配置 Storefront API 即可 |
| Webhook 安全 | 一定要验证签名,确保请求来自第三方平台 |
| 邮件服务 | Resend/SendGrid 等,用 fetch 调用 API 即可 |
| 第三方集成步骤 | 注册 -> 获取密钥 -> 配环境变量 -> 写函数 -> 测试 |
| 环境变量管理 | 密钥存平台环境变量,CI/CD 用 Secrets |
| 回调处理 | checkout.session.completed 处理支付成功、subscription.deleted 处理退订 |
| 通用原则 | 密钥不硬编码、验证回调签名、先用测试环境 |