Поддержка: support@haskaplan.ru
Стать клиентом: clients@haskaplan.ru
Хаскаплан помогает бизнесу автоматизировать массовые выплаты и документооборот с физлицами и самозанятыми, например, с клиентами или исполнителями.
Для авторизации необходимо передать три заголовка в каждом запросе:
client-id- Идентификатор клиентаclient-secret- Секретный ключ клиентаrequest-signature- Цифровая подпись запроса для верификации целостности данных
Для получения client-id и client-secret обратитесь к нам на почту clients@haskaplan.ru
Клиент должен сгенерировать пару RSA ключей и передать нам публичный ключ:
# 1. Генерируем приватный ключ (PKCS#8)
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out private.pem
# 2. Извлекаем публичный ключ (в формате PKIX)
openssl rsa -pubout -in private.pem -out public.pemОтправьте содержимое файла public.pem нам на почту clients@haskaplan.ru
Подпись запроса формируется путем подписания тела запроса приватным ключом с использованием алгоритма SHA-256:
Bash/OpenSSL:
echo -n "<request-body>" | openssl dgst -sha256 -sign private.pem | base64 -w 0Пример на Go:
package main
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"fmt"
"os"
)
func signRequest(privateKeyPath string, requestBody []byte) (string, error) {
// Читаем приватный ключ
keyData, err := os.ReadFile(privateKeyPath)
if err != nil {
return "", err
}
// Декодируем PEM
block, _ := pem.Decode(keyData)
if block == nil {
return "", fmt.Errorf("failed to parse PEM block")
}
// Парсим приватный ключ
privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
if err != nil {
return "", err
}
rsaPrivateKey, ok := privateKey.(*rsa.PrivateKey)
if !ok {
return "", fmt.Errorf("not an RSA private key")
}
// Хэшируем тело запроса
hashed := sha256.Sum256(requestBody)
// Подписываем
signature, err := rsa.SignPKCS1v15(rand.Reader, rsaPrivateKey, crypto.SHA256, hashed[:])
if err != nil {
return "", err
}
// Кодируем в base64
return base64.StdEncoding.EncodeToString(signature), nil
}
func main() {
requestBody := []byte(`{"field": "value"}`)
signature, err := signRequest("private.pem", requestBody)
if err != nil {
panic(err)
}
fmt.Println("request-signature:", signature)
}Пример HTTP запроса:
POST /v1/registries HTTP/1.1
Host: client-api.dev.haskaplan.net
Content-Type: multipart/form-data
client-id: your-client-id
client-secret: your-client-secret
request-signature: <base64-encoded-signature>
[request body]
Типы договоров исполнителей agreement_type
ФЛ- Физлицо;СЗ- Самозанятый;ИП- Индивидуальный предприниматель.
Статус реестра
created- В очереди на обработку;processing- В обработке;completed- Реестр успешно начислен;partially_completed- Реестр начислен, часть платежей завершились с ошибкой;failed- Все платежи в реестре завершились с ошибкой.
Статус платежа
pending- Платеж в процессе обработки;processed- Платеж успешно проведен;failed- Ошибка проведения платежа;refunded- Ошибка проведения платежа после отправки в банк.
| Код | Название ошибки | Описание |
|---|---|---|
| 10001 | InvalidQueryParametersErrorCode | Неверные параметры запроса |
| 10004 | NotFoundErrorCode | Ресурс не найден |
| 10005 | EmptyRequestErrorCode | Пустой запрос |
| 10006 | FailedToCreatePaymentsErrorCode | Не удалось создать платежи |
| 10007 | FailedToParseRequestBodyErrorCode | Ошибка при разборе тела запроса |
| 10008 | UnexpectedErrorCode | Неожиданная ошибка |
| 10009 | UnauthorizedErrorCode | Доступ запрещён (неавторизован) |
| 10010 | NothingToUpdateErrorCode | Нет данных для обновления |
| 10011 | InvalidCardNumberErrorCode | Неверный номер карты |
| 10012 | NotImplementedErrorCode | Функция не реализована |
| 10013 | InvalidId | Неверный идентификатор |
| 10015 | InvalidParams | Неверные параметры |
| 10017 | InvalidFile | Неверный файл |
| 10018 | ValidationError | Ошибка валидации |
Если у вас возникнут вопросы или потребуется помощь, пожалуйста, свяжитесь с нашей службой поддержки через support@haskaplan.ru.