make_post_sell/docs/PAYPAL.md
Russell Ballestrini a2e2092a31 Add privacy warnings to PayPal docs, create Adyen integration doc
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
2025-12-22 16:11:54 -05:00

2.5 KiB

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:

app.payments.paypal.enabled = True
app.paypal.sandbox_mode = True

Or environment variables:

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