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
81 lines
2.5 KiB
Markdown
81 lines
2.5 KiB
Markdown
# PayPal Payments
|
|
|
|
PayPal is available as a payment method alongside Stripe and crypto (XMR/DOGE).
|
|
|
|
## Privacy Warning
|
|
|
|
PayPal requires invasive identity verification to receive payments:
|
|
|
|
- ML-based face scanning (biometric capture)
|
|
- Two images of your face from different angles
|
|
- Photos of both sides of government-issued ID (driver's license, passport)
|
|
- Business verification for merchant accounts
|
|
|
|
This verification is required to move from sandbox to live production payments. There is no way to accept PayPal payments anonymously or privately. If privacy is important to you, consider crypto payments (XMR/DOGE) instead.
|
|
|
|
## Shop Setup
|
|
|
|
1. Go to https://developer.paypal.com/dashboard/
|
|
2. Create an app (sandbox for testing, live for production)
|
|
3. Complete identity verification (face scan + government ID)
|
|
4. Copy Client ID and Secret
|
|
5. In Shop Settings → PayPal Settings, enter credentials and save
|
|
|
|
## Configuration
|
|
|
|
Global settings in `development.ini`:
|
|
|
|
```ini
|
|
app.payments.paypal.enabled = True
|
|
app.paypal.sandbox_mode = True
|
|
```
|
|
|
|
Or environment variables:
|
|
|
|
```bash
|
|
export MPS_PAYMENTS_PAYPAL_ENABLED=True
|
|
export MPS_PAYPAL_SANDBOX_MODE=True
|
|
```
|
|
|
|
## How It Works
|
|
|
|
- Each shop configures their own PayPal credentials
|
|
- PayPal button appears at checkout when enabled
|
|
- Payment info stored on Invoice (`paypal_order_id`, `paypal_capture_id`)
|
|
- `Invoice.payment_method` returns "paypal" for PayPal payments
|
|
- Saved payment methods stored in `PayPalUserShop`
|
|
|
|
## Webhooks
|
|
|
|
Webhooks provide resilience when JavaScript callbacks fail. Configure in PayPal Developer Dashboard:
|
|
|
|
1. Go to https://developer.paypal.com/dashboard/applications
|
|
2. Select your app → Webhooks → Add Webhook
|
|
3. Enter URL: `https://yourdomain.com/webhooks/paypal`
|
|
4. Subscribe to events:
|
|
- `PAYMENT.CAPTURE.COMPLETED`
|
|
- `CHECKOUT.ORDER.APPROVED`
|
|
- `PAYMENT.CAPTURE.DENIED`
|
|
- `CUSTOMER.DISPUTE.CREATED`
|
|
5. Copy the Webhook ID
|
|
6. Set in your ini: `paypal.webhook_id = YOUR_WEBHOOK_ID`
|
|
|
|
## Code
|
|
|
|
- `make_post_sell/views/cart.py` - PayPal checkout functions (`paypal_create_order`, `paypal_complete_checkout`)
|
|
- `make_post_sell/views/billing.py` - Disconnect saved PayPal
|
|
- `make_post_sell/views/webhooks.py` - Webhook handlers
|
|
|
|
## Database
|
|
|
|
**mps_shop columns:**
|
|
- `paypal_client_id` - Shop's PayPal Client ID
|
|
- `paypal_secret` - Shop's PayPal Secret
|
|
- `paypal_enabled` - Toggle PayPal on/off
|
|
|
|
**mps_invoice columns:**
|
|
- `paypal_order_id` - PayPal order reference
|
|
- `paypal_capture_id` - PayPal capture reference
|
|
|
|
**mps_paypal_user_shop table:**
|
|
- Tracks saved PayPal payment methods per user/shop
|