Нэг удаагийн код (Session)
5 минут хүчинтэй 6 оронтой код үүсгэж, хэрэглэгч түүнийг нэг товшилтоор 150073 руу илгээнэ.
Сесс (session) бол нэг удаагийн баталгаажуулалт. Таны сервер session үүсгэхэд 2fa.mn 6 оронтой код олгоно. Хэрэглэгч тэр кодыг 150073 руу илгээхэд session баталгаажиж, таны сервер webhook хүлээн авна.
Бүртгэл, нэвтрэлт, гүйлгээ баталгаажуулах, үйлчилгээ идэвхжүүлэхэд ашиглана.
Код үүсгэх
curl -X POST https://api.2fa.mn/v1/sessions \
-H "Authorization: Bearer $TWOFA_KEY" \
-H "Content-Type: application/json" \
-d '{ "phone": "99112233", "metadata": { "user_id": "u_42" } }'const res = await fetch('https://api.2fa.mn/v1/sessions', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TWOFA_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ phone: '99112233', metadata: { user_id: 'u_42' } }),
});
const session = await res.json(); // session.sms_uri, session.codebody := strings.NewReader(`{"phone": "99112233", "metadata": {"user_id": "u_42"}}`)
req, _ := http.NewRequest("POST", "https://api.2fa.mn/v1/sessions", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("TWOFA_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)<?php
$ch = curl_init('https://api.2fa.mn/v1/sessions');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('TWOFA_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['phone' => '99112233', 'metadata' => ['user_id' => 'u_42']]),
]);
$session = json_decode(curl_exec($ch), true);import os, requests
res = requests.post(
"https://api.2fa.mn/v1/sessions",
headers={"Authorization": f"Bearer {os.environ['TWOFA_KEY']}"},
json={"phone": "99112233", "metadata": {"user_id": "u_42"}},
)
session = res.json() # session["sms_uri"], session["code"]| Талбар | Төрөл | Тайлбар |
|---|---|---|
phone | string, заавал биш | 8 оронтой дугаар. +976, 976 угтвартай ч хүлээн авна. Заасан бол зөвхөн энэ дугаараас ирсэн SMS баталгаажуулна. |
metadata | object, заавал биш | Дурын JSON. Webhook-д өөрчлөгдөлгүй буцаж ирнэ. |
Хариу 201 Created:
{
"id": "ses_8f3k2m",
"mode": "test",
"code": "482913",
"short_code": "150073",
"sms_uri": "sms:150073?body=482913",
"qr_svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 33 33\" shape-rendering=\"crispEdges\">…</svg>",
"status": "pending",
"phone": "99112233",
"metadata": { "user_id": "u_42" },
"expires_at": "2026-12-01T10:05:00Z",
"created_at": "2026-12-01T10:00:00Z"
}qr_svg нь sms_uri-г агуулсан QR кодын бүрэн SVG. Зөвхөн pending төлөвтэй session-д ирнэ. Баталгаажсан эсвэл хугацаа нь дууссан session-д энэ талбар байхгүй. SVG-г 2fa.mn тогтмол тэмдэгтүүдээс үүсгэдэг тул хуудсандаа шууд (inline) оруулж болно.
phone заах уу, үгүй юу
- Заасан үед: хэрэглэгч дугаараа аль хэдийн оруулсан бол (жишээ нь бүртгэлийн маягтад) заана. Өөр дугаараас ирсэн SMS тэр session-ийг баталгаажуулахгүй.
- Заагаагүй үед: хэрэглэгчээс дугаар асуухгүйгээр шууд товч харуулж болно. Аль дугаараас илгээснийг webhook-ийн
phoneталбараас мэднэ. Энэ нь бүртгэлийн урсгалыг богиносгодог.
Зөвлөмж
Дугаарыг мэддэг бол (нэвтрэх, төлбөр батлах) phone-ийг заавал дамжуулна уу. Дугаартай холбосон session-ийг өөр дугаараас баталгаажуулах боломжгүй. Баталгаажсаны дараа дугаарыг хэрэглэгчид буцааж харуулна уу: «Таны дугаар 9911••33 мөн үү?»
Хэрэглэгчид харуулах
Хэрэглэгчид үнийг харуулж, sms_uri руу холбосон товч гаргана. Утсан дээр товчийг дарахад SMS апп 150073 дугаар болон кодтойгоо бэлэн нээгдэнэ.
<p>Үнэ: 150₮</p>
<a href="sms:150073?body=482913">SMS илгээх</a>SMS товч эсвэл QR
- Утсан дээр:
sms_uriруу холбосон SMS товч харуулна. - Компьютер дээр:
qr_svg-г харуулна. Хэрэглэгч утасныхаа камераар уншуулж SMS-ээ илгээнэ. Кодыг болон150073дугаарыг текстээр мөн харуулж, гараар илгээх боломж үлдээнэ үү.
Аль ч хэлбэрт үнийг товч эсвэл QR-ын өмнө харуулж, баталгаажмагц нууна.
<p>Үнэ: 150₮</p>
<div class="qr"><!-- session.qr_svg --></div>
<p>Утасныхаа камераар уншуулна уу</p>SVG-д width, height байхгүй тул хэмжээг түүнийг агуулсан элементийн CSS-ээр заана (жишээ нь .qr svg { width: 200px; height: 200px; }).
Үнийг заавал харуулна
Үйлчилгээний нөхцөлөөр SMS товчийн өмнө 150₮ үнийг харуулж, баталгаажсаны дараа товчийг нуух ёстой. Бэлэн компонентыг Үнийн UI хэсгээс аваарай.
Төлөв
| Төлөв | Утга |
|---|---|
pending | Код олгогдсон, SMS хүлээж байна |
verified | Тохирох SMS ирж, баталгаажсан |
expired | 5 минут өнгөрсөн, SMS ирээгүй |
Session нэг л удаа ашиглагдана. Баталгаажсан эсвэл хугацаа нь дууссан session-д дахин SMS ирвэл юу ч өөрчлөгдөхгүй. Хэрэглэгч дахин оролдохоор бол шинэ session үүсгэнэ.
Төлөв шалгах
Үндсэн суваг нь webhook. Хөтөч дээр төлөв харуулах бол өөрийн серверээр дамжуулан GET /v1/sessions/{id} дуудна.
curl https://api.2fa.mn/v1/sessions/ses_8f3k2m \
-H "Authorization: Bearer sk_test_..."Баталгаажсан session-д verified_phone, verified_at, operator талбарууд нэмэгдэнэ:
{
"id": "ses_8f3k2m",
"mode": "test",
"code": "482913",
"short_code": "150073",
"sms_uri": "sms:150073?body=482913",
"status": "verified",
"phone": "99112233",
"metadata": { "user_id": "u_42" },
"expires_at": "2026-12-01T10:05:00Z",
"created_at": "2026-12-01T10:00:00Z",
"verified_phone": "99112233",
"verified_at": "2026-12-01T10:00:41Z",
"operator": "unitel"
}Алдаа
| Код | Хэзээ |
|---|---|
400 invalid_phone | phone 8 оронтой Монгол дугаар биш |
400 invalid_request | metadata JSON объект биш эсвэл 4 KB-аас их |
429 rate_limited | Session үүсгэх хязгаар хэтэрсэн: Хязгаар |
403 client_suspended | Таны эрх түр хаагдсан |
Бүх кодыг Алдааны кодууд хэсгээс үзнэ үү.
Webhook
Баталгаажихад verification.succeeded, хугацаа дуусахад session.expired үйл явдал ирнэ.
{
"id": "evt_2k9d7x",
"type": "verification.succeeded",
"mode": "test",
"created_at": "2026-12-01T10:00:41Z",
"data": {
"session_id": "ses_8f3k2m",
"phone": "99112233",
"operator": "unitel",
"verified_at": "2026-12-01T10:00:41Z",
"metadata": { "user_id": "u_42" }
}
}Signature-ийг хэрхэн шалгахыг Webhook ба signature хэсгээс үзнэ үү.
Дараагийн алхам
Энэ хуудас тус болсон уу?