# Environment variables

> Every environment variable the adapters read, per provider, and which ones enable each gateway.

Source: https://nepal-payments-skill.pages.dev/docs/guides/env/

> Source: [`references/env.md`](https://github.com/broisnees/nepal-payments-skill/blob/main/skills/nepal-payments/references/env.md). This is the same file the agent reads.

`paymentsConfigFromEnv()` (TS) and `config_from_env()` (Python) enable a provider when its required variables are set. `*_ENV` is `sandbox` (default) or `production` (`live` also accepted).

| Provider | Required | Optional |
|---|---|---|
| eSewa | `ESEWA_PRODUCT_CODE`, `ESEWA_SECRET_KEY` | `ESEWA_ENV`, `ESEWA_INTENT_PRODUCT_CODE`, `ESEWA_INTENT_ACCESS_KEY`, `ESEWA_INTENT_BASE_URL` (production Intent host from eSewa) |
| Khalti | `KHALTI_SECRET_KEY`, `KHALTI_WEBSITE_URL` | `KHALTI_ENV`; `KHALTI_PUBLIC_KEY` for mobile SDK builds only |
| Fonepay | `FONEPAY_MERCHANT_CODE`, `FONEPAY_SECRET_KEY` | `FONEPAY_ENV`, `FONEPAY_USERNAME`, `FONEPAY_PASSWORD` (needed for txnVerification + Dynamic QR) |
| connectIPS | `CONNECTIPS_MERCHANT_ID`, `CONNECTIPS_APP_ID`, `CONNECTIPS_PRIVATE_KEY_PEM` | `CONNECTIPS_ENV`, `CONNECTIPS_APP_NAME`, `CONNECTIPS_APP_PASSWORD` |
| CyberSource SA | `CYBERSOURCE_PROFILE_ID`, `CYBERSOURCE_ACCESS_KEY`, `CYBERSOURCE_SECRET_KEY` | `CYBERSOURCE_ENV`, `CYBERSOURCE_CURRENCY` (NPR) |
| CyberSource REST (SDK) | `CYBERSOURCE_MERCHANT_ID`, `CYBERSOURCE_KEY_ID`, `CYBERSOURCE_SHARED_SECRET` | |
| NPS | `NPS_MERCHANT_ID`, `NPS_SECRET_KEY` | `NPS_ENV`, `NPS_MERCHANT_NAME`, `NPS_API_USERNAME`, `NPS_API_PASSWORD` |
| IME Pay | `IMEPAY_MERCHANT_CODE`, `IMEPAY_USERNAME` | `IMEPAY_ENV`, `IMEPAY_PASSWORD`, `IMEPAY_MODULE` |

`.env.example` (sandbox values that are public in provider docs; everything else blank):
```dotenv
APP_PUBLIC_URL=https://shop.example.com     # used to build return URLs; must be reachable by the payer's browser

ESEWA_ENV=sandbox
ESEWA_PRODUCT_CODE=EPAYTEST
ESEWA_SECRET_KEY=8gBm/:&EnhH.1/q
ESEWA_INTENT_PRODUCT_CODE=INTENT
ESEWA_INTENT_ACCESS_KEY=LB0REg8HUSw3MTYrI1s6JTE8Kyc6JyAqJiA3MQ==

KHALTI_ENV=sandbox
KHALTI_SECRET_KEY=                          # test-admin.khalti.com → Keys (login OTP 987654)
KHALTI_WEBSITE_URL=https://shop.example.com

FONEPAY_ENV=sandbox
FONEPAY_MERCHANT_CODE=NBQM                  # public dev sample from Fonepay's spec
FONEPAY_SECRET_KEY=a7e3512f5032480a83137793cb2021dc
FONEPAY_USERNAME=
FONEPAY_PASSWORD=

CONNECTIPS_ENV=sandbox
CONNECTIPS_MERCHANT_ID=
CONNECTIPS_APP_ID=
CONNECTIPS_APP_NAME=
CONNECTIPS_APP_PASSWORD=
CONNECTIPS_PRIVATE_KEY_PEM=                 # PKCS#8 PEM; "\n" escapes allowed

CYBERSOURCE_ENV=sandbox
CYBERSOURCE_PROFILE_ID=
CYBERSOURCE_ACCESS_KEY=
CYBERSOURCE_SECRET_KEY=

NPS_ENV=sandbox
NPS_MERCHANT_ID=
NPS_MERCHANT_NAME=
NPS_API_USERNAME=
NPS_API_PASSWORD=
NPS_SECRET_KEY=

IMEPAY_ENV=sandbox
IMEPAY_MERCHANT_CODE=
IMEPAY_USERNAME=
IMEPAY_PASSWORD=
IMEPAY_MODULE=
```

Rules:
- Commit `.env.example` only. Production secrets live in the platform's secret store (Vercel/Render/Fly env, `wrangler secret put`, AWS/GCP Secret Manager, Kubernetes secrets).
- Never expose these to the client. In Next.js, no `NEXT_PUBLIC_` prefix; in Vite, no `VITE_` prefix; in Expo, no `EXPO_PUBLIC_` prefix. The only value a client may hold is the Khalti **public** key for its mobile SDK.
- Fail fast at boot when a provider is half-configured in production (e.g. `*_ENV=production` with a sandbox product code like `EPAYTEST`).
