Легковесная, типобезопасная обёртка над iiko Cloud API (iiko Transport) на Go. Повторяет функциональность Python-проекта pyiikocloudapi, сохраняя названия и семантику методов.
go get github.com/kebrick/goiikoapi
ctx := context.Background() cli, err := goiikoapi.NewClient( "<YOUR_API_LOGIN>", goiikoapi.WithTimeout(30*time.Second), ) if err != nil { /* handle */ } // Получить организации и сохранить ids внутри клиента orgs, apiErr, err := cli.Organizations(ctx, nil, nil, nil) if err != nil { /* transport error */ } if apiErr != nil { /* iiko errorDescription */ } fmt.Println("org count:", len(orgs.Organizations))
- goiikoapi.WithBaseURL(url string)
- goiikoapi.WithHTTPClient(hc *http.Client)
- goiikoapi.WithTimeout(d time.Duration)
- goiikoapi.WithDebug(debug bool)
- goiikoapi.WithReturnDict(v bool) — зарезервировано (в Go обычно не требуется)
- goiikoapi.WithWorkingToken(token string) — использовать готовый токен
Клиент автоматически обновляет токен при его протухании и повторяет запрос один раз при 401.
Каждый метод возвращает три значения: (data, apiError, err)
- err — транспортная ошибка (HTTP/JSON/сеть)
- apiError — ошибка iiko (поле errorDescription из ответа) с
StatusCode
Проверяйте сначала err, затем apiError.
orgs, apiErr, err := cli.Organizations(ctx, nil, nil, nil)
// Получаем интерфейсы var dict IDictionaries = cli.GetDictionaries() var menu IMenu = cli.GetMenu() var orders IOrders = cli.GetOrders() // Работаем через интерфейсы orderTypes, _, _ := dict.OrderTypes(ctx, []string{"orgId"}) nomenclature, _, _ := menu.Nomenclature(ctx, "orgId", nil) orderResp, _, _ := orders.OrderCreate(ctx, "orgId", "terminalId", orderData, nil)
type OrderService struct { orders IOrders menu IMenu } func NewOrderService(orders IOrders, menu IMenu) *OrderService { return &OrderService{orders: orders, menu: menu} } func (s *OrderService) CreateOrder(ctx context.Context, orgID string) (*BaseCreatedOrderInfoModel, error) { // Валидация через меню _, _, err := s.menu.Nomenclature(ctx, orgID, nil) if err != nil { return nil, err } // Создание заказа order, _, err := s.orders.OrderCreate(ctx, orgID, "terminalId", orderData, nil) return order, err } // Использование service := NewOrderService(cli.GetOrders(), cli.GetMenu()) order, err := service.CreateOrder(ctx, "orgId")
type MockOrders struct{} func (m *MockOrders) OrderCreate(ctx context.Context, orgID, terminalID string, order map[string]any, settings *int) (*BaseCreatedOrderInfoModel, *CustomErrorModel, error) { return &BaseCreatedOrderInfoModel{ OrderInfo: CreatedOrderInfoModel{ID: "mock-order-id"}, }, nil, nil } func (m *MockOrders) OrderByID(ctx context.Context, orgIDs, orderIDs, posOrderIDs, returnKeys, sourceKeys []string) (*ByIdModel, *CustomErrorModel, error) { return &ByIdModel{}, nil, nil } // Проверяем реализацию интерфейса var _ IOrders = (*MockOrders)(nil) // Используем мок в тестах mockOrders := &MockOrders{} service := NewOrderService(mockOrders, nil) order, err := service.CreateOrder(ctx, "orgId")
orderTypes, _, _ := cli.Dictionaries.OrderTypes(ctx, []string{"orgId"}) payments, _, _ := cli.Dictionaries.PaymentTypes(ctx, []string{"orgId"}) discounts, _, _ := cli.Dictionaries.Discounts(ctx, []string{"orgId"}) causes, _, _ := cli.Dictionaries.CancelCauses(ctx, []string{"orgId"}) removals, _, _ := cli.Dictionaries.RemovalTypes(ctx, []string{"orgId"}) tips, _, _ := cli.Dictionaries.TipsTypes(ctx)
nom, _, _ := cli.Menu.Nomenclature(ctx, "orgId", nil) menu, _, _ := cli.Menu.Menu(ctx) menuByID, _, _ := cli.Menu.MenuByID(ctx, "externalMenuId", []string{"orgId"}, nil)
// Создать заказ на стол (Orders) orderResp, apiErr, err := cli.Orders.OrderCreate(ctx, "orgId", "tgId", map[string]any{ "phone": "+79990000000", // ... остальная структура заказа как в API iiko }, nil) // Доставка deliveryResp, _, _ := cli.Deliveries.DeliveryCreate(ctx, "orgId", map[string]any{/* order */}, nil, nil) // Получить заказы по id byID, _, _ := cli.Orders.OrderByID(ctx, []string{"orgId"}, []string{"orderId"}, nil, nil, nil) // Обновить статус доставки _, _, _ = cli.Deliveries.UpdateOrderDeliveryStatus(ctx, []string{"orgId"}, "orderId", "Delivered", time.Now().Format("2006-01-02 15:04:05.000")) // Подтвердить / отменить подтверждение _, _, _ = cli.Deliveries.Confirm(ctx, []string{"orgId"}, "orderId") _, _, _ = cli.Deliveries.CancelConfirmation(ctx, []string{"orgId"}, "orderId") // По статусам и датам byStatus, _, _ := cli.Deliveries.ByDeliveryDateAndStatus(ctx, []string{"orgId"}, "2024-01-01 00:00:00.000", "2024-01-02 00:00:00.000", []string{"Delivered"}, nil)
regions, _, _ := cli.Address.Regions(ctx, []string{"orgId"}) cities, _, _ := cli.Address.Cities(ctx, []string{"orgId"}) streets, _, _ := cli.Address.StreetsByCity(ctx, "orgId", "cityId") tgs, _, _ := cli.TerminalGroup.TerminalGroups(ctx, []string{"orgId"}, false) alive, _, _ := cli.TerminalGroup.IsAlive(ctx, []string{"orgId"}, []string{"tgId"})
// Получить клиента по телефону cust, _, _ := cli.Customers.CustomerInfo(ctx, "orgId", "+79990000000", goiikoapi.TypeRCIPhone) // Создать/обновить клиента cu, _, _ := cli.Customers.CustomerCreateOrUpdate(ctx, "orgId", goiikoapi.WithCustomerPhone("+79990000000"), goiikoapi.WithCustomerName("Иван"), ) // Программы/карты/кошельки prog, _, _ := cli.Customers.CustomerProgramAdd(ctx, "customerId", "programId", "orgId") _, _, _ = cli.Customers.CustomerCardAdd(ctx, "customerId", "track", "12345", "orgId") _, _, _ = cli.Customers.CustomerCardDelete(ctx, "customerId", "track", "orgId") hold, _, _ := cli.Customers.CustomerWalletHold(ctx, "customerId", "walletId", "orgId", 100, nil, nil) _, _, _ = cli.Customers.CustomerWalletCancelHold(ctx, "orgId", hold.TransactionID) _, _, _ = cli.Customers.CustomerWalletTopup(ctx, "customerId", "walletId", "orgId", 200, nil) _, _, _ = cli.Customers.CustomerWalletChargeoff(ctx, "customerId", "walletId", "orgId", 50, nil)
// Уведомление _, _, _ = cli.Notifications.Send(ctx, "external", "orderId", "Need attention", "orgId", "delivery_attention") // Статус команды (по correlationId) status, _, _ := cli.Commands.Status(ctx, "orgId", "correlationId")
events, err := cli.WebHook.ParseWebhookOrder([]map[string]any{{ "eventType": "DeliveryOrderUpdated", // ... остальные поля webhook }}) // Или глобальная функция events, err := goiikoapi.ParseWebhookOrder([]map[string]any{...})
WithDebug(true)включает подробный лог запросов/ответов (внутренний raw-body доступен черезLastDataRaw())- При 401 клиент автоматически обновит токен и повторит запрос
Имена и структура методов соответствуют pyiikocloudapi и официальной документации iiko Cloud API. Возвращаемые структуры приведены к Go-типам со строгой типизацией и корректными json-тегами.
- Формат времени для полей дат:
"2006-01-02 15:04:05.000"(локальное время терминала) - Для отмены/контекста используйте
context.Contextво всех вызовах