Acceptarea Plăților prin QR MIA
Acceptarea plăților prin QR MIA are câteva avantaje semnificative:
- QR poate fi plătit cu aplicația oricărui institut financiar din RM
- Plata ajunge instantaneu în contul comerciantului în regim 24*7
Procesul de plată constă în mai multe etape:
- Comerciantul contactează Bpay pentru generarea codului QR, furnizând toate informațiile necesare despre plată
- Bpay înregistrează codul QR în MIA și trimite comerciantului un identificator unic al acestui cod
- Comerciantul generează QR din identificatorul primit și îl arată cumpărătorului pentru plată (poate fi un pre-șec sau orice alt suport)
- Cumpărătorul scanează codul QR cu aplicația sa (a oricărui institut financiar), aplicația contactează MIA și primește de acolo datele de plată. Cumpărătorul efectuează plata
- Comerciantul contactează BPAY pentru confirmarea faptului plății
Pentru a începe lucrările de integrare, trebuie să contactați Bpay și să obțineți:
- Un identificator unic al comerciantului merchantId
- O cheie secretă secretKey pentru semnarea mesajelor
Unele lucrări pot fi efectuate înainte de a primi aceste date (vezi secțiunea Testare)
În QR se codifică un link de următorul format: „https://mia-qr.bnm.md/1/m/BNM/BNM6bb781617b6a417fac071c4cf316b0c4„,
unde identificatorul unic al codului QR este evidențiat cu caractere aldine
Pentru a obține un astfel de link pentru plată, trebuie să trimiteți un request GET corespunzător către Bpay GET https://qr-test.bpay.md/api/Qr/CreateMerchantQr
Parametrii Request-ului:
Parametru | Obligatoriu | Tip | Descriere | Exemplu |
---|---|---|---|---|
datetime | da | text | Data generării QR în format yyyy-MM-ddTHH:mm:ss | 2024-04-30T00:00:00 |
merchantId | da | text | Identificatorul comerciantului, emis de administratorul sistemului de plăți | qrtest |
pointId | da | text | Identificatorul punctului de vânzare al comerciantului (în cazul în care există mai multe puncte de vânzare). Este desemnat arbitrar de către comerciant (dacă există un singur punct, se folosește „1”). |
1 |
amount | da | decimal | Suma în lei | 10.00 |
description | nu | text | Descrierea produsului/serviciului | descriere test |
getPaid | nu | bool | Indică dacă QR trebuie plătit imediat după crearea sa. Se folosește doar în mediul de testare! |
false |
Header-uri Request-ului:
Header | Obligatoriu | Tip | Descriere | Exemplu |
---|---|---|---|---|
X-TraceReference | da | text (lungime maximă 35) |
Identificator unic al request-ului. Opțiunea preferată – uuid fără cratime |
e3a1b8d93a2b48e583c1c6b7a0d5e2f4 |
X-HMAC-Signature | da | text | Semnătura HMAC SHA 256 a documentului. Asigură că request-ul provine de la un comerciant autorizat |
gdhlgtx41wggqztdwsxwiaoo5qt4fihaf0rggpk99m0= |
Formarea X-HMAC-Signature
Pentru a genera semnătura, utilizați cheia secretă (secretKey) furnizată de Bpay la înregistrarea comerciantului pentru a calcula hash-ul SHA256 al șirului format din parametrii request-ului. Acest șir este format prin concatenarea tuturor parametrilor request-ului (cu excepția getPaid) în ordinea în care sunt enumerați mai sus, adică: {dateTime}{merchantId}{amount}{description}.
Aplicați hash-ul HMAC (Hash-based Message Authentication Code) șirului rezultat, utilizând SecretKey ca cheie HMAC. Rezultatul trebuie prezentat ca un șir Base64.
function calculateHMAC(key, message) {
var key = CryptoJS.enc.Utf8.parse(key);
var message = CryptoJS.enc.Utf8.parse(message);
var hash = CryptoJS.HmacSHA256(message, key);
var hashInBase64 = CryptoJS.enc.Base64.stringify(hash).toLowerCase();
return hashInBase64;
}
public string CalculateHMAC(string key, string message) {
var keyByte = Encoding.UTF8.GetBytes(key);
using var hmacsha256 = new HMACSHA256(keyByte);
var hashmessage = hmacsha256.ComputeHash(Encoding.UTF8.GetBytes(message));
return Convert.ToBase64String(hashmessage).ToLower();
}
Exemplu de Răspuns de Succes
{
"qrHeaderUUID": "f56212dd-7b6e-47a3-95f6-fb900aafc555",
"qrExtensionUUID": "7c39841f-09e8-46da-bd23-6833bc218b7e",
"qrAsText": "https://mia-qr.bnm.md/1/m/BNM/BNMf56212dd7b6e47a395f6fb900aafc555"
}
Pentru a verifica plata, software-ul comerciantului face un request la următorul link:
GET https://qr.bpay.md/api/Qr/GetQrStatus
Parametrii Request-ului:
Parametru | Obligatoriu | Tip | Descriere | Exemplu |
---|---|---|---|---|
uuid | da | string guid fără cratime |
Identificatorul codului QR | e9f42bd72a4949a5a61403a50c50f125 |
datetime | da | text | Data request-ului de verificare a statusului în format yyyy-MM-ddTHH:mm:ss | 2024-04-30T00:00:00 |
merchantId | da | text | Identificatorul comerciantului, emis de administratorul sistemului de plăți | qrtest |
Header-uri Request-ului:
Header | Obligatoriu | Tip | Descriere | Exemplu |
---|---|---|---|---|
X-TraceReference | da | text (lungime maximă 35) |
Identificator unic al request-ului. Opțiunea preferată – uuid fără cratime |
e3a1b8d93a2b48e583c1c6b7a0d5e2f4 |
X-HMAC-Signature | da | text | Semnătura HMAC SHA 256 a documentului. Asigură că request-ul provine de la un comerciant autorizat. Formarea semnăturii HMAC este similară cu semnătura HMAC pentru generarea QR, din șirul {uuid}{dateTime}{merchantId} |
gdhlgtx41wggqztdwsxwiaoo5qt4fihaf0rggpk99m0= |
Informații despre Cheile din Răspuns
Câmp | Tip | Descriere |
---|---|---|
isPaid | boolean | Dacă QR este plătit. true - plătit, false - neplătit |
paymentDetails | object | Informații despre plată. Dacă nu există plată, atunci null |
receipt | string | Numărul chitanței |
state | Integer | Statusul plății. 100 - finalizat |
amount | decimal | Suma plății |
Exemplu de Răspuns de Succes
{
"isPaid": true,
"paymentDetails": {
"receipt": "105468532550586",
"state": 100,
"amount": 10.0000
}
}
Exemplu de Răspuns Nefericit
{
"isPaid": false,
"paymentDetails": null
}
Dezactivarea Verificării Semnăturii HMAC
- În scopuri de testare, puteți dezactiva verificarea HMAC la generarea QR
- Dacă specificați valorile implicite datetime="2024-04-30T00:00:00", merchantId="qrtest", amount=10, description="descriere test", HMAC nu va fi verificat
Plata QR
- Împreună cu generarea QR, puteți plăti acest QR în scopuri de testare
- Pentru aceasta, când apelați https://qr-test.bpay.md/api/Qr/CreateMerchantQr, trebuie să setați parametrul getPaid la true
Colecția pentru Postman (descărcare):
- Conține request-uri pentru testarea atât a generării QR, cât și a verificării plății
- În variabila colecției SecretKey trebuie să specificați cheia secretă obținută la înregistrarea comerciantului (alte variabile ale colecției nu trebuie schimbate)
- În parametrul request-ului merchantId, înlocuiți identificatorul comerciantului cu cel obținut la înregistrarea comerciantului
- Parametrii request-ului amount și description pot fi schimbați după dorință
- Când trimiteți request-ul, parametrul dateTime va fi generat automat, la fel ca și header-urile X-TraceReference și X-HMAC-Signature. Puteți găsi textul real al request-ului trimis către server în consolă
Instrumente Suplimentare:
- Generarea HMAC în format hex https://emn178.github.io/online-tools/sha256.html
- Conversia hex în base64 https://base64.guru/converter/encode/hex