tractatus/docs/STRIPE_SANDBOX_SETUP_COMPLETE.md
TheFlow 2298d36bed fix(submissions): restructure Economist package and fix article display
- Create Economist SubmissionTracking package correctly:
  * mainArticle = full blog post content
  * coverLetter = 216-word SIR— letter
  * Links to blog post via blogPostId
- Archive 'Letter to The Economist' from blog posts (it's the cover letter)
- Fix date display on article cards (use published_at)
- Target publication already displaying via blue badge

Database changes:
- Make blogPostId optional in SubmissionTracking model
- Economist package ID: 68fa85ae49d4900e7f2ecd83
- Le Monde package ID: 68fa2abd2e6acd5691932150

Next: Enhanced modal with tabs, validation, export

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 08:47:42 +13:00

324 lines
9.3 KiB
Markdown

# Stripe Sandbox Setup - Complete ✅
**Date:** 2025-10-18
**Status:** Test Mode Active | Ready for Browser Testing
**Session:** Stripe Implementation Phase
---
## Summary
The Stripe donation system for Koha is now fully configured in test mode and ready for end-to-end testing. All backend services are operational, the database is configured, and the frontend form is connected.
---
## What Was Completed
### 1. Stripe Product and Price Configuration ✅
**Product Created:**
- Name: "Tractatus Framework Support"
- ID: `prod_TFusJH4Q3br8gA`
- Description: Koha (reciprocal gift) to support the Tractatus AI Safety Framework
**Monthly Subscription Prices Created:**
- Foundation ($5 NZD/month): `price_1SJP2fGhfAwOYBrf9yrf0q8C`
- Advocate ($15 NZD/month): `price_1SJP2fGhfAwOYBrfNc6Nfjyj`
- Champion ($50 NZD/month): `price_1SJP2fGhfAwOYBrf0A62TOpf`
**Multi-Currency Support:**
- Base currency: NZD
- 10 currencies supported: USD, EUR, GBP, AUD, CAD, JPY, CHF, SGD, HKD
- Configured via Stripe's `currency_options` feature
- Exchange rates configurable in `src/config/currencies.config.js`
### 2. Environment Configuration ✅
**.env file updated with:**
```bash
STRIPE_SECRET_KEY=sk_test_51RX67k... (configured)
STRIPE_PUBLISHABLE_KEY=pk_test_51RX67k... (configured)
STRIPE_KOHA_PRODUCT_ID=prod_TFusJH4Q3br8gA
STRIPE_KOHA_5_PRICE_ID=price_1SJP2fGhfAwOYBrf9yrf0q8C
STRIPE_KOHA_15_PRICE_ID=price_1SJP2fGhfAwOYBrfNc6Nfjyj
STRIPE_KOHA_50_PRICE_ID=price_1SJP2fGhfAwOYBrf0A62TOpf
STRIPE_KOHA_WEBHOOK_SECRET=whsec_koha_dev_placeholder (needs Stripe CLI)
FRONTEND_URL=http://localhost:9000
```
### 3. Database Configuration ✅
**Fixed Index Issues:**
- Changed `stripe_payment_id` index from unique to **sparse unique**
- This allows multiple pending donations (with null payment_id) while enforcing uniqueness for completed payments
- Prevents E11000 duplicate key errors during checkout session creation
**Collections Ready:**
- `koha_donations` - Main donation records
- All indexes configured for performance
- Test data cleared for clean testing
### 4. Backend API Testing ✅
**Endpoints Verified:**
- `POST /api/koha/checkout` - Creates Stripe checkout sessions (200 OK)
- `POST /api/koha/webhook` - Webhook handler ready (needs signing secret)
- `GET /api/koha/transparency` - Public metrics endpoint
**Test Results:**
```
[KOHA] Creating checkout session: monthly donation of NZD $15 (NZD $15)
[KOHA] Checkout session created: cs_test_b1pzkYTZE7F77jcOcV1VJ5mcFiDbTpokfLtdoymCQqKHGv47JvKnPqO9Oc
POST /api/koha/checkout 200 - 1030ms
```
Both monthly subscriptions and one-time donations tested successfully via curl.
### 5. Frontend Integration ✅
**Fixed Issues:**
- i18n system now loads koha and transparency page translations correctly
- Transparency link fixed (was missing .html extension)
- Service worker cache version bumped to 1.1.4 to clear old cached JavaScript
- Donation form connected to backend API via `koha-donation.js`
**Form Features:**
- Monthly subscription tiers ($5, $15, $50)
- One-time donations with custom amounts
- Multi-currency selector (10 currencies)
- Public acknowledgement opt-in
- Anonymous donation by default
- Email validation
- Stripe Checkout redirect integration
### 6. Automated Setup Scripts Created ✅
**scripts/test-stripe-connection.js**
- Verifies Stripe API keys are working
- Lists existing products and prices
- Checks webhook endpoint configuration
- Usage: `node scripts/test-stripe-connection.js`
**scripts/setup-stripe-products.js**
- Automatically creates Tractatus product
- Creates all 3 monthly price tiers with multi-currency options
- Saves IDs to `.stripe-ids.json` for reference
- Updates needed environment variables
- Usage: `node scripts/setup-stripe-products.js`
**scripts/test-stripe-integration.js**
- Comprehensive integration test suite
- Tests monthly subscription checkout sessions
- Tests one-time donation checkout sessions
- Validates environment variables
- Verifies product and price configuration
- Usage: `node scripts/test-stripe-integration.js`
**scripts/stripe-webhook-setup.sh**
- Interactive webhook setup guide
- Checks for Stripe CLI installation
- Provides installation instructions
- Guides through webhook forwarding setup
- Usage: `./scripts/stripe-webhook-setup.sh`
### 7. Documentation Updated ✅
**KOHA_STRIPE_SETUP.md** updated with:
- Automated setup instructions (Quick Start section)
- Manual setup fallback instructions
- Current status section showing actual product/price IDs
- Multi-currency configuration guide
- Testing procedures
- Production deployment checklist
---
## Testing Instructions
### Test Donation Form (Browser)
1. **Visit:** http://localhost:9000/koha.html
2. **Select tier:** Foundation ($5), Advocate ($15), or Champion ($50)
- OR select "One-Time" and enter custom amount
3. **Fill form:**
- Name: (optional, defaults to Anonymous)
- Email: test@example.com
- Country: (optional)
4. **Submit** - Should redirect to Stripe Checkout
### Complete Payment (Stripe Test Mode)
Use Stripe test cards:
- **Success:** 4242 4242 4242 4242
- **3D Secure:** 4000 0027 6000 3184
- **Declined:** 4000 0000 0000 9995
**Card Details:**
- Expiry: Any future date (e.g., 12/25)
- CVC: Any 3 digits (e.g., 123)
- ZIP: Any 5 digits (e.g., 12345)
### Verify Checkout Session
Check server logs:
```bash
tail -f logs/server.log | grep KOHA
```
Expected output:
```
[KOHA] Creating checkout session: monthly donation of NZD $15 (NZD $15)
[KOHA] Using existing customer cus_...
[KOHA] Checkout session created: cs_test_...
POST /api/koha/checkout 200 - 1030ms
```
---
## Known Issues & Solutions
### Issue: Browser Shows "Donation system not yet active" (503 Error)
**Cause:** Service worker caching old JavaScript files
**Solution:**
1. Hard refresh: `Ctrl+Shift+R` (Windows/Linux) or `Cmd+Shift+R` (Mac)
2. OR use Incognito/Private window
3. OR manually clear service worker:
- DevTools → Application → Service Workers → Unregister
- DevTools → Application → Cache Storage → Delete all
- Refresh page
**Status:** Fixed by bumping cache version to 1.1.4
### Issue: E11000 Duplicate Key Error
**Cause:** `stripe_payment_id` index was unique but not sparse
**Solution:** Changed to sparse unique index (allows multiple null values)
**Status:** ✅ Fixed
---
## Next Steps
### 1. Webhook Testing (Pending)
**Install Stripe CLI:**
```bash
# Ubuntu/Debian
curl -s https://packages.stripe.dev/api/security/keypair/stripe-cli-gpg/public | gpg --dearmor | sudo tee /usr/share/keyrings/stripe.gpg
echo 'deb [signed-by=/usr/share/keyrings/stripe.gpg] https://packages.stripe.dev/stripe-cli-debian-local stable main' | sudo tee -a /etc/apt/sources.list.d/stripe.list
sudo apt update
sudo apt install stripe
# macOS
brew install stripe/stripe-cli/stripe
```
**Set up webhook forwarding:**
```bash
# Authenticate
stripe login
# Forward webhooks to local server
stripe listen --forward-to localhost:9000/api/koha/webhook
# Copy the webhook signing secret (whsec_...)
# Update .env:
STRIPE_KOHA_WEBHOOK_SECRET=whsec_...
# Restart server
npm start
# Test webhook
stripe trigger checkout.session.completed
```
### 2. End-to-End Browser Testing
- Test donation form submission from browser
- Complete Stripe checkout with test card
- Verify redirect to success page
- Check donation record in database
- Verify webhook events are received
### 3. Production Deployment
Before going live:
- [ ] Switch to Stripe live mode
- [ ] Create production webhook endpoint
- [ ] Obtain live API keys (sk_live_, pk_live_)
- [ ] Update production .env
- [ ] Test with real card (small amount)
- [ ] Verify webhook delivery in Stripe Dashboard
- [ ] Deploy to agenticgovernance.digital
---
## Files Modified/Created
### Created
- `scripts/test-stripe-connection.js`
- `scripts/setup-stripe-products.js`
- `scripts/test-stripe-integration.js`
- `scripts/stripe-webhook-setup.sh`
- `.stripe-ids.json` (auto-generated)
- `docs/STRIPE_SANDBOX_SETUP_COMPLETE.md` (this file)
### Modified
- `.env` - Added actual Stripe product and price IDs
- `public/js/i18n-simple.js` - Added koha/transparency page mappings
- `public/koha.html` - Fixed transparency link
- `public/service-worker.js` - Bumped cache version to 1.1.4
- `public/version.json` - Updated to 1.1.4
- `docs/KOHA_STRIPE_SETUP.md` - Added automated setup instructions
### Database Changes
- Modified `stripe_payment_id` index to sparse unique in `koha_donations` collection
---
## Support & Resources
**Test Integration:**
```bash
node scripts/test-stripe-integration.js
```
**Check Server Logs:**
```bash
tail -f logs/server.log
```
**Stripe Dashboard:**
- Test Mode: https://dashboard.stripe.com/test
- Products: https://dashboard.stripe.com/test/products
- Webhooks: https://dashboard.stripe.com/test/webhooks
**Documentation:**
- Setup Guide: `docs/KOHA_STRIPE_SETUP.md`
- Stripe API Docs: https://stripe.com/docs/api
- Test Cards: https://stripe.com/docs/testing
---
## Summary
✅ Stripe sandbox is **fully operational**
✅ Backend API tested and working
✅ Frontend form connected
✅ Database configured correctly
✅ Automated setup scripts available
✅ Documentation updated
**Ready for:** Browser testing → Webhook setup → Production deployment
**Test URL:** http://localhost:9000/koha.html
---
**Last Updated:** 2025-10-18 01:50 UTC
**Session ID:** 2025-10-07-001 (continued)
**Status:** ✅ Complete - Ready for Testing