How to Migrate to Paid Community Features with Alipay in awesome-gpt-image-2: A 3-Phase Implementation Guide
The migration strategy uses a three-phase rollout (Preparation → Activation → Production Validation) that keeps paid community features completely isolated from existing points/VIP systems, with Alipay credentials secured in Vercel environment variables and idempotent order handling to prevent duplicate charges.
The freestylefly/awesome-gpt-image-2 repository implements paid community access through a decoupled payment architecture that protects existing users while enabling new revenue streams. This guide walks through the complete migration strategy based on the actual source code implementation, including database migrations, API endpoints, and fail-safe operational procedures.
Understanding the Paid Community Architecture
The paid community system operates independently from the existing points and VIP subscription logic. This isolation ensures zero disruption to current users while enabling flexible monetization.
The core components include:
- A dedicated
community_orderstable with distinct status states (PENDING,PAID,CLOSED,REFUNDED,REVOKED) - Supabase RPCs for order management and rate limiting
- Alipay website-payment integration with asynchronous notification handling
- Admin controls for QR-code management, refunds, and access revocation
All configuration is controlled through a single feature flag: COMMUNITY_PAYMENT_ENABLED.
Phase 1: Preparation — Deploy Without Activation
The preparation phase establishes infrastructure without exposing payment functionality to end users.
Deploy Database Objects
Apply the Supabase migration script to create the required schema:
# Run against your Supabase project
supabase/migrations/20260722090000_paid_community.sql
This migration creates:
- The
community_orderstable with proper indexes and RLS policies - RPC functions for order retrieval and rate-limit tracking
- Helper functions for access verification
Verify Feature Flag State
Ensure the system remains inactive during preparation:
COMMUNITY_PAYMENT_ENABLED=false
Test Public Endpoints
Verify these read-only APIs respond correctly before activation:
| Endpoint | Purpose | Expected Response |
|---|---|---|
GET /api/community/config |
Exposes payment availability and terms version | JSON with enabled: false |
GET /api/community/status |
Returns current user's order status | Authenticated users only |
GET /api/community/q |
Serves the protected QR-code image | 404 or placeholder until QR uploaded |
The /community and /community/result pages should render in read-only mode, showing informational content without payment options.
Phase 2: Activation — Enable Alipay Integration
Activation connects live Alipay credentials and exposes payment flows to qualified users.
Obtain Alipay Credentials
Register a website-payment application in the Alipay Open Platform. Required credentials:
ALIPAY_APP_ID— Your application identifierALIPAY_PRIVATE_KEY— RSA private key for signing requestsALIPAY_PUBLIC_KEY— Alipay's public key for verificationALIPAY_SELLER_ID— Merchant account identifier
Secure Environment Configuration
Store credentials exclusively in Vercel Sensitive Environment Variables:
ALIPAY_APP_ID=your_app_id_here
ALIPAY_PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----
ALIPAY_PUBLIC_KEY=-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----
ALIPAY_SELLER_ID=your_seller_id
Never commit these values to the repository. The codebase contains only placeholder configurations.
Enable Payment Flow
Set the activation flag as documented in docs/paid-community.md:
COMMUNITY_PAYMENT_ENABLED=true
Upload Protected QR Code
Admin users must upload the never-published community QR code:
// POST /api/admin/community/qr
const formData = new FormData();
formData.append('qrImage', fileInput.files[0]);
await fetch('/api/admin/community/qr', {
method: 'POST',
body: formData
});
Source: api/admin/community/qr.js
Phase 3: Production Validation — Verify End-to-End Flows
Complete validation ensures payment processing, fulfillment, and administrative controls operate reliably.
Test Live Checkout Flow
Initiate a real payment using the checkout endpoint. Client-side implementation:
async function startPaidCommunityCheckout() {
const response = await fetch('/api/community/alipay/checkout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
acceptedTerms: true,
termsVersion: '2024-08-01' // Must match COMMUNITY_TERMS_VERSION
})
});
const data = await response.json();
if (data.ok && !data.paid) {
// Render Alipay redirect form
document.body.innerHTML = data.paymentHtml;
}
}
Source: api/community/alipay/checkout.js
The checkout handler in api/community/alipay/checkout.js implements idempotent order handling—it queries for existing active orders via getActiveCommunityOrder before creating new ones, preventing duplicate charges.
Verify Alipay Notification Handling
Confirm asynchronous payment confirmation works correctly. The notify handler:
// api/community/alipay/notify.js (simplified)
export default async function handler(req, res) {
const { out_trade_no, trade_status } = req.body;
if (trade_status === 'TRADE_SUCCESS') {
await markOrderPaid(out_trade_no); // Updates status to PAID
}
res.status(200).send('success');
}
Source: api/community/alipay/notify.js
Critical: Alipay requires the literal string response 'success' (not JSON) for webhook acknowledgment.
Validate Refund and Revoke Operations
| Operation | Endpoint | Behavior |
|---|---|---|
| Refund | POST /api/admin/community/refund |
Order → REFUNDED, user retains access until finalization |
| Revoke | POST /api/admin/community/revoke |
Order → REVOKED, no automatic refund |
Revocation example:
// api/admin/community/revoke.js
await supabase
.from('community_orders')
.update({ status: 'REVOKED' })
.eq('id', orderId);
Source: api/admin/community/revoke.js
Emergency Rollback Procedure
If any validation step fails:
COMMUNITY_PAYMENT_ENABLED=false
This immediately halts new purchases without affecting existing paid users.
Key Implementation Safeguards
The migration strategy incorporates multiple protective mechanisms:
Isolation from existing systems — The paid community uses separate community_orders tables and RPCs, leaving points/VIP users unaffected.
Idempotent order creation — The getActiveCommunityOrder check in api/community/alipay/checkout.js prevents duplicate orders for the same user.
Robust state machine — Status transitions (PENDING → PAID → REFUNDED/REVOKED/CLOSED) are enforced consistently across all endpoints.
Rate limiting — applyCommunityRateLimit and takeCommunityRateLimit in api/_lib/community.js protect checkout APIs from abuse.
Configuration security — Sensitive credentials exist only in Vercel's encrypted environment; repository contains safe defaults.
Core Business Logic Reference
The api/_lib/community.js module centralizes paid community operations:
- Order retrieval and status checking
- Rate-limit enforcement
- Configuration exposure with safe defaults
- Terms version validation
Alipay-specific utilities in api/_lib/alipay.js handle:
- Amount formatting (yuan to fen conversion)
- Payment subject string construction
- Configuration validation helpers
Summary
- Three-phase migration (Preparation → Activation → Production Validation) enables safe rollout of paid community features
- Complete decoupling from points/VIP systems protects existing functionality
- Idempotent checkout prevents duplicate charges through
getActiveCommunityOrderchecks - Secure credential management via Vercel Sensitive Environment Variables keeps Alipay keys out of version control
- Emergency rollback via
COMMUNITY_PAYMENT_ENABLED=falseprovides immediate circuit-breaking capability
Frequently Asked Questions
What happens to existing free community users during migration?
Existing users remain completely unaffected. The paid community system uses separate database tables (community_orders) and API endpoints, with no interaction with the points or VIP subscription logic. Free community features continue operating normally alongside paid features.
How does the system prevent duplicate Alipay charges?
The checkout handler in api/community/alipay/checkout.js implements idempotent order creation. Before generating a new order, it calls getActiveCommunityOrder to check for existing PENDING or PAID orders. If a paid order exists, the endpoint returns the existing status without creating a duplicate transaction.
What's the difference between refunding and revoking a paid community membership?
Refunds (POST /api/admin/community/refund) process through Alipay's refund API, move the order to REFUNDED status, and the user retains access until the refund finalizes. Revocations (POST /api/admin/community/revoke) immediately set status to REVOKED for policy violations but do not trigger automatic refunds—administrators must process refunds separately if warranted.
Where should Alipay credentials be stored for production deployments?
Store all sensitive credentials exclusively in Vercel Sensitive Environment Variables: ALIPAY_APP_ID, ALIPAY_PRIVATE_KEY, ALIPAY_PUBLIC_KEY, and ALIPAY_SELLER_ID. The repository contains only placeholder values and safe defaults (COMMUNITY_PAYMENT_ENABLED=false). Never commit private keys or live credentials to Git.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →