PayPal:
- Document invasive KYC requirements (face scanning, government ID)
- Note that crypto is the privacy-preserving alternative
Adyen:
- Document integration approach (similar to Stripe)
- Include Python library usage, webhooks, credentials needed
- Status: not yet implemented
- Add stripe_payment_intent_id and stripe_charge_id columns to Invoice
- Store payment references during checkout for traceability
- Use idempotency key to prevent duplicate charges on retry
- Add Stripe webhook handler for payment_intent.succeeded, payment_failed,
charge.refunded, and charge.dispute.created events
- Consolidate PayPal webhooks into webhooks.py
- Add stripe.webhook_secret configuration for signature verification
Tests: 8 unit, 5 integration, 7 functional tests for Stripe functionality
The checkout POST now returns a 200 OK directly (or with different
redirect count), so update the test to:
1. Use a while loop to follow any number of redirects
2. Update assertion text from "Please enter your payment information."
to "Please confirm your order." to match current UI text
- Add paypal_order_id and paypal_capture_id columns to Invoice model
- Update migration to add columns to mps_invoice instead of creating separate table
- Remove PayPalPayment model (simpler architecture matching Stripe)
- Update paypal.py to store PayPal info directly on Invoice
- Update paypal_webhooks.py to query Invoice by paypal_order_id
- Update Invoice.payment_method property to detect PayPal payments
- Create docs/ directory and move CHANGES_PAYPAL.md into it
- Add CHANGELOG.rst with unreleased section for PayPal integration
- Update README.rst to mention PayPal alongside other payment methods
- Add vault parameters to order creation for saving payment methods
- Extract and store vault.id in PayPalUserShop after successful payment
- Add "Save PayPal" checkbox to checkout page
- Show saved status for returning customers
- Add PayPal management section to billing page
- Add disconnect PayPal functionality at /billing/disconnect-paypal
- Refunds are handled externally by shop owners via PayPal dashboard
- Platform does not track or process refunds
- Update documentation to reflect external refund handling
Documentation:
- Update CHANGES_PAYPAL.md
No database migrations required - uses existing PayPalUserShop columns:
- active_payment_token (stores vault.id)
- payer_id (stores PayPal payer ID)
EOF
)"
- Added vault parameters for saving PayPal payment methods
- Extract and store vault.id after successful payment
- Logs vault status (VAULTED vs APPROVED)
make_post_sell/views/billing.py
- Added paypal_user_shop to template context
- Added disconnect_paypal() view function