Skip to Content
ПодпискиМетоды

Методы управления подпиской

CreateSubscription — создать подписку

Инициализация подписки. В ответе — SubscriptionID, статус Pending и канал подтверждения SubscriberAcceptanceChannel: SMS_PIN для активации по номеру, AUTH_PAGE для карты, СБП и WAP — в этом случае в ответе приходит ещё и AuthorizeUrl. Коллбек SubscriptionStatusNotification уходит при фактической активации, а не сразу после создания.

POST /Http/Services/CreateSubscription.aspx

Поле клиентаКогда передавать
Subscriber_MSISDNАктивация SMS_PIN. Мок принимает и legacy-имя MSISDN, но спека называет поле Subscriber_MSISDN
CustomerType = CardОплата картой или через СБП — номер не нужен
CustomerIdИдентификатор клиента в вашей системе, обязателен вместе с CustomerType=Card
ClientIPWAP-активация, если передан без номера. Вместе с номером — проверка соответствия стран
Запрос — активация SMS_PIN
<?xml version="1.0" encoding="utf-8"?> <Request> <SubscriptionProjectID>2001</SubscriptionProjectID> <Subscriber_MSISDN>79001234567</Subscriber_MSISDN> <Now>20260625120000</Now> <Signature>d2f36558ca5455beb28b4ec090ffbea1cf9425106b5dbeb2f93538603956da53</Signature> <Localization>ru-RU</Localization> <ClientIP>80.70.60.50</ClientIP> </Request>
Ответ — активация SMS_PIN
<?xml version="1.0" encoding="utf-8"?> <Response> <StatusName>REQUEST_ACCEPTED</StatusName> <SubscriptionID>10000001</SubscriptionID> <SubscriberAcceptanceRequired>true</SubscriberAcceptanceRequired> <SubscriberAcceptanceChannel>SMS_PIN</SubscriberAcceptanceChannel> <OperatorID>22</OperatorID> <PaidUntil>2026-07-25T12:00:00+03:00</PaidUntil> </Response>
Запрос — карта и СБП
<?xml version="1.0" encoding="utf-8"?> <Request> <SubscriptionProjectID>2001</SubscriptionProjectID> <CustomerType>Card</CustomerType> <CustomerId>12345</CustomerId> <Now>20260625120000</Now> <Signature>d2f36558ca5455beb28b4ec090ffbea1cf9425106b5dbeb2f93538603956da53</Signature> <Localization>ru-RU</Localization> <ClientIP>80.70.60.50</ClientIP> </Request>
Ответ — карта и СБП: та же ссылка ведёт на оба сценария
<?xml version="1.0" encoding="utf-8"?> <Response> <StatusID>0</StatusID> <StatusName>REQUEST_ACCEPTED</StatusName> <SubscriptionID>10000002</SubscriptionID> <SubscriptionStatus>Pending</SubscriptionStatus> <SubscriberAcceptanceRequired>true</SubscriberAcceptanceRequired> <SubscriberAcceptanceChannel>AUTH_PAGE</SubscriberAcceptanceChannel> <AuthorizeUrl>https://subs-sandbox.digitalspb.com/Cards/TB/8c0c8870-d6fb-4ee8-a995-ae183a44b928/Init</AuthorizeUrl> <PaidUntil>2026-07-25T12:00:00+03:00</PaidUntil> <TrialExists>false</TrialExists> </Response>

Для оплаты по QR-коду СБП к AuthorizeUrl добавляется ?useSbpQr=True — отдельного метода и отдельной ссылки у СБП нет. Страница оплаты сама выбирает сценарий по устройству: десктопу показывает универсальный QR, телефону — список банков с диплинками.

CreateSubscription

BASE=https://subs-sandbox.digitalspb.com PROJECT_ID=2001 SECRET=subs_secret_key NOW=$(date -u +%Y%m%d%H%M%S) SIG=$(printf '%s%s' "$PROJECT_ID" "$NOW" \ | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $NF}') curl -X POST "$BASE/Http/Services/CreateSubscription.aspx" \ -H "Content-Type: text/xml; charset=utf-8" \ --data-binary @- <<XML <?xml version="1.0" encoding="utf-8"?> <Request> <SubscriptionProjectID>$PROJECT_ID</SubscriptionProjectID> <Subscriber_MSISDN>79001234567</Subscriber_MSISDN> <Now>$NOW</Now> <Signature>$SIG</Signature> <Localization>ru-RU</Localization> <ClientIP>80.70.60.50</ClientIP> </Request> XML

CreateSubscription — WAP-активация

Номер абонента партнёр не знает — его определяет шлюз оператора. Вместо Subscriber_MSISDN передаётся ClientIP, в ответе приходит AuthorizeUrl; к нему можно дописать ?ReturnUrl= (относительный путь к базовому адресу возврата проекта) и ?ext_lp_template=. После подтверждения абонент возвращается на адрес проекта с параметрами результата.

Запрос — WAP
<?xml version="1.0" encoding="utf-8"?> <Request> <SubscriptionProjectID>2001</SubscriptionProjectID> <ClientIP>80.70.60.50</ClientIP> <Localization>ru-RU</Localization> <Now>20260625120000</Now> <Signature>d2f36558ca5455beb28b4ec090ffbea1cf9425106b5dbeb2f93538603956da53</Signature> </Request>
ОператорПараметры обратного редиректа
МТС, Билайн (по умолчанию)subscriptionid, msisdn, action = approved | cancelled | alreadyexist
МегафонSubscriptionID, operation_status = ok | noauth. У этой же подписки в ответе CancelSubscription появляется CancelUrl

CreateSubscription — цикл списаний

В бою подписка тарифицируется по расписанию проекта — раз в 30 дней. Ждать этого в тесте нельзя, поэтому цикл сжимается блоком <TestInfo>: период задаётся в секундах, исход списания выбирается заранее. Без BillingPeriodSeconds списаний нет вовсе. Отсчёт первого списания идёт от активации подписки, а не от её создания.

ПолеЗначение
BillingPeriodSeconds1…86400. Включает цикл списаний. Задаёт и период между списаниями, и интервал повторной попытки после отказа
MaxIterations1…100, по умолчанию 3 — сколько успешных списаний пройдёт до закрытия подписки
ExpectedBillingResultSuccess (по умолчанию) или Failed — исход каждой попытки списания
BillingAmountСумма в CustomerPrice уведомлений, по умолчанию 10.00
OperatorIDОператор подписки, по умолчанию 22. Значение 20 включает поведение Мегафона: operation_status вместо action в обратном редиректе и CancelUrl в ответе CancelSubscription
Запрос — подписка с циклом списаний
<?xml version="1.0" encoding="utf-8"?> <Request> <SubscriptionProjectID>2001</SubscriptionProjectID> <Subscriber_MSISDN>79001234567</Subscriber_MSISDN> <Now>20260625120000</Now> <Signature>d2f36558ca5455beb28b4ec090ffbea1cf9425106b5dbeb2f93538603956da53</Signature> <TestInfo> <BillingPeriodSeconds>10</BillingPeriodSeconds> <MaxIterations>3</MaxIterations> <ExpectedBillingResult>Success</ExpectedBillingResult> <BillingAmount>49.00</BillingAmount> </TestInfo> </Request>

ApproveSubscription — подтвердить PIN

Подтверждение подписки PIN-кодом из SMS. Неверный код — WRONG_PARAMS / InvalidPinCode с остатком попыток; после третьей неудачи подписка навсегда переходит в ApprovingFailed, и верный PIN её уже не поднимет. Повторное подтверждение активной подписки — SubscriptionAlreadyApproved. К подпискам с каналом AUTH_PAGE метод неприменим: они активируются по факту оплаты.

В песочнице PIN фиксированный — 1234: SMS не отправляется. На подбор даётся три попытки, тот же отказ приходит, если подписку не подтвердили за 3 часа.

POST /Http/Services/ApproveSubscription.aspx

Запрос
<?xml version="1.0" encoding="utf-8"?> <Request> <SubscriptionProjectID>2001</SubscriptionProjectID> <SubscriptionID>12345678</SubscriptionID> <PinCode>1234</PinCode> <Now>20260625120000</Now> <Signature>d2f36558ca5455beb28b4ec090ffbea1cf9425106b5dbeb2f93538603956da53</Signature> </Request>

ApproveSubscription

curl -X POST "$BASE/Http/Services/ApproveSubscription.aspx" \ -H "Content-Type: text/xml; charset=utf-8" \ --data-binary @- <<XML <?xml version="1.0" encoding="utf-8"?> <Request> <SubscriptionProjectID>$PROJECT_ID</SubscriptionProjectID> <SubscriptionID>12345678</SubscriptionID> <PinCode>1234</PinCode> <Now>$NOW</Now> <Signature>$SIG</Signature> </Request> XML

GetSubscriptionStatus — статус подписки

Отдаёт фактический статус подписки. Подписка ищется по SubscriptionID, Subscriber_MSISDN или SubscriberID в границах проекта. Коллбек — не единственный источник состояния: после исчерпания попыток доставки статус остаётся доступен этим методом.

POST /Http/Services/GetSubscriptionStatus.aspx

Запрос
<?xml version="1.0" encoding="utf-8"?> <Request> <SubscriptionProjectID>2001</SubscriptionProjectID> <SubscriptionID>12345678</SubscriptionID> <Now>20260625120000</Now> <Signature>d2f36558ca5455beb28b4ec090ffbea1cf9425106b5dbeb2f93538603956da53</Signature> </Request>
Ответ
<?xml version="1.0" encoding="utf-8"?> <Response> <StatusName>REQUEST_ACCEPTED</StatusName> <SubscriptionStatus>Active</SubscriptionStatus> <Country>ru</Country> <OperatorID>22</OperatorID> <PaidUntil>2026-07-25T12:00:00+03:00</PaidUntil> </Response>

CancelSubscription — отменить подписку

Отмена по инициативе партнёра. Подписка идентифицируется SubscriptionID, либо Subscriber_MSISDN, либо SubscriberID. Статус становится Cancelled, приходит коллбек EventType=CANCELLED. Для подписок Мегафона (OperatorID=20) в ответе дополнительно приходит CancelUrl.

POST /Http/Services/CancelSubscription.aspx

Запрос
<?xml version="1.0" encoding="utf-8"?> <Request> <SubscriptionProjectID>2001</SubscriptionProjectID> <SubscriptionID>12345678</SubscriptionID> <Now>20260625120000</Now> <Signature>d2f36558ca5455beb28b4ec090ffbea1cf9425106b5dbeb2f93538603956da53</Signature> </Request>

ResendPinCode — повторно отправить PIN

Повторная отправка PIN — не более трёх раз и только для подписок с каналом SMS_PIN.

POST /Http/Services/ResendPinCode.aspx

Запрос
<?xml version="1.0" encoding="utf-8"?> <Request> <SubscriptionProjectID>2001</SubscriptionProjectID> <SubscriptionID>12345678</SubscriptionID> <Now>20260625120000</Now> <Signature>d2f36558ca5455beb28b4ec090ffbea1cf9425106b5dbeb2f93538603956da53</Signature> </Request>
Ответ Approve / Cancel / ResendPin
<?xml version="1.0" encoding="utf-8"?> <Response> <StatusName>REQUEST_ACCEPTED</StatusName> </Response>

GetSubscriptions — список подписок проекта

Возвращает подписки проекта — активные и закрытые, новые первыми. Фильтр по абоненту необязателен: без Subscriber_MSISDN и SubscriberID отдаётся список всего проекта. Пустой список — законный ответ.

POST /Http/Services/GetSubscriptions

Единственный метод сервиса, чей путь без .aspx, — так он объявлен в спецификации платформы. Элементы списка идут подряд одноимёнными <Subscriptions> без общей обёртки.

Запрос
<?xml version="1.0" encoding="utf-8"?> <Request> <SubscriptionProjectID>2001</SubscriptionProjectID> <Subscriber_MSISDN>79001234567</Subscriber_MSISDN> <Now>20260625120000</Now> <Signature>d2f36558ca5455beb28b4ec090ffbea1cf9425106b5dbeb2f93538603956da53</Signature> </Request>
Ответ
<?xml version="1.0" encoding="utf-8"?> <Response> <StatusName>REQUEST_ACCEPTED</StatusName> <Subscriptions> <SubscriptionID>12345678</SubscriptionID> <SubscriptionProjectID>2001</SubscriptionProjectID> <SubscriptionStatus>Active</SubscriptionStatus> <Country>ru</Country> <OperatorID>22</OperatorID> <PaidUntil>2026-07-25T12:00:00+03:00</PaidUntil> <TrialExists>false</TrialExists> <CreateTime>2026-06-25T12:00:00+03:00</CreateTime> <Active>true</Active> <Approved>true</Approved> <AcceptanceChannel>SMS_PIN</AcceptanceChannel> <Subscriber_MSISDN>79001234567</Subscriber_MSISDN> </Subscriptions> </Response>

Выдача ограничена 50 записями — проект песочницы общий, без предела список рос бы до чистки логов. Печатаются только поля, которые песочница действительно знает: MerchantSubsID, RenewPeriod, ActualRenewCount, ClosedTime и NetworkID она не хранит.

RefundBillingOperation — возврат платежа

Возврат списания по подписке. BillingOperationID — идентификатор биллинговой операции из уведомления о списании.

POST /Http/Services/RefundBillingOperation.aspx

Запрос
<?xml version="1.0" encoding="utf-8"?> <Request> <SubscriptionProjectID>2001</SubscriptionProjectID> <BillingOperationID>3f1b2c4d-0000-4000-8000-000000000003</BillingOperationID> <Now>20260625120000</Now> <Signature>d2f36558ca5455beb28b4ec090ffbea1cf9425106b5dbeb2f93538603956da53</Signature> </Request>
Ответ — идентификатор операции возвращается эхом
<?xml version="1.0" encoding="utf-8"?> <Response> <StatusName>REQUEST_ACCEPTED</StatusName> <BillingOperationID>3f1b2c4d-0000-4000-8000-000000000003</BillingOperationID> </Response>

Состояния у биллинговых операций нет. BillingOperationID рождается в самом уведомлении и нигде не хранится, поэтому проверяется только форма идентификатора (UUID), а возврат считается мгновенным и всегда успешным — как возврат инвойса. Ни статус подписки, ни расписание списаний метод не меняет.