Skip to Content

Быстрый старт

Пять запросов от нуля до оплаченного инвойса — на демо-доступах, без регистрации. Примеры на 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 ─────│ коллбек, приходит сам │
  1. Возьмите доступы. В песочнице — публичные демо-доступы из раздела «Доступ и тестовые данные»; регистрация не нужна, доступы общие для всех, кто открыл эту страницу.
  2. Посчитайте подпись. Она нужна каждому запросу и живёт в <Header><Authentication>. Формула и разбор — в разделе «Подпись запросов».
  3. Создайте инвойс методом CreateInvoice. Блок <TestInfo> — песочный: ExpectedBillingResult=Success задаёт успешную тарификацию, CallbackDelaySeconds=0 убирает задержку коллбека. В ответе придёт InvoiceID — сохраните его.
  4. Подтвердите инвойс методом AuthorizeInvoice с <AuthorizeInfo><PinCode>1234</PinCode></AuthorizeInfo>. SMS песочница не отправляет, PIN фиксированный. Ответ — ResultCode=0 с пустым <AuthorizeInvoiceResponse />.
  5. Проверьте статус методом GetInvoice. Сразу после подтверждения придёт Active / NOT_PAID — песочница имитирует тарификацию. Повторите запрос через 6 секунд и получите Processed / PAID.
  6. Дождитесь коллбека. SendPaymentTransaction уходит на callback URL проекта сам, отдельно запрашивать его не нужно. Подробности и политика повторов — в разделе «Коллбеки».
  7. Дальше: оплата банковской картой и через СБП, песочные ручки для эмуляции отказов и отличия от боевой среды — см. соответствующие разделы.

Инвойс хранится в песочнице: GetInvoice возвращает те же MerchantOrderID, MSISDN и сумму, что вы отправили. Из шаблонов приходят только песочные константы вроде OperatorID — см. «Отличия Sandbox ↔ Production».

Шаг 2 — подпись (bash)

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

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>