ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

GPT-Image2 付费交流群上线手册:基于 Supabase 与支付宝网站支付的长期资格闭环

GPT-Image2 付费交流群上线手册:基于 Supabase 与支付宝网站支付的长期资格闭环 GPT-Image2 付费交流群上线手册基于 Supabase 与支付宝网站支付的长期资格闭环【免费下载链接】awesome-gpt-image-2Prompt as Code | GPT-Image2 工业级提示词引擎与模板库530 个案例逆向工程20 套工业级模板并提炼出Skills持续更新中项目地址: https://gitcode.com/GitHub_Trending/awe/awesome-gpt-image-2本文是 GPT-Image2 开源仓库中付费交流群模块的完整上线与运维指南。该模块将付费群资格与积分包、会员支付完全分离用户通过支付宝一次性支付¥9.90资格绑定 Supabase 用户账号只有服务端确认订单进入PAID状态后才能读取受保护的群二维码。读完本文你将掌握该功能的页面与 API 拓扑、数据库状态机与 RPC 事务边界、环境变量配置、首次部署顺序、生产验收清单以及群码轮换和退款等日常运维方法。一、系统定位与积分包、会员支付完全隔离的独立子域付费交流群是独立于现有积分包credit pack与会员membership体系之外的一笔一次性交易设计目标是资格绑定账号而非绑定设备或订单页面。核心决策体现在三点独立订单表创建的是独立的community_orders订单不会触发积分包履约也不会影响会员有效期。资格与账号绑定付款资格绑定 Supabase 用户账号auth.users.id换设备登录后仍可重新查看入群二维码。服务端权威确认同步回跳只触发服务端查单不信任 URL 参数只有支付宝主动查单alipay.trade.query或异步通知alipay.trade.page.pay的通知回调验签通过并确认PAID后二维码才可见。前端文案在 src/community.jsx 中明确说明支付宝一次性支付 ¥9.90。付款资格绑定当前账号换设备登录后仍可重新查看入群二维码服务边界也写得很清楚不承诺一对一服务、固定答疑次数、独家资料或收益结果违法违规或破坏交流秩序的账号可被撤销资格。二、本地能力速览能力项值页面/community购买与资格展示支付回跳/community/result仅触发服务端查单支付方式支付宝网站支付alipay.trade.page.pay页面跳转收银台固定金额990分¥9.90币种CNY订单状态PENDING、PAID、CLOSED、REFUNDED、REVOKED退款处理状态NONE、PROCESSING、SUCCEEDED、FAILED资格规则仅PAID有效退款处理中保持PAID支付宝确认退款成功后改为REFUNDED群码数据库bytea资源限 PNG/JPEG/WebP、最大 2 MB管理员通过事务 RPC 原子替换这些常量在 api/_lib/community.js 中有同源定义COMMUNITY_PRICE_CENTS 990、COMMUNITY_CURRENCY CNY、COMMUNITY_TERMS_VERSION 2026-07-22、COMMUNITY_PENDING_MINUTES 30、COMMUNITY_QR_MAX_BYTES 2 * 1024 * 1024。订单创建时默认 30 分钟过期expires_at超时未付的订单在再次发起支付前会先被关闭并做对账详见下文过期订单的关闭与对账。状态机语义PENDING订单已创建、尚未支付。同一用户最多保留一笔PENDING或PAID订单由数据库部分唯一索引保证。PAID服务端已确认收款。这是唯一允许读取群码的状态判断函数为canAccessCommunityQr(status)见 api/_lib/community.js。CLOSED待支付订单被关闭用户主动关闭、超时关闭或支付宝TRADE_CLOSED通知。REFUNDED支付宝确认退款成功后写入此时群码访问立即失效。REVOKED管理员人工撤销资格不会自动退款。退款处理状态refund_status独立于订单状态运行NONE从未发起退款→PROCESSING已发起退款、等待支付宝确认→SUCCEEDED退款成功同时订单进入REFUNDED或FAILED退款请求被支付宝拒绝。关键细节是退款处理中PROCESSING订单仍保持PAID群码资格依旧有效直到REFUND_SUCCESS被确认。三、数据模型三张表与事务 RPC付费群的核心数据全部由迁移脚本 supabase/migrations/20260722090000_paid_community.sql 创建包含三张业务表1.community_orders订单主表关键字段与约束statusPENDING / PAID / CLOSED / REFUNDED / REVOKED默认PENDING。amount_centscheck (amount_cents 990)金额在数据库层被锁死为 990 分前端无法提交或覆盖金额。currencycheck (currency CNY)币种同样被数据库约束锁死。subject默认GPT-Image2 付费交流群长期资格。terms_version必填记录下单时接受的条款版本当前为2026-07-22与前端 src/community.jsx 的TERMS_VERSION一致。支付宝侧字段alipay_app_id、alipay_seller_id、alipay_trade_no支付宝交易号。退款侧字段refund_request_no稳定退款请求号、refund_status、refund_failure_code。时间线字段expires_at30 分钟、paid_at、refund_requested_at、refund_checked_at、refunded_at、revoked_at。metadata jsonb记录notifyEnabled、returnUrl、termsAcceptedAt等支付上下文。索引设计防止并发下的重复下单/重复入账community_orders_one_active_per_user_idx(user_id)的部分唯一索引仅对PENDING、PAID生效——同一用户同时只能有一笔有效订单。community_orders_alipay_trade_no_idxalipay_trade_no非空时唯一——同一支付宝交易号不能入账到多笔订单。community_orders_refund_request_no_idxrefund_request_no非空时唯一——退款请求号幂等。另有两个普通索引created_at desc与(status, created_at desc)支撑管理端订单列表按时间倒序与状态过滤。2.community_alipay_notify_events异步通知事件表支付宝异步通知的原始事件落库notify_id唯一、payload jsonb存原文配合唯一索引(order_id, trade_no, trade_status, notify_id)保证重复通知不产生副作用是通知幂等性的第一道防线。3.community_group_qr_assets群二维码资产表qr_bytes bytea二维码二进制本体直接存数据库而非公开对象存储。media_type仅允许image/png、image/jpeg、image/webp。size_bytes 0且 20971522 MB。is_current当前生效标记部分唯一索引community_group_qr_one_current_idx保证全局同一时刻只有一张当前群码。三张表均启用行级安全RLS且对public / anon / authenticated全部revoke只向service_role授权任何客户端都不能绕过 API 直接读写订单或群码。RPC 函数把状态迁移收敛到数据库事务所有状态变更都以security definer的 PL/pgSQL 函数形式提供同样只授权service_role服务端只负责验签、鉴权与调用。从源码看共 8 个函数函数作用幂等行为create_or_reuse_community_order创建或复用PENDING/PAID订单pg_advisory_xact_lock串行化同一用户的并发下单已有有效订单直接返回mark_community_order_paid入账校验金额 990 分、币种 CNY、交易号一致性写通知事件PENDING → PAID已PAID/REFUNDED/REVOKED直接返回当前状态close_community_orderPENDING → CLOSED非PENDING返回当前状态prepare_community_refund发起退款前置校验订单为PAID写入refund_request_norefund_status → PROCESSING已REFUNDED复用原请求号set_community_refund_state更新退款状态为PROCESSING或FAILED含失败码仅对PAID订单生效—finalize_community_refund终态确认三方信息完全匹配后PAID → REFUNDED、refund_status → SUCCEEDED已REFUNDED幂等返回revoke_community_accessPAID → REVOKED退款处理中禁止撤销已REVOKED幂等返回replace_community_group_qr_asset群码原子替换pg_advisory_xact_lock串行化同一事务内停用旧图并启用新图—以mark_community_order_paid为例迁移脚本 L151-L229函数先用SELECT ... FOR UPDATE锁定订单行逐一校验订单存在、交易号非空、p_paid_amount_cents 990、币种为CNY、alipay_trade_no未被其他交易占用再把通知事件以on conflict (notify_id) do nothing写入事件表最后仅在PENDING状态下更新为PAID。这把先查询、再校验、后入账的整个流程原子化主动查单与异步通知两条路径无论谁先到达都不会产生重复入账或金额篡改。四、API 拓扑三组端点1. 公开与当前用户无需管理员方法路径职责GET/api/community/config公开配置价格¥9.90、币种、paymentEnabled由环境变量 Supabase 支付宝配置三条件叠加见 api/community/config.js、人工支持文案、条款版本GET/api/community/status当前登录用户资格状态authenticated、eligible、qrReady、paymentEnabled、order未登录用户返回eligible: falseapi/community/status.jsGET/api/community/qr受保护群码仅PAID订单可读未付款返回403 COMMUNITY_PAYMENT_REQUIRED管理员未上传群码返回409 COMMUNITY_QR_NOT_READY成功时以原始Content-Type回传图片字节api/community/qr.js三个响应都带Cache-Control: private, no-storenoStore工具见 api/_lib/community.js禁止任何中间层缓存敏感资格状态。2. 支付宝交互当前用户 支付宝服务端方法路径职责POST/api/community/alipay/checkout创建收银台校验同源validateSameOrigin、条款勾选与版本、30 分钟过期订单先对账关闭金额、币种、out_trade_no 订单 UUID由服务端固定生成alipay.trade.page.pay的POST表单 HTML 返回前端自动提交api/community/alipay/checkout.jsGET/api/community/alipay/query主动查单PENDING/PAID订单调用alipay.trade.query验签 校验金额币种后由 RPC 幂等入账PAID订单在支付宝侧非PAID时直接抛错防止状态倒挂api/community/alipay/query.jsPOST/api/community/alipay/close关闭待支付订单先查单对账若实际已付款则入账并返回409再调alipay.trade.close并本地置CLOSEDPOST/api/community/alipay/notify支付宝异步通知bodyParser: false读原始表单体checkNotifySignV2验签强制RSA2校验app_id、seller_id、notify_id与订单归属付款事件落community_alipay_notify_events并幂等入账TRADE_CLOSED且订单PENDING时本地关闭成功返回纯文本successapi/community/alipay/notify.js对账逻辑集中在 api/_lib/community-alipay.js查单结果code 10000后先复校金额与币种再按trade_status分支处理——TRADE_SUCCESS / TRADE_FINISHED入账、TRADE_CLOSED关闭、WAIT_BUYER_PAY保持待支付、ACQ.TRADE_NOT_EXIST视为未创建。由此支付宝主动查单和异步通知都能幂等写入PAID的验收项得到了数据库唯一索引与 RPC 双重保障。3. 超级管理员super_admin方法路径职责GET/api/admin/community/orders订单列表支持status过滤与limit1100默认 50联查profiles返回邮箱与昵称api/admin/community/orders.jsGET / POST/api/admin/community/qrGET查看当前群码?metadata1只返回元数据POST上传新群码魔数检测真实类型PNG/JPEG/WebP 文件头见 api/_lib/community.js、校验声明类型与魔数一致、2 MB 上限然后调replace_community_group_qr_asset事务替换api/admin/community/qr.jsPOST/api/admin/community/refund发起退款生成稳定退款请求号cg_订单UUID去横线api/_lib/community.js调alipay.trade.refundfund_change Y直接终态化否则置PROCESSING等待查询api/admin/community/refund.jsGET/api/admin/community/refund-query退款查询请求发起 10 秒内拒绝COMMUNITY_REFUND_QUERY_TOO_EARLY调alipay.trade.fastpay.refund.query三方信息全匹配且refund_status REFUND_SUCCESS时执行finalize_community_refundapi/admin/community/refund-query.jsPOST/api/admin/community/revoke人工撤销仅PAID且未在退款处理中的订单可撤销调revoke_community_accessapi/admin/community/revoke.js所有管理员端点都要求isCommunityAdmin(auth)profile.isSuperAdmin或role super_admin见 api/_lib/community.js写操作额外校验同源。限流方面社区端采用内存滑动窗口checkout 每分钟 10 次、query 每分钟 30 次、管理员订单列表默认每分钟 30 次超限返回429并带Retry-After。五、环境变量与支付宝生产配置生产部署必须先保持如下配置取自 docs/paid-community.md 原文COMMUNITY_PAYMENT_ENABLEDfalse COMMUNITY_ALIPAY_NOTIFY_URLhttps://gpt-image2.canghe.ai/api/community/alipay/notify COMMUNITY_SUPPORT_TEXT微信搜索苍何各变量语义结合 api/_lib/community.js 与 api/_lib/alipay.jsCOMMUNITY_PAYMENT_ENABLED总开关。false时/api/community/config返回paymentEnabled: falsecheckout 返回503 COMMUNITY_PAYMENT_PAUSED已付款用户的群码查看与退款操作不受影响。这是线上一键熔断的开关。COMMUNITY_ALIPAY_NOTIFY_URL公网 HTTPS 通知地址必须无重定向未配置时按APP_URL推导为{origin}/api/community/alipay/notify本地地址localhost/127.0.0.1/::1则禁用通知。COMMUNITY_SUPPORT_TEXT页面展示的人工支持渠道文案默认微信搜索苍何。支付宝生产变量沿用现有体系ALIPAY_APP_ID、ALIPAY_PRIVATE_KEY、ALIPAY_PUBLIC_KEY、ALIPAY_SELLER_ID和生产网关https://openapi.alipay.com/gateway.do见 api/_lib/alipay.js 的loadProductionConfig。两个必须遵守的约束生产私钥只在 Vercel Sensitive Environment Variables 中配置不写入仓库、文档或对话requiredPrivateKey甚至拒绝包含-----BEGIN/-----END或空白的多行 PEM要求传入 PKCS#1 私钥原文api/_lib/alipay.js。Node.js 使用 PKCS#1 私钥原文SDK 以keyType: PKCS1、signType: RSA2、charset: utf-8初始化api/_lib/alipay.js。此外还有两个内置开关可做辅助控制ALIPAY_NOTIFY_ENABLEDfalse可整体禁用通知此时依赖主动查单确认付款APP_URL参与同源校验与通知 URL 推导api/_lib/community.js。六、首次部署顺序8 步上线流程按 docs/paid-community.md 的部署顺序结合源码说明每步目的保持COMMUNITY_PAYMENT_ENABLEDfalse。此时页面可浏览、状态接口可用但 checkout 会被503拒绝避免未配置完成就产生真实订单。在目标 Supabase 项目应用迁移supabase/migrations/20260722090000_paid_community.sql。该脚本一次性创建三张表、全部索引、8 个 RPC 函数与service_role授权可重复执行create table if not exists/create or replace function。部署同一版本代码确认/community、/community/result和只读状态接口正常。前端会拉取/api/community/config与/api/community/status若paymentEnabled为假则展示当前暂停新订单卡片。由super_admin在管理面板上传一张从未公开过的新群二维码。注意受保护群码不应出现在 GitHub、README、公开对象存储或前端静态目录中上传走POST /api/admin/community/qr的魔数校验与事务替换。在支付宝开放平台完成网站支付签约、应用配置与发布并确认公网 HTTPS 通知地址无重定向任何跳转都会导致通知丢失。配置属于同一生产应用的 App ID、应用公钥、应用私钥和支付宝公钥Node.js 使用 PKCS#1 私钥原文密钥只放 Sensitive Environment Variables。开启COMMUNITY_PAYMENT_ENABLEDtrue。此后 checkout 正常创建收银台订单。用同一生产版本完成一笔真实¥9.90付款和原路退款验收全部通过后再正式对外推广。七、生产验收真实付款必须逐项确认上线前用真实支付跑通以下验收清单源自 docs/paid-community.md 并对应到源码实现前端不能提交或覆盖金额金额由服务端常量COMMUNITY_PRICE_CENTS固定数据库check (amount_cents 990)二次兜底前端只展示支付宝支付 ¥9.90。创建的是独立community_orders不会触发积分包履约订单写入community_orders表与complete_alipay_credit_pack_order积分包入账 RPC见 api/_lib/alipay.js完全走不同的表与函数。支付宝主动查单和异步通知都能幂等写入PAID查单路径queryCommunityOrderAtAlipay与通知路径markCommunityOrderPaid最终都落到同一个mark_community_order_paidRPC配合交易号唯一索引与FOR UPDATE行锁。同步回跳只触发服务端查单不信任 URL 参数/community/result页面仅解析order_id参数随后调用/api/community/alipay/query由服务端查单确认页面文案明确本页不会信任网址参数判定付款成功src/community.jsx。付款账号可以读取群码未付款账号得到拒绝响应/api/community/qr依据canAccessCommunityQr(status)判定非PAID一律403 COMMUNITY_PAYMENT_REQUIRED。管理员退款使用稳定退款请求号处理中资格仍有效请求号cg_uuid唯一且复用PROCESSING期间订单保持PAID群码继续可读。退款查询得到REFUND_SUCCESS后写入REFUNDED随后群码访问失效finalize_community_refund校验交易号、请求号、退款金额三方一致后置终态。任何关键项失败时立即将COMMUNITY_PAYMENT_ENABLED改回false熔断只影响新订单创建不回收已付款资格也不阻断退款与管理员操作。八、群码轮换与日常运维群码过期轮换群二维码过期时管理员在管理面板上传新图片。replace_community_group_qr_asset通过pg_advisory_xact_lock(hashtext(community_group_qr_current))串行化并在同一事务中先把旧图is_current false、写入retired_at再插入新图并置is_current true——轮换过程原子完成任何时刻客户端只能读到一张有效群码。前端对管理员尚未上传群码或刚完成换码的场景有专门提示你的付款资格不会丢失src/community.jsx。群码保密不要把受保护群码上传到 GitHub、README、公开对象存储或前端静态目录。二维码只以bytea形式存在于数据库经/api/community/qr按需、鉴权、no-store地回传。退款审核退款由微信搜索苍何人工审核管理员操作前需核对账号、订单号和退款状态/api/admin/community/orders返回的邮箱、昵称、refund_request_no、refund_failure_code等字段即为核对依据。退款发起后若未立即成功fund_change ! Y须在 10 秒后轮询/api/admin/community/refund-query直到REFUND_SUCCESS。撤销与退款不可混用人工撤销资格revoke不会自动退款需要退款时必须走退款流程不能用撤销代替退款——这与数据库函数中退款处理中禁止撤销revoke_community_access对refund_status PROCESSING抛COMMUNITY_ORDER_NOT_REVOKABLE的设计互为表里。九、扩展阅读上线手册原文docs/paid-community.md数据库迁移与全部 RPCsupabase/migrations/20260722090000_paid_community.sql社区公共库常量、校验、状态机、限流api/_lib/community.js、api/_lib/community-alipay.js支付宝 SDK 封装与生产/沙箱配置api/_lib/alipay.js用户侧 APIapi/community/config.js、api/community/status.js、api/community/qr.js支付宝交互 APIapi/community/alipay/checkout.js、api/community/alipay/query.js、api/community/alipay/notify.js、api/community/alipay/close.js管理端 APIapi/admin/community/orders.js、api/admin/community/qr.js、api/admin/community/refund.js、api/admin/community/refund-query.js、api/admin/community/revoke.js前端页面src/community.jsx含中英文文案、状态卡片、支付表单提交与回跳轮询【免费下载链接】awesome-gpt-image-2Prompt as Code | GPT-Image2 工业级提示词引擎与模板库530 个案例逆向工程20 套工业级模板并提炼出Skills持续更新中项目地址: https://gitcode.com/GitHub_Trending/awe/awesome-gpt-image-2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表