Быстрый старт
Пять запросов от нуля до оплаченного инвойса — на демо-доступах, без регистрации. Примеры на XML Merchant API v2.9. Эквиваленты на JSON v3 — в разделах методов ниже: оба протокола боевые, выбор за вами.
Схема сценария
Мерчант Callisto (песочница) Абонент
│ │ │
│ 1. CreateInvoice ─────────────►│ │
│◄─── InvoiceID + SMS_PIN ───────│ ~~~ SMS с PIN ~~~~~~~~~~~~►│
│ │ (в песочнице не шлётся) │
│ 2. AuthorizeInvoice(PIN) ─────►│◄── абонент сообщает PIN ───│
│◄─── ResultCode=0 ──────────────│ │
│ │ │
│ 3. GetInvoice ────────────────►│ тарификация у оператора │
│◄─── Processed / PAID ──────────│ │
│ │ │
│◄── SendPaymentTransaction ─────│ коллбек, приходит сам │- Возьмите доступы. В песочнице — публичные демо-доступы из раздела «Доступ и тестовые данные»; регистрация не нужна, доступы общие для всех, кто открыл эту страницу.
- Посчитайте подпись. Она нужна каждому запросу и живёт в
<Header><Authentication>. Формула и разбор — в разделе «Подпись запросов». - Создайте инвойс методом
CreateInvoice. Блок<TestInfo>— песочный:ExpectedBillingResult=Successзадаёт успешную тарификацию,CallbackDelaySeconds=0убирает задержку коллбека. В ответе придётInvoiceID— сохраните его. - Подтвердите инвойс методом
AuthorizeInvoiceс<AuthorizeInfo><PinCode>1234</PinCode></AuthorizeInfo>. SMS песочница не отправляет, PIN фиксированный. Ответ —ResultCode=0с пустым<AuthorizeInvoiceResponse />. - Проверьте статус методом
GetInvoice. Сразу после подтверждения придётActive/NOT_PAID— песочница имитирует тарификацию. Повторите запрос через 6 секунд и получитеProcessed/PAID. - Дождитесь коллбека.
SendPaymentTransactionуходит на callback URL проекта сам, отдельно запрашивать его не нужно. Подробности и политика повторов — в разделе «Коллбеки». - Дальше: оплата банковской картой и через СБП, песочные ручки для эмуляции отказов и отличия от боевой среды — см. соответствующие разделы.
Инвойс хранится в песочнице: GetInvoice возвращает те же MerchantOrderID, MSISDN и сумму, что вы отправили. Из шаблонов приходят только песочные константы вроде OperatorID — см. «Отличия Sandbox ↔ Production».
Шаг 2 — подпись (bash)
Sandbox
NOW и SIG подставляются в <Header> каждого запроса
LOGIN=demo_login
SECRET=demo_password
NOW=$(date -u +%Y%m%d%H%M%S)
INNER=$(printf '%s' "$NOW" | openssl dgst -sha256 -hmac "$SECRET" -r | cut -d' ' -f1)
SIG=$(printf '%s' "$LOGIN$INNER" | openssl dgst -sha256 -hmac "$SECRET" -r | cut -d' ' -f1)Шаг 3 — CreateInvoice
Sandbox
curl -X POST \
https://pay-sandbox.digitalspb.com/API/XML/InvoiceManagementService.ashx \
-H "Content-Type: text/xml; charset=utf-8" \
--data-binary '<?xml version="1.0" encoding="utf-8"?>
<Request>
<Header>
<Authentication>
<Login>'"$LOGIN"'</Login>
<NowUtc>'"$NOW"'</NowUtc>
<Signature>'"$SIG"'</Signature>
</Authentication>
</Header>
<CreateInvoiceRequest>
<ProjectID>1001</ProjectID>
<MobilePhoneCustomer><MSISDN>79600000000</MSISDN></MobilePhoneCustomer>
<InvoiceInfo>
<MerchantOrderID>QS-DEMO-1042</MerchantOrderID>
<CustomerPrice amount="99.00" currency="RUB" includingVAT="true"/>
</InvoiceInfo>
<!-- песочные ручки, в бою их нет -->
<TestInfo>
<ExpectedBillingResult>Success</ExpectedBillingResult>
<CallbackDelaySeconds>0</CallbackDelaySeconds>
</TestInfo>
</CreateInvoiceRequest>
</Request>'Ответ — сохраните InvoiceID
<Response>
<CreateInvoiceResponse>
<InvoiceInfo>
<InvoiceStatus>Created</InvoiceStatus>
<PaymentStatus>NOT_PAID</PaymentStatus>
<AuthorizationType>SMS_PIN</AuthorizationType>
<InvoiceID>8e3b885b-b51a-46d2-835d-7b77b3d5cca7</InvoiceID>
<MerchantOrderID>QS-DEMO-1042</MerchantOrderID>
</InvoiceInfo>
<BillingInfo><BillingChannel>MC</BillingChannel></BillingInfo>
</CreateInvoiceResponse>
<ResultCode>0</ResultCode>
</Response>Шаг 4 — AuthorizeInvoice
Подпись пересчитывается заново: NowUtc новый
<AuthorizeInvoiceRequest>
<ProjectID>1001</ProjectID>
<InvoiceInfo>
<InvoiceID>8e3b885b-b51a-46d2-835d-7b77b3d5cca7</InvoiceID>
</InvoiceInfo>
<AuthorizeInfo>
<PinCode>1234</PinCode>
</AuthorizeInfo>
</AuthorizeInvoiceRequest>
<!-- ответ -->
<Response>
<AuthorizeInvoiceResponse />
<ResultCode>0</ResultCode>
<ResultDescription>OK</ResultDescription>
</Response>Шаг 5 — GetInvoice
<GetInvoiceRequest>
<ProjectID>1001</ProjectID>
<InvoiceInfo>
<InvoiceID>8e3b885b-b51a-46d2-835d-7b77b3d5cca7</InvoiceID>
</InvoiceInfo>
</GetInvoiceRequest>
<!-- сразу после AuthorizeInvoice -->
<InvoiceStatus>Active</InvoiceStatus>
<PaymentStatus>NOT_PAID</PaymentStatus>
<!-- тот же запрос через 6 секунд -->
<InvoiceStatus>Processed</InvoiceStatus>
<PaymentStatus>PAID</PaymentStatus>Шаг 6 — коллбек, приходит сам
<Request>
<Header><RequestID>bae26b7d-…</RequestID><RequestAttempt>1</RequestAttempt></Header>
<SendPaymentTransaction>
<InvoiceID>8e3b885b-b51a-46d2-835d-7b77b3d5cca7</InvoiceID>
<MerchantOrderID>QS-DEMO-1042</MerchantOrderID>
<Status>Success</Status>
<BillingResult>Success</BillingResult>
<PaymentStatus>SUCCESS</PaymentStatus>
<Amount>99.00</Amount><Currency>RUB</Currency>
</SendPaymentTransaction>
</Request>