Самостоятельная интеграция
Устанавливать официальный пакет не требуется. Материалы ниже помогут правильно подписать запрос, запустить пример и выполнить тест из готовой коллекции ещё до написания собственного кода.
OpenAPI для участников
Интеграция напрямую через аккаунт участника без создания организации или профиля вьетнамского юридического лица.
Администратор открывает OpenAPI для каждого участника. В основном боковом меню откройте «Ключи API», выберите рабочий или тестовый режим и создайте ключ. Секрет показывается один раз. Лимит ключей общий для двух режимов. Отключение доступа блокирует оба режима, но ключи можно отозвать.
Рабочий режим использует реальный кошелёк участника в VND без кредита. Тест использует отдельный виртуальный кошелёк и имитацию eSIM. На тестовой странице можно пополнить баланс, создать или сбросить примеры. Тестовые заказы не попадают в историю реальных покупок.
Индивидуальная цена пакета участника окончательна, дополнительная скидка уровня не применяется. Без индивидуальной цены действуют текущая цена каталога и скидка уровня. Сервер фиксирует цену при оформлении заказа.
Счета-фактуры следуют процессу участника: по умолчанию продажа потребителю. При создании заказа можно передать invoice_buyer с корректными данными физического лица по действующим правилам проверки. Для доступа к OpenAPI профиль вьетнамского юридического лица не требуется.
Рабочий режим: https://api.tongkhoesim.com и tke_member_live_. Тест: https://api-testing.tongkhoesim.com и tke_member_test_. Оба используют HMAC-SHA256 и X-TKE-Key, X-TKE-Timestamp, X-TKE-Nonce, X-TKE-Signature. Подписывайте точный метод, путь/параметры и хеш исходного тела; не помещайте секрет в код браузера.
POST создания заказов, смены тарифа, отмены и запросов возврата требуют Idempotency-Key. При повторе одного намерения сохраняйте ключ и тело. Защита от дублей действует в пределах ключа API, поэтому не меняйте ключ API для повтора ожидающей операции. Для создания примеров и сброса тестовых данных участника также нужен Idempotency-Key; reset должен содержать тело {reason}.
Добавьте lpa в include для получения кодов установки; обычное окно отмены закрывается, когда коды действительно возвращены. qr лишь добавляет QR-изображение вместе с lpa и игнорируется в методах списка. Запрашивайте коды только перед передачей клиенту; иначе опускайте include. Запросы возврата по-прежнему подчиняются бизнес-условиям и не дают свободной отмены после раскрытия кодов.
Эндпоинты API участников
- Путь API:
GET /v1/catalog/packages - Необходимое право:
catalog:read - Путь API:
GET /v1/catalog/packages/{code} - Необходимое право:
catalog:read - Путь API:
GET /v1/orders - Необходимое право:
orders:read - Путь API:
POST /v1/orders - Необходимое право:
orders:write - Путь API:
GET /v1/orders/{id} - Необходимое право:
orders:read - Путь API:
POST /v1/orders/{id}/resend - Необходимое право:
orders:write - Путь API:
GET /v1/esims - Необходимое право:
esims:read - Путь API:
GET /v1/esims/{id} - Необходимое право:
esims:read - Путь API:
GET /v1/esims/{id}/usage - Необходимое право:
esims:read - Путь API:
GET /v1/esims/{id}/plan-options - Необходимое право:
esims:read - Путь API:
POST /v1/esims/{id}/change-plan - Необходимое право:
esims:write - Путь API:
POST /v1/esims/{id}/cancel - Необходимое право:
esims:write - Путь API:
GET /v1/esims/{id}/refund-requests - Необходимое право:
esims:read - Путь API:
POST /v1/esims/{id}/refund-requests - Необходимое право:
esims:write - Путь API:
GET /v1/wallet/balance - Необходимое право:
wallet:read
Тестовый режим
GET /v1/testmode/statusesims:readPOST /v1/testmode/seedorders:writePOST /v1/testmode/resetorders:writePOST /v1/testmode/esims/{id}/simulateesims:write
Консоль принимает тестовые ключи партнёров tke_test_ и участников tke_member_test_ только на api-testing. Все рабочие ключи блокируются. Секрет хранится лишь в памяти страницы, не сохраняется в хранилище или журналах.
Подпись запросов
Полная формула HMAC-SHA256, примеры на 5 языках (bash/Node/Python/PHP/Go) и серверные тестовые векторы находятся на странице подписи HMAC.
#!/usr/bin/env bash
# Yeu cau: openssl. Ky POST /v1/orders.
KEY_ID="tke_test_ab12cd34..."
SECRET="tke_secret_test_0123456789abcdef"
METHOD="POST"
PATH_Q="/v1/orders"
BODY='{"items":[{"package_code":"THAY-BANG-MA-GOI-CUA-BAN","quantity":2}]}'
TS="$(date +%s000)" # epoch milliseconds
NONCE="$(uuidgen)"
BODY_HASH="$(printf '%s' "$BODY" | openssl dgst -sha256 -hex | awk '{print $NF}')"
SIGNING="$METHOD"$'
'"$PATH_Q"$'
'"$TS"$'
'"$NONCE"$'
'"$BODY_HASH"
SIG="$(printf '%s' "$SIGNING" | openssl dgst -sha256 -hmac "$SECRET" -hex | awk '{print $NF}')"
curl -sS "https://api.tongkhoesim.com$PATH_Q" -H "X-TKE-Key: $KEY_ID" -H "X-TKE-Timestamp: $TS" -H "X-TKE-Nonce: $NONCE" -H "X-TKE-Signature: $SIG" -H "Idempotency-Key: $(uuidgen)" -H "Content-Type: application/json" --data-raw "$BODY"Готовые файлы примеров
Два файла в корне репозитория (examples/sign.mjs, examples/sign.py) запускаются стандартной средой языка без установки пакетов. Оба читают /hmac-test-vectors.json, вычисляют подпись каждого вектора, сравнивают с ожидаемым результатом и выводят PASS/FAIL.
node examples/sign.mjs # стандартный Node (node:crypto), без установки пакетов
python examples/sign.py # стандартный Python (hmac/hashlib), без установки пакетовГотовые коллекции запросов
При сборке из openapi.json создаются две коллекции: для Postman и редакторов с поддержкой .http (VS Code REST Client, JetBrains HTTP Client). По одному запросу на метод с 4 заголовками подписи: добавьте свой ключ и вычислите подпись.
- Откройте tongkhoesim.http в VS Code (расширение REST Client) или JetBrains HTTP Client.
- Укажите @key_id и @secret вашего ключа tke_test_ в начале файла. @base_url уже указывает на api-testing.tongkhoesim.com.
- Вычислите timestamp/nonce/signature по примерам страницы HMAC или через examples/sign.* и вставьте в соответствующие переменные.
- Отправляйте запросы прямо из редактора без Postman и дополнительного кода.
Нужен SDK?
Создайте клиент из openapi.json с openapi-generator — автоматически созданный клиент соответствует спецификации:
npx @openapitools/openapi-generator-cli generate \
-i https://docs.tongkhoesim.com/openapi.json \
-g typescript-fetch \
-o ./tke-sdk