Esta página está disponible solo en inglés por ahora.
Binance Pay
Crypto payments through Binance Pay, the customer pays from the Binance app or web checkout; the balance is credited by Binance's signed notification.
What you need
In the Binance Merchant Admin Portal → Developer menu, create a new API key pair:
api_key: what Binance calls the "API identity key"secret_key: the "API secret key"; it is shown in full only at creation, so save it right away (the shortened form displayed later does not work)
In your panel choose Settings → Payments → Add method → Binance Pay and enter both.
No sandbox: Binance Pay has no separate test environment; the only host is bpay.binanceapi.com. The "sandbox (test) mode" box has no effect on this method; to try the flow, open a small order with real keys and leave it unpaid (it closes with PAY_CLOSED after one hour).
IP restriction: if the "IP Access Restrictions" field in the Merchant Portal is filled in, Binance accepts calls only from those IPs (error 400004). Either leave it empty or add our server's IP.
Notification (webhook) URL
You do not need to configure a notification URL in the Binance portal: the panel attaches its own URL to every order in the webhookUrl field, which per Binance's docs overrides the portal setting. Its shape:
https://<your-panel-domain>/payments/binance_pay/callback
The request to this URL comes from Binance's server, not from the customer's browser. The customer's browser returns to /payments/binance_pay/return after paying; that page only redirects and never credits.
Flow
- The customer enters an amount and picks Binance Pay.
- The panel opens an order at Binance (
Create Order v3) and redirects the customer to Binance's hosted checkout; there they pay by scanning the QR with the Binance app or by signing in to their Binance account. - Binance sends a signed notification carrying our reference in the order's
merchantTradeNo. - The panel verifies the notification with Binance's RSA public key (fetched from Binance over the signed
certificatescall and cached for 6 hours; refreshed once if verification misses). A notification whose signature does not verify is rejected and credits nothing. - On
PAY_SUCCESSthe balance is credited and Binance receives{"returnCode":"SUCCESS"}. A repeated notification for the same order is ignored.
The notification may not have arrived yet when the customer lands back on the panel; the balance shows within seconds, once it is processed. If a notification does not get through, Binance retries up to six times.
Statuses
Binance bizStatus |
In the panel |
|---|---|
PAY_SUCCESS |
payment completed, balance credited |
PAY_CLOSED |
order closed unpaid (expired / cancelled) → "expired" |
PAY_FAIL |
only sent for direct-debit contracts → "failed" |
A Binance Pay order is either paid in full or not at all; there is no underpaid state.
Currencies
Binance collects orders in crypto (USDT by default). Depending on your panel's currency there are two routes:
- TRY, USD, EUR and other fiat currencies: the amount is sent to Binance as
fiatAmount+fiatCurrency; Binance works out the USDT equivalent at its own market rate and collects that much USDT from the customer. The balance is credited with the amount the customer asked for (e.g. 100 TRY); the crypto amount Binance actually collected is noted on the payment record. The supported fiat list is Binance'sasset-service/product/currencylist (TRY and USD are on it). The rate is Binance's; the panel applies none of its own. - USDT, USDC, BNB, BTC: if the method's currency is one of these, the amount goes straight as
orderAmount+currency, and the collected amount from the notification is compared one-to-one with the balance.
currency: "USD" is available at Binance only to specially onboarded BPay merchants, which is why USD panels also go the fiat route.
Binance's commission is taken from your Binance account; the panel balance is credited with the order's full amount.
Common problems
400002 INVALID_SIGNATURE/400004 INVALID_API_KEY_OR_IP: wrong key pair or a key copied in its shortened form; with an IP restriction, the server IP is not on the list.400003 INVALID_TIMESTAMP: Binance processes a request within a 1-second window; the server clock must be NTP-synced (ours is).400201 INVALID_MERCHANT_TRADE_NO: a second order with the same reference; the panel generates a fresh reference per payment, so if you see this, check the record's memo under Admin → Payments.- Paid but no balance: if the notification's signature could not be verified the panel answers
400and Binance retries; the record stays "waiting" under Admin → Payments. Make sure the keys belong to the right Merchant account (the certificate call is signed with the same keys). - The return page says "paid" but the balance is pending: the browser return can beat the notification; wait a few seconds and refresh.
FollowerHQ