Module for working with Суперсервис "Поступление в ВУЗ онлайн"
Модуль предназначен для подготовки сообщений с дальнейшей отправкой в сервис. Подготовка включает в себя добавление основных полей, таких как ОГРН КПП, формирования подписанного токена для отправки данных, валидация приходящего токена. Подпись и валидация проводится согласно требованиям сервиса, а именно использования инфраструктуры открытого ключа ГОСТ. Версия Golang 1.14
go get "github.com/ftomza/go-sspvo"
Пример получения справочника уровней бюджета:
restyClient := resty.New()
restyClient.SetHostURL("http://localhost:7777")
restyClient.SetDebug(false)
sspvoClient, err := client.NewRestyClient(restyClient,
client.SetAPIBase("/api"),
client.SetOGRN("test"),
client.SetKPP("test"),
)
if err != nil {
log.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
data, err := sspvoClient.Send(ctx, message.NewCLSMessage(message.CLSLevelBudget)).Data()
if err != nil {
log.Fatal(err, string(data))
}
log.Print(string(data))
// Output:
//
// <?xml version="1.0" encoding="UTF-8"?>
// <LevelBudget>
// <Budget><ID>1</ID><Code></Code><Name>Федеральный</Name><Actual>true</Actual></Budget>
// <Budget><ID>2</ID><Code></Code><Name>Региональный</Name><Actual>true</Actual></Budget>
// <Budget><ID>3</ID><Code></Code><Name>Муниципальный</Name><Actual>true</Actual></Budget>
// </LevelBudget>
Пример получения количества токенов ожидающий получения и подтверждения.
restyClient := resty.New()
restyClient.SetHostURL("http://localhost:7777")
restyClient.SetDebug(false)
sspvoClient, err := client.NewRestyClient(restyClient,
client.SetAPIBase("/api"),
client.SetOGRN("test"),
client.SetKPP("test"),
)
if err != nil {
log.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
data, err := sspvoClient.Send(ctx, message.NewInfoAllMessage()).Data()
if err != nil {
log.Fatal(err, string(data))
}
log.Print(string(data))
// Output:
//
// {"Messages": 2}
Пример отправки данных, получения информации и ее подтверждения.
var (
key = `
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
`
cert = `
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
`
)
restyClient := resty.New()
restyClient.SetHostURL("http://localhost:7777")
sspvoClient, err := client.NewRestyClient(restyClient,
client.SetAPIBase("/api"),
client.SetOGRN("test"),
client.SetKPP("test"),
)
if err != nil {
log.Fatal(err)
}
gostCrypto, _ := crypto.NewGostCrypto(crypto.SetCert(cert), crypto.SetKey(key))
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
data, err := sspvoClient.Send(ctx, message.NewActionMessage(
gostCrypto,
message.ActionAdd,
message.DatatypeSubdivisionOrg,
[]byte(`
<?xml version="1.0" encoding="utf-8"?>
<PackageData>
<SubdivisionOrg>
<UID>TEST69</UID>
<Name>Подвал</Name>
</SubdivisionOrg>
</PackageData>
`))).Data()
cancel()
if err != nil {
log.Fatal(err, string(data))
}
log.Println("Add SubdivisionOrg:", string(data))
newMessage := struct {
IDJWT string `json:"IDJWT"`
}{}
err = json.Unmarshal(data, &newMessage)
if err != nil {
log.Fatal(err, string(data))
}
idJWT, _ := strconv.Atoi(newMessage.IDJWT)
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
data, err = sspvoClient.Send(ctx, message.NewInfoMessage(gostCrypto, idJWT)).Data()
cancel()
if err != nil {
log.Fatal(err, string(data))
}
log.Println("Info:", string(data))
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
data, err = sspvoClient.Send(ctx, message.NewConfirmMessage(gostCrypto, idJWT)).Data()
cancel()
if err != nil {
log.Fatal(err, string(data))
}
log.Println("Confirm:", string(data))
// Output:
//
// 2020/10/01 21:09:06 Add SubdivisionOrg: {"IDJWT":"1405161"}
// 2020/10/01 21:09:07 Info: {"ResponseToken":".."}
// 2020/10/01 21:09:08 Confirm: {"IDJWT":"1405161","Result":"true"}
Данный крипто модуль поддерживает инфраструктуру открытых ключей ГОСТ Р 34.10-2001 и хэш функцию ГОСТ Р 34.11-2012 Стрибог (Streebog). Конструктор:
NewGostCrypto(opts ...Option) (sspvo.Crypto, error)
.
Поддерживаемы опции:
SetCert(cert string) Option
- задать сертификат с открытым ключом в формате PEMSetKey(key string) Option
- необязательный, задать закрытый ключ в формате PEM
Если будет передан только сертификат, то крипто модуль будет поддерживать только проверку подписи.
Все сообщен возвращают данные в виде массива байт.
Используется для получения справочников из сервиса, например, уровни бюджета, олимпиады, достижения и так далее. Результат выполнения будет XML ответ содержащий перечисление запрашиваемого справочника:
<?xml version="1.0" encoding="UTF-8"?>
<LevelBudget>
<Budget><ID>1</ID><Code></Code><Name>Федеральный</Name><Actual>true</Actual></Budget>
<Budget><ID>2</ID><Code></Code><Name>Региональный</Name><Actual>true</Actual></Budget>
<Budget><ID>3</ID><Code></Code><Name>Муниципальный</Name><Actual>true</Actual></Budget>
</LevelBudget>
Конструктор:
NewCLSMessage(cls CLS) *CLSMessage
.
Параметры:
cls CLS
- принимает значение допустимого класса справочника, классы перечислены в виде констант начинающихся наCLS*
Простое сообщение для получения количества токенов ожидающих обработку(получения информации по ним и подтверждения полученной информации). Результатом выполнения будет JSON ответ содержащий количество токенов:
{"Messages": 2}
Конструктор:
NewInfoAllMessage() *InfoAllMessage
.
Сообщение с поддержкой подписи отправляемых сообщений и проверкой подписи входящего сообщения.
Используется для отправки данных в сервис, например, создание конкурсной группы, направлений и так далее. Результатом выполнения будет JSON ответ содержащий номер токена:
{"IDJWT":"1405161"}
Конструктор:
NewActionMessage(crypto sspvo.Crypto, action Action, datatype Datatype, data []byte) *ActionMessage
.
Параметры:
crypto sspvo.Crypto
- принимает значение крипто модуля.action Action
- принимает значение допустимого действия сервиса, действия перечислены в виде констант начинающихся наAction*
.datatype Datatype
- принимает значение допустимого типа данных сервиса, типы данных перечислены в виде констант начинающихся наDatatype*
data []byte
- принимает массив байтов для передачи в сообщении полезной нагрузки Payload, может содержать пустое илиnil
значение.
Используется для отправки подтверждения полученной информации по номеру токена. Результатом выполнения будет JSON ответ содержащий результат подтверждения:
{"IDJWT":"1405161","Result":"true"}
Конструктор:
NewConfirmMessage(crypto sspvo.Crypto, idJWT int) *ConfirmMessage
.
Параметры:
crypto sspvo.Crypto
- принимает значение крипто модуля.idJWT int
- принимает значение идентификатора токена.
Используется для получения информации по номеру токена. Результатом выполнения будет JSON ответ содержащий токен:
{"ResponseToken": "[headers in base64].[payload in base64].[sign in base64]"}
Конструктор:
NewInfoMessage(crypto sspvo.Crypto, idJWT int) *InfoMessage
.
Параметры:
crypto sspvo.Crypto
- принимает значение крипто модуля.idJWT int
- принимает значение идентификатора токена.
Если в качестве параметра идентификатора токена передать 0
, то будет возвращен первый ожидающий обработки токен.
В данном решении для отправки данных сообщения используется REST клиент resty.v2. Конструктор:
NewRestyClient(rest *resty.Client, opts ...Option) (sspvo.Client, error)
Параметры:
rest *resty.Client
- REST клиент
Опции:
SetAPIBase(apiBase string) Option
- задать базовый путь сервисаSetOGRN(ogrn string) Option
- задать ОГРН для аутентификации на сервисеSetKPP(kpp string) Option
- задать КПП для аутентификации на сервисе