当前实现将付费群与积分包、会员支付完全分离:支付宝一次性支付 ¥9.90 后,资格绑定 Supabase 用户账号;只有服务端确认订单为 PAID 时才能读取受保护群二维码。
- 页面:
/community - 支付回跳:
/community/result - 支付方式:支付宝网站支付
alipay.trade.page.pay - 固定金额:
990分,CNY - 订单状态:
PENDING、PAID、CLOSED、REFUNDED、REVOKED - 退款处理状态:
NONE、PROCESSING、SUCCEEDED、FAILED - 资格规则:仅
PAID有效;退款处理中保持PAID;支付宝确认退款成功后改为REFUNDED - 群码:数据库
bytea资源,限 PNG/JPEG/WebP、最大 2 MB,管理员通过事务 RPC 原子替换
公开与当前用户:
GET /api/community/configGET /api/community/statusGET /api/community/qr
支付宝:
POST /api/community/alipay/checkoutGET /api/community/alipay/queryPOST /api/community/alipay/closePOST /api/community/alipay/notify
超级管理员:
GET /api/admin/community/ordersGET|POST /api/admin/community/qrPOST /api/admin/community/refundGET /api/admin/community/refund-queryPOST /api/admin/community/revoke
生产部署必须先保持:
COMMUNITY_PAYMENT_ENABLED=false
COMMUNITY_ALIPAY_NOTIFY_URL=https://gpt-image2.canghe.ai/api/community/alipay/notify
COMMUNITY_SUPPORT_TEXT=微信搜索苍何支付宝生产变量沿用现有 ALIPAY_APP_ID、ALIPAY_PRIVATE_KEY、ALIPAY_PUBLIC_KEY、ALIPAY_SELLER_ID 和生产网关配置。生产私钥只在 Vercel Sensitive Environment Variables 中配置,不写入仓库、文档或对话。
- 保持
COMMUNITY_PAYMENT_ENABLED=false。 - 在目标 Supabase 项目应用
supabase/migrations/20260722090000_paid_community.sql。 - 部署同一版本代码,确认
/community、/community/result和只读状态接口正常。 - 由
super_admin在管理面板上传一张从未公开过的新群二维码。 - 在支付宝开放平台完成网站支付签约、应用配置与发布,并确认公网 HTTPS 通知地址无重定向。
- 配置属于同一生产应用的 App ID、应用公钥、应用私钥和支付宝公钥;Node.js 使用 PKCS#1 私钥原文。
- 开启
COMMUNITY_PAYMENT_ENABLED=true。 - 用同一生产版本完成一笔真实
¥9.90付款和原路退款验收。
真实付款必须逐项确认:
- 前端不能提交或覆盖金额。
- 创建的是独立
community_orders,不会触发积分包履约。 - 支付宝主动查单和异步通知都能幂等写入
PAID。 - 同步回跳只触发服务端查单,不信任 URL 参数。
- 付款账号可以读取群码,未付款账号得到拒绝响应。
- 管理员退款使用稳定退款请求号;处理中资格仍有效。
- 退款查询得到
REFUND_SUCCESS后写入REFUNDED,随后群码访问失效。 - 任何关键项失败时立即将
COMMUNITY_PAYMENT_ENABLED改回false。
- 群二维码过期时,在管理面板上传新图片;RPC 会在同一事务中停用旧图并启用新图。
- 不要把受保护群码上传到 GitHub、README、公开对象存储或前端静态目录。
- 退款由“微信搜索苍何”人工审核;管理员操作前核对账号、订单号和退款状态。
- 人工撤销资格不会自动退款;需要退款时使用退款流程,不用撤销代替退款。