# Личный кабинет покупателей

Апи для работы с личным кабинетом покупателей

# /api/customer/account/register

### <span style="color: #000000;">Создание нового аккаунта покупателя  
</span>

**/api/customer/account/register**

Для регистрации необходимо выполнить следующий запрос

```JSON
{
 "email": "test@test.com",
 "phone": "+798585858",
 "firstName": "Ivan",
 "lastName": "Ivanov",
 "middleName": "Ivanocich" 
}
```

Обязательные поля: <span style="text-decoration: underline; color: #ff0000;">email</span>

Также необходимо в **<span style="text-decoration: underline;">Header</span>** добавить **domain**, в котором указать нужный домен магазина.

#### **Успех**

возвращается сгенерированный пароль и jwt token для доступа

```JSON
{
"success": true,
"authToken": {
"success": true,
"access_token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJpdmFuQHRlc3QuY29tIiwiZXhwIjoxNTk5MDU2MDA1fQ.-eEOV2NxHQAmt0habFOB18dr-P_drgS0S4YJmx15RMnTZYcGElwi7oEAgm-8qakr-aroYwyxrdwQ1NS_WVgYqA",
"token_type": "bearer",
"login": "ivan@test.com",
"expires_in": 14400,
"init_state": "completed"
},
"password": "8N9y8Jqb"
}
```

#### **Ошибка**

```JSON
{
"success": false,
"errors": [
  {
"code": 403,
"message": "Данный покупатель уже существует"
}
],
"authToken": null,
"password": null
}
```

# /api/customer/auth

### Авторизация

/api/customer/auth

Для авторизации необходимо выполнить следующий запрос

```JSON
{
"emailLogin": "yura@test.com",
"password": "123456"
}
```

Также необходимо в **<span style="text-decoration: underline;">Header</span>** добавить **domain**, в котором указать нужный домен магазина.

В ответ возвращается

#### **Успех**

```JSON
{
  "success": true,
  "access_token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ3b3c1NkBtYWlsLnJ1IiwiZXhwIjoxNTQ2OTc2NzQ5fQ.4Zdev5PSIk1TmsPFxjxHukYwH1wa_efn19cfLIkT8k2g9xEeVMOnYK4A4pTC6NCpsp2kq8_dvygRxAyyEKNwiQ",
  "token_type": "bearer",
  "login": "wow56@mail.ru",
  "expires_in": 14400
}
```

где access\_token содержит токен для доступа

expires\_in - количество секунд действительности выданного токена.

#### **Ошибка:**

```JSON
{
"success": false,
"errors": [
 {
 "code": 401,
 "message": "Unauthorized"
 }
]
}
```

**Для последующих методов,** использовать ключ токена следующим образом:

в запросе должен быть header

с ключем Authorization

и значением вида "Bearer {access\_token}"

например Bearer

`eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ3b3c1NUBtYWlsLnJ1IiwiZXhwIjoxNTQ2ODA3MjU3fQ.1vSO5DXhewQfjKITK76W8JhEZM_Wx2YgyEbdjfg9GDs0ymtRtmRgFuZen_n8fM00H1Uda_i6M2-Y1PbjN4edZA`

# /api/customer/account/password_reset

### <span style="color: #000000;">Запрос на сброс пароля покупателя  
</span>

<span style="color: #000000;">api/customer/account/password\_reset</span>

<span style="color: #000000;">Для запроса сброса необходимо отправить следующий запрос:</span>

```JSON
{ 
    "email":"test@test.ru"   
}
```

Также необходимо в **<span style="text-decoration: underline;">Header</span>** добавить **domain**, в котором указать нужный домен магазина.

В ответ возвращается

#### **Успех:**

```JSON
{
"success": true
}
```

при этом, по указанному email отправляется письмо со ссылкой вида

[http://localhost:33043/customer\_password\_reset\_confirm/?t=6aaccd91-1045-4200-b105-b4db79490fee](http://localhost:33043/password_reset_confirm/?t=6aaccd91-1045-4200-b105-b4db79490fee)

Где адрес сервера будет взят из текущего адреса, включая домен 3 уровня.

срок действия токена - 1 час

Данная ссылка будет открыта пользователем в браузере GET запросом.

js код должен обработать открытие подобной ссылки и вывести пользователю запрос на ввод нового пароля и подтверждение пароля.

По нажатию кнопки подтверждения на данном экране создания нового пароля следует выполнить POST запрос на адрес

```
/api/customer/password_reset_confirm
```

с передачей токена из ссылки и нового пароля (см следующий метод).

#### **Ошибка:** 

```
{
"success": false,
"errors": [
 {
 "code": 0,
 "message": "Текст ошибки"
 }
]
}
```

# /api/customer/account/password_reset_confirm

### <span style="color: #000000;">Сброс пароля </span>

<span style="color: #000000;">/api/customer/account/password\_reset\_confirm</span>

<span style="color: #000000;">Для сброса необходимо выполнить запрос с передачей временного токена сброса пароля и нового пароля:</span>

```JSON
{ 
    "token":"6aaccd91-1045-4200-b105-b4db79490fee",
    "password": "abcd"
}
```

Также необходимо в **<span style="text-decoration: underline;">Header</span>** добавить **domain**, в котором указать нужный домен магазина, для этого покупателя.

В ответ возвращается

#### **Успех:**

```JSON
{
"success": true
}
```

#### **Ошибка:** 

```JSON
{
"success": false,
"errors": [
 {
 "code": 0,
 "message": "Текст ошибки"
 }
]
}
```

# api/customer/info

### <span style="color: #000000;">Запрос данных покупателя  
</span>

<span style="color: #000000;">api/customer/info</span>

<span style="color: #000000;">Метод возвращает информацию о текущем покупателе.</span>

<table class="relative-table wrapped confluenceTable tablesorter tablesorter-default" id="bkmrk-%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-%D0%A2%D0%B8%D0%BF-%2F-%D1%84%D0%BE%D1%80%D0%BC%D0%B0" role="grid" style="width: 100.4%; height: 521px;"><tbody aria-live="polite" aria-relevant="all"><tr style="height: 29px;"><td style="width: 19.7531%; height: 29px;">**Параметр**</td><td style="width: 18.0247%; height: 29px;">**Тип / формат**</td><td style="width: 62.2222%; height: 29px;">**Описание**</td></tr><tr role="row" style="height: 55px;"><td class="confluenceTd" style="width: 19.7531%; height: 55px;">id

</td><td class="confluenceTd" style="width: 18.0247%; height: 55px;">string

</td><td class="confluenceTd" style="width: 62.2222%; height: 55px;">Идентификатор пользователя

</td></tr><tr role="row" style="height: 122px;"><td class="confluenceTd" style="width: 19.7531%; height: 56px;">emailLogin

</td><td class="confluenceTd" style="width: 18.0247%; height: 56px;">string

</td><td class="confluenceTd" style="width: 62.2222%; height: 56px;">Почта пользователя - является логином

</td></tr><tr role="row" style="height: 111px;"><td class="confluenceTd" style="width: 19.7531%; height: 45px;">firstName

</td><td class="confluenceTd" style="width: 18.0247%; height: 45px;">string</td><td class="confluenceTd" style="width: 62.2222%; height: 45px;">Имя

</td></tr><tr role="row" style="height: 55px;"><td class="confluenceTd" style="width: 19.7531%; height: 55px;">lastName</td><td class="confluenceTd" style="width: 18.0247%; height: 55px;">string</td><td class="confluenceTd" style="width: 62.2222%; height: 55px;">Фамилия</td></tr><tr role="row" style="height: 55px;"><td class="confluenceTd" style="width: 19.7531%; height: 55px;">middleName</td><td class="confluenceTd" style="width: 18.0247%; height: 55px;">string</td><td class="confluenceTd" style="width: 62.2222%; height: 55px;">Отчество</td></tr><tr role="row" style="height: 55px;"><td class="confluenceTd" style="width: 19.7531%; height: 55px;">fullName</td><td class="confluenceTd" style="width: 18.0247%; height: 55px;">string</td><td class="confluenceTd" style="width: 62.2222%; height: 55px;">Имя в формате ФИО</td></tr><tr style="height: 29px;"><td style="width: 19.7531%; height: 29px;">phone</td><td style="width: 18.0247%; height: 29px;">string</td><td style="width: 62.2222%; height: 29px;">Отформатированный телефон</td></tr><tr style="height: 29px;"><td style="width: 19.7531%; height: 29px;">rawPhone</td><td style="width: 18.0247%; height: 29px;">string</td><td style="width: 62.2222%; height: 29px;">Телефон</td></tr><tr style="height: 29px;"><td style="width: 19.7531%; height: 29px;">alternativeRawPhome</td><td style="width: 18.0247%; height: 29px;">string</td><td style="width: 62.2222%; height: 29px;">Дополнительный телефон</td></tr><tr style="height: 29px;"><td style="width: 19.7531%; height: 29px;">alternativePhone</td><td style="width: 18.0247%; height: 29px;">string</td><td style="width: 62.2222%; height: 29px;">Дополнительный отформатированный телефон</td></tr><tr role="row" style="height: 55px;"><td class="confluenceTd" style="width: 19.7531%; height: 55px;">address

</td><td class="confluenceTd" style="width: 18.0247%; height: 55px;">object

</td><td class="confluenceTd" style="width: 62.2222%; height: 55px;">Адрес пользователя

</td></tr><tr><td style="width: 19.7531%;">consentToNewsletter

</td><td style="width: 18.0247%;">boolean

</td><td style="width: 62.2222%;">Согласие на email рассылку

</td></tr></tbody></table>

#### **Пример результата запроса:**

```JSON
{
  "id": "9a5e8591-7ea7-adb6-34db-546f105fc11a",
  "emailLogin": "ivan@test.com",
  "firstName": "Ivan",
  "lastName": "Ivanov",
  "middleName": "Ivanovich",
  "fullName": "Ivanov Ivan Ivanovich",
  "phone": "",
  "rawPhone": "+7985858585",
  "alternativePhone": ""
  "address": {
      "country": "Россия",
      "countryCode": "RU",
      "region": "Московская",
      "area": null,
      "city": "Красногорск",
      "settlement": "Ангелово",
      "street": "мкр МЖК Росинка",
      "house": "74/1",
      "block": "",
      "building": "",
      "flat": "1",
      "fullAddress": "Московская обл, г Красногорск, село Ангелово, мкр МЖК Росинка, д 74/1, кв. 1",
      "fullCity": null,
      "rawData": null,
      "zip": "143442",
      "regionFias": "29251dcf-00a1-4e34-98d4-5c47484a36d4",
      "areaFias": null,
      "cityFias": "63fcf18a-365e-451f-baee-8d09ac50b773",
      "settlementFias": "2b627d06-2257-4c20-83b1-5efa10ef57b4"
      },
  "consentToNewsletter": true
}
```

#### **Ошибка:** 

```
{
"success": false,
"errors": [
 {
 "code": 0,
 "message": "Покупатель не найден"
 }
]
}
```

# (POST) api/customer/info

### Редактировать информацию о покупателе

api/customer/info

Производит редактирование профиля текущего покупателя.

#### **пример запроса:**

```JSON
{
  "rawPhone": "+7985858585",
  "firstName": "Oleg",
  "lastName": "Pushkin",
  "middleName": "Ivanov"
  "password": "123456",
  "rawAlternativePhone": "+85645545454",
   "address": {
      "country": "Россия",
      "countryCode": "RU",
      "region": "Московская",
      "area": null,
      "city": "Красногорск",
      "settlement": "Ангелово",
      "street": "мкр МЖК Росинка",
      "house": "74/1",
      "block": "",
      "building": "",
      "flat": "1",
      "fullAddress": "Московская обл, г Красногорск, село Ангелово, мкр МЖК Росинка, д 74/1, кв. 1",
      "fullCity": null,
      "rawData": null,
      "zip": "143442",
      "regionFias": "29251dcf-00a1-4e34-98d4-5c47484a36d4",
      "areaFias": null,
      "cityFias": "63fcf18a-365e-451f-baee-8d09ac50b773",
      "settlementFias": "2b627d06-2257-4c20-83b1-5efa10ef57b4"
      },
  "consentToNewsletter": true
}
```

В ответ возвращается

#### **Успех:**

В случае успеха вернется обновленный покупатель:

```JSON
{
  "id": "9a5e8591-7ea7-adb6-34db-546f105fc11a",
  "emailLogin": "ivan@test.com",
  "rawPhone": "+7985858585",
  "firstName": "Oleg",
  "lastName": "Pushkin",
  "middleName": "Ivanov"
  "rawAlternativePhone": "+85645545454",
  "fullName": "Pushkin Oleg Ivanov",
  "phone": "",
  "alternativePhone": ""
  "address": {
      "country": "Россия",
      "countryCode": "RU",
      "region": "Московская",
      "area": null,
      "city": "Красногорск",
      "settlement": "Ангелово",
      "street": "мкр МЖК Росинка",
      "house": "74/1",
      "block": "",
      "building": "",
      "flat": "1",
      "fullAddress": "Московская обл, г Красногорск, село Ангелово, мкр МЖК Росинка, д 74/1, кв. 1",
      "fullCity": null,
      "rawData": null,
      "zip": "143442",
      "regionFias": "29251dcf-00a1-4e34-98d4-5c47484a36d4",
      "areaFias": null,
      "cityFias": "63fcf18a-365e-451f-baee-8d09ac50b773",
      "settlementFias": "2b627d06-2257-4c20-83b1-5efa10ef57b4"
      },
  "consentToNewsletter": true
}
```

#### **ошибка:** 

```JSON
{
"success": false,
"errors": [
 {
 "code": 0,
 "message": "Покупатель не найден"
 }
]
}
```

# api/customer/orders

### Запрос списка заказов

api/customer/orders

Метод возвращает список заказов текущего покупателя.

#### **Пейджинация**

Для пейджинации используются параметры page и size: size - записей на странице, page - номер страницы.

Пример: `api/customer/orders?page=0&size=200`

Если параметры не переданы, то дефолтные значения page=0&amp;size=10

Также, для отображение пейджинации следует анализировать параметр recordsTotal, возвращающий общее количество записей (с учетом примененной фильтрации, если она есть).

#### **Пример результата запроса**

```JSON
{
"success": true,
"recordsTotal": 2,
"orders": [
  {
"id": "20412212",
"date": "2020-06-03 09:22:06",
"updateTs": "2020-06-10 16:09:43.226",
"status": "ORDER_INFO_DONE",
"totalOrderSum": 1208,
"insuranceSum": 1059,
"insuranceSumAutoCalculation": true,
"paymentStatus": "PAID",
"confirmStatus": "APPROVED",
"paymentMethodCode": "online",
"paymentMethodType": "ONLINE",
"needCustomerPayment": true,
"shortUrl": "http://r.kak2c.ru/o6meazi",
"delivery": {
"code": "b26909d5-8424-7de9-42ca-53f668f70a8a",
"type": "COURIER",
"title": "BERU",
"pickupPointId": null,
"logoUrl": "https://storage.yandexcloud.net/lk-kak2c/delivery_beru_middle.svg",
"trackingNumber": "20412212",
"trackingURL": null,
"desiredDeliveryDate": null,
"desiredDeliveryTimeFrom": "09:00",
"desiredDeliveryTimeTo": "18:00",
"actualDeliveryDate": null,
"pvzComment": null,
"deliveryComment": null,
"address": {
"country": "Россия",
"countryCode": "RU",
"region": "Москва",
"area": null,
"city": "Москва",
"settlement": null,
"street": null,
"house": null,
"block": null,
"building": null,
"flat": null,
"fullAddress": "Москва",
"fullCity": null,
"rawData": null,
"zip": null,
"regionFias": null,
"areaFias": null,
"cityFias": null,
"settlementFias": null
},
"receiver": {
"name": "Покупатель на Беру",
"surname": null,
"patronymic": null,
"phone": "+70000000000",
"rawPhone": "+70000000000",
"alternativePhone": "",
"email": null,
"post": null,
"personType": "CUSTOMER",
"address": {
"country": "Россия",
"countryCode": "RU",
"region": "Москва",
"area": null,
"city": "Москва",
"settlement": null,
"street": null,
"house": null,
"block": null,
"building": null,
"flat": null,
"fullAddress": "Москва",
"fullCity": null,
"rawData": null,
"zip": null,
"regionFias": null,
"areaFias": null,
"cityFias": null,
"settlementFias": null
}
},
"deliveryServices": null
},
"items": [
  {
"num": 1,
"variantId": "83491",
"variantExtId": "NL290-83491",
"productId": "1052",
"productExtId": "83490",
"name": "CC крем «Абсолютное совершенство» SPF 20, 30 мл, Оттенок: Light ",
"article": "NL290-83491",
"quantity": 1,
"vatRate": "VAT_20",
"price": 1059,
"skuType": "SKU",
"itemDimensions": {
"height": 0,
"width": 0,
"depth": 0
},
"itemWeight": 0,
"barcode": "6412600834918"
},
  {
"num": 2,
"variantId": "delivery",
"name": "Доставка",
"article": "",
"quantity": 1,
"vatRate": "VAT_20",
"price": 149,
"skuType": "SERVICE",
"barcode": ""
}
],
"customerPaymentInProcess": false,
"customer": {
"id": "9a5e8591-7ea7-adb6-34db-546f105fc11a",
"emailLogin": "yura@test.com",
"firstName": "Yura",
"lastName": "Dan",
"middleName": "Dan",
"fullName": "Dan Yura Dan",
"phone": "",
"rawPhone": "+7985858585",
"alternativePhone": "",
"address": {
"country": "Россия",
"countryCode": "RU",
"region": "Московская",
"area": null,
"city": "Красногорск",
"settlement": "Ангелово",
"street": "мкр МЖК Росинка",
"house": "74/1",
"block": "",
"building": "",
"flat": "1",
"fullAddress": "Московская обл, г Красногорск, село Ангелово, мкр МЖК Росинка, д 74/1, кв. 1",
"fullCity": null,
"rawData": null,
"zip": "143442",
"regionFias": "29251dcf-00a1-4e34-98d4-5c47484a36d4",
"areaFias": null,
"cityFias": "63fcf18a-365e-451f-baee-8d09ac50b773",
"settlementFias": "2b627d06-2257-4c20-83b1-5efa10ef57b4"
}
},
"c": "f132f0d9-ced0-1134-573c-5dba550e3792"
},
  {
"id": "19918626",
"date": "2020-05-25 21:19:24",
"updateTs": "2020-06-05 17:38:27.352",
"status": "ORDER_INFO_DONE",
"totalOrderSum": 579,
"insuranceSum": 579,
"insuranceSumAutoCalculation": true,
"paymentStatus": "NOT_PAID",
"confirmStatus": "APPROVED",
"paymentMethodCode": "cod-cash",
"paymentMethodType": "COD_CASH",
"needCustomerPayment": false,
"shortUrl": "http://r.kak2c.ru/jc2dyb2",
"delivery": {
"code": "b26909d5-8424-7de9-42ca-53f668f70a8a",
"type": "COURIER",
"title": "BERU",
"pickupPointId": null,
"logoUrl": "https://storage.yandexcloud.net/lk-kak2c/delivery_beru_middle.svg",
"trackingNumber": "19918626",
"trackingURL": null,
"desiredDeliveryDate": null,
"desiredDeliveryTimeFrom": "09:00",
"desiredDeliveryTimeTo": "18:00",
"actualDeliveryDate": null,
"pvzComment": null,
"deliveryComment": null,
"address": {
"country": "Россия",
"countryCode": "RU",
"region": "Москва",
"area": null,
"city": "Москва",
"settlement": null,
"street": null,
"house": null,
"block": null,
"building": null,
"flat": null,
"fullAddress": "Москва",
"fullCity": null,
"rawData": null,
"zip": null,
"regionFias": null,
"areaFias": null,
"cityFias": null,
"settlementFias": null
},
"receiver": {
"name": "Покупатель на Беру",
"surname": null,
"patronymic": null,
"phone": "+70000000000",
"rawPhone": "+70000000000",
"alternativePhone": "",
"email": null,
"post": null,
"personType": "CUSTOMER",
"address": {
"country": "Россия",
"countryCode": "RU",
"region": "Москва",
"area": null,
"city": "Москва",
"settlement": null,
"street": null,
"house": null,
"block": null,
"building": null,
"flat": null,
"fullAddress": "Москва",
"fullCity": null,
"rawData": null,
"zip": null,
"regionFias": null,
"areaFias": null,
"cityFias": null,
"settlementFias": null
}
},
"deliveryServices": null
},
"items": [
  {
"num": 1,
"variantId": "84981",
"variantExtId": "NL110-84981",
"productId": "1019",
"productExtId": "NL110-84981",
"name": "Тушь с черникой для чувствительных глаз, 9 мл, Оттенок: Черный ",
"article": "NL110-84981",
"quantity": 1,
"vatRate": "NO_VAT",
"price": 579,
"img": "https://storage.yandexcloud.net/images-k2c/eef378d6-853f-4c75-a3b4-b2bdec352fe7.jpg",
"skuType": "SKU",
"itemDimensions": {
"height": 0,
"width": 0,
"depth": 0
},
"itemWeight": 0,
"barcode": "6412600849813"
},
  {
"num": 2,
"variantId": "delivery",
"name": "Доставка",
"article": "",
"quantity": 1,
"vatRate": "NO_VAT",
"price": 0,
"skuType": "SERVICE",
"barcode": ""
}
],
"customerPaymentInProcess": false,
"customer": {
"id": "9a5e8591-7ea7-adb6-34db-546f105fc11a",
"emailLogin": "yura@test.com",
"firstName": "Yura",
"lastName": "Dan",
"middleName": "Dan",
"fullName": "Dan Yura Dan",
"phone": "",
"rawPhone": "+7985858585",
"alternativePhone": "",
"address": {
"country": "Россия",
"countryCode": "RU",
"region": "Московская",
"area": null,
"city": "Красногорск",
"settlement": "Ангелово",
"street": "мкр МЖК Росинка",
"house": "74/1",
"block": "",
"building": "",
"flat": "1",
"fullAddress": "Московская обл, г Красногорск, село Ангелово, мкр МЖК Росинка, д 74/1, кв. 1",
"fullCity": null,
"rawData": null,
"zip": "143442",
"regionFias": "29251dcf-00a1-4e34-98d4-5c47484a36d4",
"areaFias": null,
"cityFias": "63fcf18a-365e-451f-baee-8d09ac50b773",
"settlementFias": "2b627d06-2257-4c20-83b1-5efa10ef57b4"
}
},
"c": "326a2701-e668-c8b2-dda6-ab259921aaee"
}
],
}
```

#### **Ошибка:** 

<div id="bkmrk-"></div>```JSON
{
  "success": false,
  "errors": [{"code": 0,"message": "Текст ошибки"}]
}
```

<div id="bkmrk--0"></div><div id="bkmrk--1"></div><div id="bkmrk--2"></div>

# api/customer/orders/cancelled

### Отменить заказ покупателя

api/customer/orders/cancelled

Производит отмену заказа.

#### **пример тела запроса:**

```JSON
{ 
"orderId":"1029" 
}
```

В ответ возвращается

#### **успех:**

```JSON
{
"success": true

}
```

#### **ошибка:** 

```JSON
{
"success": false,
"errors": [
 {
 "code": 0,
 "message": "Текст ошибки"
 }
]
}
```