B2C

Выполнение перевода по номеру телефона от ЮЛ к ФЛ

Песочница
POST https://sandbox.alfabank.ru/api/b2cpay/jp/v1/payments
Пром
POST https://baas.alfabank.ru/api/b2cpay/jp/v1/payments
Scope

b2c_sbp_payments

Описание
Параметры запроса
HEADERS
Атрибут
Описание
Authorization
stringrequired
Accept
stringrequired

application/json

Content-Type
stringrequired

application/json

BODY
Атрибут
Описание
signedBody
stringrequired

ЭЦП для верификации платежа

objectrequired

Контекст клиента

b2cClientId
stringoptional

Идентификатор клиента, от имени которого отправляется платёж (указывается при использовании API провайдером)

partnerId
integerrequired

Идентификатор партнёра

powerOfAttorney
stringrequired

Номер машиночитаемой доверенности

inn
stringrequired

ИНН клиента

account
stringrequired

Номер счёта отправителя

total
numberrequired

Общая сумма платежей в пакете

nameCheck
booleanrequired

Флаг необходимости проверки совпадения переданного ФИО получателя и зарегистрированного ФИО получателя в НСПК

array of objectsrequired

Получатели платежей. Могут быть разные внутри пакета

objectoptional

ФИО получателя

last
stringoptional

Фамилия

first
stringoptional

Имя

middle
stringoptional

Отчество

amount
numberrequired

Сумма платежа

nspkBankId
stringrequired

ID банка получателя

nspkId
stringrequired

Референс операции НСПК

phone
stringrequired

Телефон получателя

sequence
stringrequired

Идентификатор платежа внутри пакета. Формируется потребителем сервиса B2C-переводы

paymentDescription
stringrequired

Описание платежа

ric
integerrequired

Код вида дохода

Пример запроса
Язык
1curl --location 'https://baas.alfabank.ru/api/b2cpay/jp/v1/payments' \
2--header 'Authorization: Bearer {access-token}' \
3--header 'Content-Type: application/json' \
4--header 'Accept: application/json' \
5--data '{
6  "signedBody": "CORRECT_SIGNED_BODY",
7  "client": {
8    "b2cClientId": "1b00587d-09a1-4928-af4f-1ce5eb769724",
9    "partnerId": 100
10  },
11  "powerOfAttorney": "7f796b70-e9bc-4064-b695-868708b30b4b",
12  "inn": "773509414997",
13  "account": "40802810802790005307",
14  "total": 100.53,
15  "nameCheck": true,
16  "payments": [
17    {
18      "name": {
19        "last": "Иванов",
20        "first": "Василий",
21        "middle": "Семенович"
22      },
23      "amount": 100.53,
24      "nspkBankId": "100000000025",
25      "nspkId": "A4243065558023050000030011330701",
26      "phone": "0079612894744",
27      "sequence": "payment1020",
28      "paymentDescription": "Перевод СБП.Платёж по договору ХХХ",
29      "ric": 1
30    }
31  ]
32}'
Параметры ответа
Пример ответа 200 (OK)
1{
2  "client": {
3    "b2cClientId": "1b00587d-09a1-4928-af4f-1ce5eb769724",
4    "partnerId": 100
5  },
6  "payPackage": 5593,
7  "payments": [
8    {
9      "amount": 100.53,
10      "feeAmount": 1.05,
11      "transactionId": "3390",
12      "phone": "0079612894744",
13      "sequence": "payment1020",
14      "createDate": "2026-04-16T09:28:03Z",
15      "paymentDescription": "Перевод СБП.Платёж по договору ХХХ",
16      "name": {
17        "last": "Иванов",
18        "first": "Василий",
19        "middle": "Семенович"
20      },
21      "nameCheck": true,
22      "ric": 1
23    }
24  ]
25}
BODY
атрибут
описание
objectrequired

Контекст клиента

b2cClientId
stringoptional

Идентификатор клиента, от имени которого отправляется платёж (указывается при использовании API провайдером)

partnerId
integerrequired

Идентификатор партнёра

payPackage
stringrequired

Уникальный идентификатор пакета платежей

array of objectsrequired

Получатели платежей. Могут быть разные внутри пакета

amount
numberrequired

Сумма платежа

feeAmount
numberrequired

Сумма комиссии платежа

transactionId
stringrequired

Уникальный идентификатор транзакции, формируемый сервисом B2C-переводы

phone
stringrequired

Телефон получателя

sequence
stringrequired

Идентификатор платежа внутри пакета. Формируется потребителем сервиса B2C-переводы

createDate
stringrequired

Дата/Время создания платежа (в формате 2023-03-28T19:47:21.644Z)

paymentDescription
stringrequired

Описание платежа

objectoptional

ФИО получателя

last
stringoptional

Фамилия

first
stringoptional

Имя

middle
stringoptional

Отчество

nameCheck
booleanoptional

Флаг необходимости проверки совпадения переданного ФИО получателя и зарегистрированного ФИО получателя в НСПК

ric
integeroptional

Код вида дохода

Пример ответа 200 (OK)
1{
2  "client": {
3    "b2cClientId": "1b00587d-09a1-4928-af4f-1ce5eb769724",
4    "partnerId": 100
5  },
6  "payPackage": 5593,
7  "payments": [
8    {
9      "amount": 100.53,
10      "feeAmount": 1.05,
11      "transactionId": "3390",
12      "phone": "0079612894744",
13      "sequence": "payment1020",
14      "createDate": "2026-04-16T09:28:03Z",
15      "paymentDescription": "Перевод СБП.Платёж по договору ХХХ",
16      "name": {
17        "last": "Иванов",
18        "first": "Василий",
19        "middle": "Семенович"
20      },
21      "nameCheck": true,
22      "ric": 1
23    }
24  ]
25}
BODY
атрибут
описание
error
stringrequired

Код ошибки. Принимает возможные значения:

  • •
    invalid_request - неверные входные параметры запроса
error_description
stringoptional

Описание ошибки

Пример ошибки 400 (Bad Request)
1{
2  "error": "invalid_request",
3  "error_description": "Authorization header is not present in request headers"
4}
BODY
атрибут
описание
error
stringrequired

Код ошибки. Принимает возможные значения:

  • •
    invalid_token - предоставленный токен просрочен, отозван, имеет неправильный формат или недействителен по другим причинам. Необходимо получить новый токен доступа
error_description
stringoptional

Описание ошибки

Пример ошибки 401 (Unauthorized)
1{
2  "error": "invalid_token",
3  "error_description": "The access token provided is expired, revoked, malformed, or invalid for other reasons"
4}
BODY
атрибут
описание
error
stringrequired

Код ошибки. Принимает возможные значения:

  • •
    insufficient_scope - при запросе токена доступа не были переданы все необходимые scopes. Необходимо повторно отправить запрос на получение токена доступа с указанием всех доступных scopes
error_description
stringoptional

Описание ошибки

Пример ошибки 403 (Forbidden)
1{
2  "error": "insufficient_scope",
3  "error_description": "The request requires higher privileges than provided by the access token"
4}
BODY
атрибут
описание
error
stringrequired

Код ошибки. Принимает возможные значения:

  • •
    unknown_endpoint - эндпоинт не найден или неактивен
error_description
stringoptional

Описание ошибки

Пример ошибки 404 (Not Found)
1{
2  "error": "unknown_endpoint",
3  "error_description": "Endpoint is not found or not active"
4}
BODY
атрибут
описание
error
stringrequired

Код ошибки. Принимает возможные значения:

  • •
    internal_error - внутренняя ошибка сервиса при выполнении обработки запроса
error_description
stringoptional

Описание ошибки

Пример ошибки 500 (Internal Server Error)
1{
2  "error": "internal_error",
3  "error_description": "Internal server error"
4}
Процесс формирования электронной цифровой подписи (ЭЦП)

ЭЦП формируется на основании приватного ключа и тела запроса (payload).

1

Преобразуйте JSON тела запроса

Тело запроса в формате JSON необходимо сжать, преобразовав его в одну строку без лишних пробелов, при этом сохранив исходный порядок полей.

Пример JSON
1{"Query":"client/payment/phonepay","ClientID":"106901723533","PartnerID":100,"Legal":{"LegalAcc":"40802810802790005308","LegalAccType":"LegalAcct","LegalInn":"773509414998"},"Message":"Тестовая выплата себе","Request":{"RfioCheck":true,"Recipients":[{"Amount":30600,"RbankId":"100000000025","Rfio":"ВЕКЛЕНКО ЕВГЕНИЙ СЕРГЕЕВИЧ","Ric":"","Rid":"0079175844178","RidType":"MTEL","Sequence":"vekes43","Ustrd":"Ustrd Тестовая выплата Векленко Е.С."}]},"Total":30600}
2

Закодируйте payload в base64

Сформируйте payload, закодировав тело запроса в base64.

Пример закодированного в base64 payload
1eyJRdWVyeSI6ImNsaWVudC9wYXltZW50L3Bob25lcGF5IiwiQ2xpZW50SUQiOiIxMDY5MDE3MjM1MzMiLCJQYXJ0bmVySUQiOjEwMCwiTGVnYWwiOnsiTGVnYWxBY2MiOiI0MDgwMjgxMDgwMjc5MDAwNTMwOCIsIkxlZ2FsQWNjVHlwZSI6IkxlZ2FsQWNjdCIsIkxlZ2FsSW5uIjoiNzczNTA5NDE0OTk4In0sIk1lc3NhZ2UiOiLQotC10YHRgtC+0LLQsNGPINCy0YvQv9C70LDRgtCwINGB0LXQsdC1IiwiUmVxdWVzdCI6eyJSZmlvQ2hlY2siOnRydWUsIlJlY2lwaWVudHMiOlt7IkFtb3VudCI6MzA2MDAsIlJiYW5rSWQiOiIxMDAwMDAwMDAwMjUiLCJSZmlvIjoi0JLQldCa0JvQldCd0JrQniDQldCS0JPQldCd0JjQmSDQodCV0KDQk9CV0JXQktCY0KciLCJSaWMiOiIiLCJSaWQiOiIwMDc5MTc1ODQ0MTc4IiwiUmlkVHlwZSI6Ik1URUwiLCJTZXF1ZW5jZSI6InZla2VzNDMiLCJVc3RyZCI6IlVzdHJkINCi0LXRgdGC0L7QstCw0Y8g0LLRi9C/0LvQsNGC0LAg0JLQtdC60LvQtdC90LrQviDQlS7QoS4ifV19LCJUb3RhbCI6MzA2MDB9
3

Сформируйте ЭЦП с использованием приватного ключа

Используя полученный payload и приватный ключ, на основе которого был сформирован клиентский сертификат, создайте ЭЦП.

Пример кода для формирования ЭЦП на Java
1import java.security.KeyFactory;
2import java.security.Signature;
3import java.security.spec.PKCS8EncodedKeySpec;
4import java.util.Base64;
5
6public class Main {
7    public static void main(String[] args) throws Exception {
8        String input = "{\"Query\":\"client/payment/phonepay\",\"ClientID\":\"103914556680\",\"Legal\":{\"LegalAcc\":\"40702810232410005084\",\"LegalAccType\":\"LegalAcct\",\"LegalInn\":\"7805756145\"},\"Message\":\"Выплата #20220304001\",\"Request\":{\"RfioCheck\":false,\"Recipients\":[{\"Amount\":1000,\"RbankID\":\"100000000004\",\"Rfio\":\"Семибратов Олег Маликович\",\"Ric\":null,\"RID\":\"0079992190000\",\"RidType\":\"MTEL\",\"Sequence\":\"test_01\",\"Ustrd\":\"Комментарий\"}]},\"Total\":1000}";
9
10        String strPk = "-----BEGIN PRIVATE KEY-----\n"
11                + "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDDTBWwgKD4N5Px"
12                + "0PsZalC4pGPk4iJbTWS7UtR99KOegIBD1NVSC1NJivDK4JrW/DVxWvIJ5ffatc2K"
13                + "UYqDETSuhw+5vlAKdbQ4zGD29XArJmQLE4oDm1CRmWhYX07bI1EnagaRjhWiTbIQ"
14                + "UOpa9zHnkcqgyclVnY5TyxIyRDl4Cinq3p1I+NrlSrS2GoUVqYiQGOF994oRnEEn"
15                + "hm9h8J74y0zNwPjJl/JHJAcaL3yLiJmMDZFwVTdcZRtF/1yqo81yM3TGe/HmrA8c"
16                + "mHP4r+995NNxuXjeNx4vbT0gBMo8aVe5aHG6Md2izm5+xkuFnioN9F9kyXPOZRy0"
17                + "RX7NToODAgMBAAECggEATTzHCzIj92cLpMRQuoF4gT3KoBfrHI7kOs2ManAZUbNi"
18                + "hvEimLsP6nL/vkzMECBZBobAWLfRqXbjXkPXcvSYEDosNvqUbz6T0y7JXoI9JWOe"
19                + "h17n43tGhv7T7Lds2XADRYJCLMizt6fgt2E4/lbrLrlTGPoVHT4drvgOL0EaNWWm"
20                + "oM4SaBm89gUh2aiiov+CmkUIjWcx3EXD7bWxRkF2FTpCURjx4RlWu9j7x/sZVtNz"
21                + "fxkgZT534r2566Lr+m1O6Tgx+SMYSbJLEIfpjLe7sv+qOGKrZLc/KzOTJTcD4GlW"
22                + "JHWQKaIKIZ6hOXvz4ptkQNrmrya6KtcviwOMrlfNcQKBgQDWi9KLGWoI7wjRbhyh"
23                + "WOcn/SU/cx/D/T6aGF0vgAt2fbh3Rdmfa0DUjYCUfQOkX5sN2cCKwg2aX05NFfOL"
24                + "sikbs29KPhUR7FyCArIMpakwtorWBVsP35jEjNNftmCZz2B3R9HB4RbexoyTPDZf"
25                + "BWHhCHDGL8I+2fOjmgskSqPBSwKBgQDpCCSfe7y3tiKtkpPWkK1X5PagoCoqGTqd"
26                + "/M29cDlnqqCpTvDe5OvOE2cadnb8Ilv3bbWZHMY0WbV2OF+8BKohPZW+IVrwe/MT"
27                + "bdge65UgeVmQJP/NH4CcosL4HzeXaxOyRWb0mXJZcey1hOdcT+KdMLROXoHV6doJ"
28                + "SKiQM9MbqQKBgBVcVHkO7bS3/9vCJ82UqWcc2CGKF8aOpzX2aQi6qemBOOV/Kdyq"
29                + "dAj1kbC3Ba7O6gQmAvqNuYb+KDCal+X3tgoRAmqU5cokC03ScOG7eK3l7srCO7/H"
30                + "1lDzaHQmF1YZBJS7rNGt1HYXtJVQMGWjhow+J+RDiwZw8sX+J0/UspsjAoGBAIHg"
31                + "Zfj1D9McEevHW9okPFhWZhZT7ewUr5TKByjj2Tqr4Gs8cgboc3whWD9pcxtHUxZt"
32                + "8N5rKRSYQwimlsTFnMR1/HVBRdvuWSWk/OUOy8iTmZU66c67FgU2uY9sZqFfrlSX"
33                + "VbBRrWeolRL+BaxvYY/WS0e6aIZ+lWTDOB9WovwxAoGAfa4NtAKYo/T2feqN6V2F"
34                + "kUkyjHuUyAGjEljxUKadCzU1HLlhA+1R7jw7VomgshngacaaVHGvIttKY1S6zEqt"
35                + "3QHzTvTq8SYApkcPYzSUgSRxYY2TevayRwWcvj0oKTcyCyTQUKL0sE4BK/Je+PaT"
36                + "dJEB5HZt/yAGSM0BdlXP8gE=\n"
37                + "-----END PRIVATE KEY-----\n";
38
39        String base64Signature = signSHA256RSA(input, strPk);
40        System.out.println("Signature=" + base64Signature);
41    }
42
43    // Create base64 encoded signature using SHA256/RSA.
44    private static String signSHA256RSA(String input, String strPk) throws Exception {
45        // Remove markers and new line characters in private key
46        String realPK = strPk.replaceAll("-----END PRIVATE KEY-----", "")
47                             .replaceAll("-----BEGIN PRIVATE KEY-----", "")
48                             .replaceAll("\n", "");
49
50        byte[] b1 = Base64.getDecoder().decode(realPK);
51        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(b1);
52        KeyFactory kf = KeyFactory.getInstance("RSA");
53
54        Signature privateSignature = Signature.getInstance("SHA256withRSA");
55        privateSignature.initSign(kf.generatePrivate(spec));
56        privateSignature.update(input.getBytes("UTF-8"));
57        byte[] s = privateSignature.sign();
58        return Base64.getEncoder().encodeToString(s);
59    }
60}