如何每月更新免费套餐用户的App Credits?Supabase实现方案咨询
解决方案:每月重置免费用户额度
方案一:Vercel定时任务调用Supabase API实现
认证配置与代码实现
- 从Supabase控制台获取服务角色密钥(而非匿名密钥),该密钥拥有全库操作权限,支持批量修改用户数据。
- 在Vercel项目的环境变量中添加
SUPABASE_SERVICE_ROLE_KEY和SUPABASE_URL两个变量,分别填入服务角色密钥和你的Supabase项目地址。 - 编写定时任务的JavaScript处理函数:
import { createClient } from '@supabase/supabase-js'; const supabase = createClient( process.env.SUPABASE_URL, process.env.SUPABASE_SERVICE_ROLE_KEY, { auth: { autoRefreshToken: false, persistSession: false } } ); export default async function handler() { const { error } = await supabase .from("users") .update({ app_credits: 100 }) .eq("plan", "free"); if (error) { return new Response(JSON.stringify({ error: error.message }), { status: 500 }); } return new Response(JSON.stringify({ message: "免费用户额度重置完成" }), { status: 200 }); }
- 在Vercel定时任务面板设置每月1号执行该函数即可。
方案二:Supabase内部定时执行SQL更新
实现步骤
- 打开Supabase控制台的SQL编辑器,创建存储函数:
CREATE OR REPLACE FUNCTION reset_free_user_credits() RETURNS void AS $$ BEGIN UPDATE users SET app_credits = 100 WHERE plan = 'free'; END; $$ LANGUAGE plpgsql SECURITY DEFINER;
- 创建定时任务(依赖Supabase默认启用的pg_cron扩展):
SELECT cron.schedule( 'monthly-reset-free-credits', -- 自定义任务名称 '0 0 1 * *', -- Cron表达式:每月1号0点执行 'SELECT reset_free_user_credits();' );
- 验证任务:执行
SELECT * FROM cron.job;可查看已创建的定时任务列表。
注意:
SECURITY DEFINER确保函数以创建者权限执行,具备修改users表的权限;pg_cron默认使用UTC时区,若需适配本地时区,可在Supabase控制台的数据库设置中调整。
内容的提问来源于stack exchange,提问作者WayneSchuller
相关产品推荐
相关产品推荐

