Unify and harden the payment flow (same API for the main site and all consumer sites; per-client difference is only frontend_address). - Payment gains STATUS_CANCELED. Gateways distinguish user-cancel from failure (Mellat ResCode=17, SEP CanceledByUser, mock cancel=1) via a new PaymentVerifyResult::canceled flag; callback sets canceled vs failed and skips the circuit-breaker on cancel. - Expiry job now cancels the pending payment when a booking lapses (AppointmentExpiryService + PaymentRepository::findPendingByAppointment). - frontend_address allowlist is read from the payment_allowed_frontend_hosts site setting (manageable via PATCH /api/v1/admin/settings), falling back to the ALLOWED_FRONTEND_HOSTS env var — so a new consumer site needs no code change. - .env: broaden CORS_ALLOW_ORIGIN to city subdomains (*.localhost / *.clinic-pro.ddev.site) and add yazd-nobat.localhost to ALLOWED_FRONTEND_HOSTS. - Update docs/api/payment.md and docs/api/admin.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
70 lines
1.7 KiB
Bash
70 lines
1.7 KiB
Bash
###> symfony/framework-bundle ###
|
|
APP_ENV=dev
|
|
APP_SECRET=clinic_pro_secret_change_in_prod
|
|
APP_SHARE_DIR=var/share
|
|
###< symfony/framework-bundle ###
|
|
|
|
###> symfony/routing ###
|
|
DEFAULT_URI=https://clinic-pro.ddev.site
|
|
###< symfony/routing ###
|
|
|
|
###> doctrine/doctrine-bundle ###
|
|
DATABASE_URL="mysql://db:db@db:3306/db?serverVersion=8.0&charset=utf8mb4"
|
|
###< doctrine/doctrine-bundle ###
|
|
|
|
###> lexik/jwt-authentication-bundle ###
|
|
JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem
|
|
JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem
|
|
JWT_PASSPHRASE=5778180ab122fbb3253d84f4137dbc1672109bab9ad051d3d40fb1c2be3e242d
|
|
###< lexik/jwt-authentication-bundle ###
|
|
|
|
###> nelmio/cors-bundle ###
|
|
CORS_ALLOW_ORIGIN='^https?://([a-z0-9-]+\.)*(clinic-pro\.ddev\.site|localhost|127\.0\.0\.1)(:[0-9]+)?$'
|
|
###< nelmio/cors-bundle ###
|
|
|
|
###> symfony/messenger ###
|
|
MESSENGER_TRANSPORT_DSN=redis://redis:6379/messages
|
|
###< symfony/messenger ###
|
|
|
|
###> Redis ###
|
|
REDIS_URL=redis://redis:6379
|
|
###< Redis ###
|
|
|
|
###> Auth ###
|
|
REFRESH_TOKEN_TTL=2592000
|
|
OTP_TTL=1200
|
|
###< Auth ###
|
|
|
|
###> SMS ###
|
|
KAVENEGAR_API_KEY=change_me
|
|
RANGINEH_API_KEY=change_me
|
|
SMS_PROVIDER=kavenegar
|
|
###< SMS ###
|
|
|
|
###> File Upload ###
|
|
MAX_FILE_SIZE_BYTES=5242880
|
|
UPLOAD_DIR=var/uploads
|
|
###< File Upload ###
|
|
|
|
###> Payment ###
|
|
ALLOWED_FRONTEND_HOSTS=clinic-pro.ddev.site,localhost,yazd-nobat.localhost
|
|
###< Payment ###
|
|
|
|
# Payment
|
|
MELLAT_TERMINAL_ID=00000000
|
|
MELLAT_USERNAME=testuser
|
|
MELLAT_PASSWORD=testpass
|
|
SEP_TERMINAL_ID=00000000
|
|
APP_BASE_URL=https://clinic-pro.ddev.site
|
|
|
|
# SMS
|
|
KAVENEGAR_API_KEY=test_key
|
|
KAVENEGAR_SENDER=1000596446
|
|
RANGINEH_API_KEY=test_key
|
|
RANGINEH_SENDER=3000
|
|
|
|
###> API Docs ###
|
|
API_DOC_USERNAME=admin
|
|
API_DOC_PASSWORD='$2y$10$ofN6zZDqzKKMe5rieHuKceM9ZZTI8F1L7xNzJ1EuPyZjhDY2zwodO'
|
|
###< API Docs ###
|