Методы управления подпиской
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 |
ClientIP | WAP-активация, если передан без номера. Вместе с номером — проверка соответствия стран |
<?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><?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>Sandbox
<?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
Sandbox
curl
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>
XMLCreateSubscription — WAP-активация
Номер абонента партнёр не знает — его определяет шлюз оператора. Вместо Subscriber_MSISDN передаётся ClientIP, в ответе приходит AuthorizeUrl; к нему можно дописать ?ReturnUrl= (относительный путь к базовому адресу возврата проекта) и ?ext_lp_template=. После подтверждения абонент возвращается на адрес проекта с параметрами результата.
<?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 |
Sandbox
CreateSubscription — цикл списаний
В бою подписка тарифицируется по расписанию проекта — раз в 30 дней. Ждать этого в тесте нельзя, поэтому цикл сжимается блоком <TestInfo>: период задаётся в секундах, исход списания выбирается заранее. Без BillingPeriodSeconds списаний нет вовсе. Отсчёт первого списания идёт от активации подписки, а не от её создания.
| Поле | Значение |
|---|---|
BillingPeriodSeconds | 1…86400. Включает цикл списаний. Задаёт и период между списаниями, и интервал повторной попытки после отказа |
MaxIterations | 1…100, по умолчанию 3 — сколько успешных списаний пройдёт до закрытия подписки |
ExpectedBillingResult | Success (по умолчанию) или Failed — исход каждой попытки списания |
BillingAmount | Сумма в CustomerPrice уведомлений, по умолчанию 10. |
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 метод неприменим: они активируются по факту оплаты.
Sandbox
В песочнице 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
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>
XMLGetSubscriptionStatus — статус подписки
Отдаёт фактический статус подписки. Подписка ищется по 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><?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>Sandbox
Выдача ограничена 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>Sandbox
Состояния у биллинговых операций нет. BillingOperationID рождается в самом уведомлении и нигде не хранится, поэтому проверяется только форма идентификатора (UUID), а возврат считается мгновенным и всегда успешным — как возврат инвойса. Ни статус подписки, ни расписание списаний метод не меняет.