{"content":"[assist-base-service dev journal] feat-paypal-recharge (commit ed15523): PayPalGateway behind the existing PaymentGateway seam, plain HTTP+JSON (no SDK). CreatePayment builds the PayPal order strictly from the pricing-plan row (intent=CAPTURE, custom_id+invoice_id=our orderId, 2-decimal amount, PayPal-Request-Id idempotency) and persists gatewayOrderId for APPROVED reconciliation. Webhook is self-driving via a new HandleWebhook path: verify-webhook-signature gates every delivery (no environment skips), CHECKOUT.ORDER.APPROVED triggers capture (ORDER_ALREADY_CAPTURED tolerated), PAYMENT.CAPTURE.COMPLETED re-checks amount+currency against the order row then runs the existing idempotent creditRechargeOrder; DENIED/REFUNDED/REVERSED are log-alert only. New WebhookError type carries the HTTP status to return (4xx forged/malformed, 5xx retryable); unknown-order lookups ack without retry while DB errors ask PayPal to re-deliver. OAuth token cached with mutex until expiry-30s, 401 clears it. 9 unit tests with httptest mocks cover payload shape, token caching, forged/malformed rejection, log-only events, and disabled-gateway parity with the unsupported-gateway envelope.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}