Агуулгыг алгасах

NFC-г турших

Терминалын NFC sticker-ийг бэлдэж, iPhone уншиж байгааг шалгах — бодит sticker-ээр эсвэл sticker-гүйгээр Android утсаар tag дуурайж. Хугацаа: 20–40 минут. Хэрэгтэй: бүртгэсэн терминал (url-тай), NTAG213/215/216 sticker эсвэл NFC-тэй Android утас, NFC-тэй iPhone (XS ба түүнээс хойшхи).

Утсан дээр юу болох вэ

Gerege App (iOS build 122+) суусан iPhone sticker уншихад https://geregeapp.mn/pay/t/<code> нь Universal Link тул апп нээгдэж, терминалын нээлттэй сагсыг claim хийгээд төлөх цонхыг (машины нэр, байршил, дүн) харуулна → Face ID. Апп дотроос мөн QR товчны «NFC уншуулах»-аар уншуулна. Апп суугаагүй бол Safari-д нийтийн терминалын хуудас нээгдэнэ (GET /api/v1/miniapp/pay/t/{code}-ийн мэдээлэл, доор). Test сагсыг зөвхөн апп-ын эзэн ба тест хэрэглэгчид авна. Утасгүй бол simulate-tap.

Юу бичих вэ

Sticker-т зөвхөн терминалын URL бичигдэнэ — дүн, secret, сагс хэзээ ч биш:

https://geregeapp.mn/pay/t/<code>

<code> нь серверийн олгосон 10 тэмдэгт (23456789abcdefghjkmnpqrstuvwxyz), хэзээ ч өөрчлөгдөхгүй; терминалын объектын url талбарт бэлэн байна (Объектууд). Ижил URL-ийг sticker-ийн QR-д бичнэ — QR ба NFC хоёр нэг замаар орно.

NDEF мессеж нь нэг URI record (TNF 0x01 well-known, type U, URI prefix 0x04 = https://):

D1 01 <payload length> 55 04  67 65 72 65 67 65 61 70 70 2E 6D 6E 2F 70 61 79 2F 74 2F <code bytes>
                              g  e  r  e  g  e  a  p  p  .  m  n  /  p  a  y  /  t  /

Бодит sticker бичих

  1. NTAG213 (144 байт — энэ URL-д хангалттай), NTAG215 эсвэл NTAG216 sticker; төмөр гадаргуу дээр наах бол anti-metal (ferrite давхаргатай) sticker.
  2. Gerege App-аар (iOS build 122+): Тохиргоо → Хэтэвч → «Худалдагч ба байгууллага» → «Sticker бичих» — танай байгууллагын гишүүн (консолын miniapp.read) терминалаа жагсаалтаас сонгоход апп канон URL-ийг бичиж, дахин уншиж таарсны дараа буцаалтгүй түгжинэ. Эсвэл ямар ч NFC бичих апп (жишээ нь NFC Tools) → «Write» → «URL/URI» → дээрх URL. QR sticker-ийг консолын sticker-ийн PDF-ээр (POST /terminals/print-sheet) хэвлэнэ — Терминал ба NFC sticker.
  3. Бичсний дараа tag-ийг түгжинэ («Lock tag» / read-only) — түгжээгүй tag-ийг хэн ч өөр холбоосоор дарж бичнэ. Түгжих нь буцаагдахгүй; URL-ээ эхлээд шалгаад түгжинэ.
  4. iPhone-оор шалгах: дэлгэц асаалттай, түгжээ тайлсан эсвэл түгжээтэй ч болно, Camera / Wallet / Apple Pay эсвэл өөр NFC уншигч идэвхгүй үед утасны дээд хэсгийг sticker-т ойртуулна (background tag reading) — холбоосын мэдэгдэл гарна.

Sticker-гүй: Android-оор tag дуурайх (HCE)

Android-ийн Host Card Emulation нь утсыг NFC Forum Type 4 Tag болгож, iPhone background tag reading-аар NDEF URI уншина — sticker хэвлэхээс өмнө URL, урсгалыг турших хялбар арга. Нээлттэй эхийн «HCE NDEF emulator» жишээ апп-ууд байдаг; өөрөө бичих бол HostApduService нь дараах APDU-уудад хариулна:

Уншигчийн команд APDU Хариу
NDEF Tag Application сонгох 00 A4 04 00 07 D2 76 00 00 85 01 01 00 90 00
Capability Container (CC) файл сонгох 00 A4 00 0C 02 E1 03 90 00
CC унших 00 B0 00 00 0F 00 0F 20 00 3B 00 34 04 06 E1 04 00 FF 00 FF 90 00
NDEF файл сонгох 00 A4 00 0C 02 E1 04 90 00
NDEF урт (NLEN) унших 00 B0 00 00 02 2 байт урт + 90 00
NDEF мессеж унших 00 B0 <offset> <length> мессежийн хэсэг + 90 00
бусад 6A 82 (олдсонгүй)

res/xml/apduservice.xml-д AID D2760000850101, android:category="other", requireDeviceUnlock="false"-ийг бүртгэнэ. CC дахь E1 04 нь NDEF файлын id, 00 FF нь хамгийн их хэмжээ, сүүлийн 00 унших эрх (нээлттэй), FF бичих эрх (хориотой). NDEF файл = 2 байт NLEN + дээрх NDEF мессеж. Android утсыг асаалттай, түгжээг тайлж, iPhone-ийн дээд хэсэгт нурууг нь хүргэнэ.

Tip

Зарим Android утас HCE-г зөвхөн дэлгэц асаалттай үед, зарим нь Google Wallet-ийн «default payment» сонголттой зөрчилдөхөд ажиллуулдаггүй — тест хийхэд Wallet-ийн NFC төлбөрийг түр унтраана.

Терминалын нийтийн мэдээлэл

Gerege App-гүй утсанд tag уншуулсны дараа нээгдэх хуудас ба Gerege App-ын төлөх цонх нь энэ мэдээллийг харуулна — нэвтрэлтгүй, хувийн мэдээлэлгүй:

curl -s https://geregeapp.mn/api/v1/miniapp/pay/t/7k2m9x4q3p
{"object": "terminal",
 "merchant": {"name": "Vending.mn", "icon_url": "https://…"},
 "terminal": {"code": "7k2m9x4q3p", "label": "Машин №7", "location": "СБД, 1-р хороо"},
 "pending": {"object": "payment", "merchant": {"name": "Vending.mn", "icon_url": "https://…"},
             "terminal": {"code": "7k2m9x4q3p", "label": "Машин №7", "location": "СБД, 1-р хороо"},
             "amount": 3500, "currency": "MNT", "status": "requires_confirmation",
             "claimed": false, "expires_at": "…", "livemode": true}}

pending нь claim хийгдээгүй нээлттэй live сагс, эсвэл null. 404 — танигдаагүй, идэвхгүй терминал эсвэл түдгэлзсэн худалдагч. Минутад 120 хүсэлт.

Sticker-ийн аюулгүй байдал

  • Sticker secret барихгүй — зөвхөн терминалыг нэрлэнэ. Дүн нь таны сервер үүсгэсэн intent-ээс.
  • Хуурамч sticker-ийг дээгүүр нь наах эрсдэл: Gerege App-ын төлөх цонх Face ID-аас өмнө бүртгэлтэй нэр (label), байршил (location), худалдагчийн батлагдсан нэрийг харуулна — тиймээс бүртгэлдээ машиныг тодорхой нэрлэнэ («Машин №7», «СБД, 1-р хороо»). Машинуудаа тогтмол шалгаж, давхар наалт, ховхорсон ирмэг хайна.
  • Алсаас claim: код хэвлэгдсэн тул хэн ч claim хийж чадна — баталгаажаагүй claim 90 секундэд дуусна, нэг хүн нэг дор 3-аас олон баталгаажаагүй claim барихгүй, та POST /payment-intents/{id}/unclaim-аар суллана.
  • Tag бүрийг түгжинэ. Уншилт бүрт шинэ гарын үсэгтэй URL өгдөг NTAG 424 DNA (SUN) дэмжлэг — «удахгүй».