# PhonePe Payment Gateway Integration Complete guide to integrate PhonePe payments in LuckyChit app. ## 🚀 Features - ✅ **Direct UPI Payments** - Members pay installments via PhonePe - ✅ **Secure Transactions** - SHA256 checksum verification - ✅ **Real-time Status** - Instant payment confirmation - ✅ **Auto-recording** - Payments automatically recorded in system - ✅ **Refund Support** - Managers can initiate refunds - ✅ **Transaction History** - Complete payment audit trail ## 📋 Prerequisites ### 1. PhonePe Merchant Account 1. Sign up at [PhonePe Business Portal](https://business.phonepe.com/) 2. Complete KYC verification 3. Get your merchant credentials: - **Merchant ID** (e.g., `M1234567890`) - **Salt Key** (secret key for checksum) - **Salt Index** (usually `1`) ### 2. Backend Setup #### Install Dependencies ```bash cd backend npm install axios crypto ``` #### Environment Variables Add to `backend/.env`: ```env # PhonePe Configuration PHONEPE_MERCHANT_ID=your_merchant_id_here PHONEPE_SALT_KEY=your_salt_key_here PHONEPE_SALT_INDEX=1 PHONEPE_ENV=sandbox # Change to 'production' for live # PhonePe URLs PHONEPE_REDIRECT_URL=https://chitfund.deepteklabs.com/payment/callback PHONEPE_CALLBACK_URL=https://chitfund.deepteklabs.com/api/payments/phonepe/callback ``` #### API Endpoints Created | Endpoint | Method | Description | |----------|--------|-------------| | `/api/payments/phonepe/initiate` | POST | Start payment | | `/api/payments/phonepe/callback` | POST | PhonePe webhook | | `/api/payments/phonepe/verify` | POST | Verify payment | | `/api/payments/phonepe/status/:id` | GET | Check status | | `/api/payments/phonepe/refund` | POST | Refund payment | ### 3. Flutter App Setup #### Install Dependencies Add to `luckychit/pubspec.yaml`: ```yaml dependencies: url_launcher: ^6.2.1 # For opening PhonePe app ``` #### Initialize Service In `luckychit/lib/app.dart`: ```dart import 'core/services/phonepe_service.dart'; // In initServices() Get.put(PhonePeService()); ``` #### Usage in UI ```dart import 'package:luckychit/interfaces/member/member_payment_dialog.dart'; // Show payment dialog showDialog( context: context, builder: (context) => MemberPaymentDialog( group: chitGroup, member: currentMember, month: DateTime.now().month, year: DateTime.now().year, ), ); ``` ## 🔄 Payment Flow ### Step 1: Member Initiates Payment ``` Member Dashboard → Pay Installment → Select Month/Year → Pay with PhonePe ``` ### Step 2: Backend Creates Payment Request 1. Validates member and group 2. Creates pending payment record 3. Generates PhonePe payload with checksum 4. Returns payment URL to app ### Step 3: PhonePe Payment 1. App opens PhonePe app/web 2. Member completes payment 3. PhonePe redirects back to app ### Step 4: Verification 1. PhonePe sends webhook to callback URL 2. Backend verifies checksum 3. Checks payment status with PhonePe API 4. Updates payment record to 'success' ### Step 5: Confirmation 1. App shows success message 2. Member sees updated payment status 3. Manager gets notification ## 🛠 Testing ### Sandbox Mode PhonePe provides test credentials for sandbox: ```env PHONEPE_ENV=sandbox PHONEPE_MERCHANT_ID=PGTESTPAYUAT PHONEPE_SALT_KEY=099eb0cd-02cf-4e2a-8aca-3e6c6aff0399 PHONEPE_SALT_INDEX=1 ``` ### Test Cards | Card Number | Behavior | |-------------|----------| | `4111 1111 1111 1111` | Success | | `4000 0000 0000 0002` | Declined | | `5555 5555 5555 4444` | Timeout | ### Test UPI IDs - `success@upi` - Successful payment - `failure@upi` - Failed payment ## 🔐 Security ### Checksum Generation ```javascript // Payload + Endpoint + Salt Key → SHA256 const string = base64Payload + endpoint + saltKey; const checksum = sha256(string) + '###' + saltIndex; ``` ### Checksum Verification ```javascript // Verify callback from PhonePe const [checksum, saltIndex] = header.split('###'); const string = base64Response + saltKey; const calculatedChecksum = sha256(string); return checksum === calculatedChecksum; ``` ## 📊 Payment States | Status | Description | |--------|-------------| | `pending` | Payment initiated | | `success` | Payment completed | | `failed` | Payment declined/error | | `cancelled` | Refunded | ## 🔄 Refund Process ### Manager Initiates Refund ```dart // From manager dashboard final success = await phonePeService.initiateRefund( transactionId: 'TXN_123', amount: 10000.00, reason: 'Duplicate payment', ); ``` ### Backend Processes 1. Validates manager permissions 2. Checks payment is 'success' status 3. Creates refund request with PhonePe 4. Updates payment status to 'cancelled' ## 📱 Deep Links (Optional) ### Android Add to `AndroidManifest.xml`: ```xml ``` ### iOS Add to `Info.plist`: ```xml CFBundleURLTypes CFBundleURLSchemes luckychit ``` ## 🐛 Troubleshooting ### Issue: Payment status stuck on "pending" **Solution:** - Check PhonePe callback URL is publicly accessible - Verify webhook is reaching your server - Check server logs for callback errors ### Issue: Checksum mismatch **Solution:** - Verify salt key and index are correct - Ensure no extra spaces in environment variables - Check endpoint path matches exactly ### Issue: Payment succeeds but not recorded **Solution:** - Check database connection - Verify Payment model update logic - Check for transaction conflicts ## 📞 PhonePe Support - **Docs**: https://developer.phonepe.com/ - **Support**: https://business.phonepe.com/support - **Status**: https://status.phonepe.com/ ## 🚀 Going Live ### Checklist - [ ] Get production merchant credentials - [ ] Set `PHONEPE_ENV=production` - [ ] Update callback URLs to production domain - [ ] Test with small real payments - [ ] Monitor first few transactions closely - [ ] Set up error alerting - [ ] Document transaction IDs ### Production Environment ```env PHONEPE_ENV=production PHONEPE_MERCHANT_ID=your_production_merchant_id PHONEPE_SALT_KEY=your_production_salt_key PHONEPE_REDIRECT_URL=https://chitfund.deepteklabs.com/payment/callback PHONEPE_CALLBACK_URL=https://chitfund.deepteklabs.com/api/payments/phonepe/callback ``` ## 💡 Best Practices 1. **Always verify payments** - Never trust client-side status 2. **Log all transactions** - Keep audit trail 3. **Handle timeouts** - Payment might succeed even if timeout 4. **Retry verification** - Network issues can cause false negatives 5. **Notify users** - Send confirmations via SMS/email 6. **Monitor refunds** - Track refund reasons and patterns ## 📈 Analytics Track these metrics: - Payment success rate - Average payment time - Failed payment reasons - Refund frequency - Member payment patterns --- **Need Help?** Contact PhonePe support or check the [developer documentation](https://developer.phonepe.com/).