real 2transaction - nicepayments/nicepay-manual GitHub Wiki

์šด์˜ ์ธ์ฆ & ์Šน์ธ ์„œ๋น„์Šค ์—ฐ๋™ํ•˜๊ธฐ

2 Transaction ์—ฐ๋™ํ•˜๊ธฐ

๊ฐ€๋งน์  ์ž…์žฅ์—์„œ๋Š” ๊ณ ๊ฐ์˜ ๊ฒฐ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๋‹จ๊ณ„์˜ ํŠธ๋žœ์žญ์…˜์„ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ์งธ, ๊ณ ๊ฐ์˜ ๊ฒฐ์ œ ์ˆ˜๋‹จ์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜๋Š” '์ธ์ฆ' ๋‹จ๊ณ„, ๊ทธ๋ฆฌ๊ณ  ๋‘˜์งธ, ์‹ค์ œ ๊ธˆ์•ก์„ ์ด์ฒดํ•˜๋Š” '์Šน์ธ' ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ด ๋‘ ๋‹จ๊ณ„๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฑฐ์น˜๋ฉด ๊ณ ๊ฐ์˜ ๊ฒฐ์ œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉฐ, ๊ฐ€๋งน์ ์€ ํŒ๋งค๋œ ์ƒํ’ˆ์— ๋Œ€ํ•œ ๊ธˆ์•ก์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ 2 Transaction ๊ฒฐ์ œ ๋ฐฉ์‹์ด๋ผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ์ œ ํ๋ฆ„

sequenceDiagram
    actor Customer as ๊ณ ๊ฐ
    participant Merchant as ๊ฐ€๋งน์  ์„œ๋ฒ„
    participant PayWindow as NICEPAY ๊ฒฐ์ œ์ฐฝ
    participant NICEPAY as NICEPAY ์„œ๋ฒ„
    participant CardCo as ์นด๋“œ์‚ฌ/์€ํ–‰

    Customer->>Merchant: 1. ์ƒํ’ˆ ๊ตฌ๋งค ์š”์ฒญ
    Merchant->>PayWindow: 2. NICEPAY ๊ฒฐ์ œ ํŽ˜์ด์ง€ ํ˜ธ์ถœ<br/>(AUTHNICE.requestPay ํ˜ธ์ถœ)
    PayWindow->>Customer: 3. ๊ฒฐ์ œ ํŽ˜์ด์ง€ ์ œ๊ณต

    Note over Customer,PayWindow: ๊ฒฐ์ œ์ฐฝ ํ˜ธ์ถœ ํŒŒ๋ผ๋ฏธํ„ฐ<br/>clientId: R2_xxx (์šด์˜) or S2_xxx (์ƒŒ๋“œ๋ฐ•์Šค)<br/>orderId, amount, goodsName, returnUrl

    PayWindow->>Customer: 4. ๊ฒฐ์ œ์ฐฝ ์˜คํ”ˆ
    Customer->>PayWindow: 5. ๊ฒฐ์ œ ์ •๋ณด ์ž…๋ ฅ<br/>(์นด๋“œ๋ฒˆํ˜ธ, ์œ ํšจ๊ธฐ๊ฐ„ ๋“ฑ)

    rect rgb(255, 250, 240)
        Note over PayWindow,CardCo: ๐Ÿ” Step 1: ์ธ์ฆ (Authentication)
        PayWindow->>NICEPAY: 6. ์ธ์ฆ ์š”์ฒญ
        NICEPAY->>CardCo: 7. ๊ฒฐ์ œ์ˆ˜๋‹จ ์œ ํšจ์„ฑ ํ™•์ธ
        CardCo-->>NICEPAY: 8. ์ธ์ฆ ๊ฒฐ๊ณผ
    end

    alt ์ธ์ฆ ์„ฑ๊ณต (authResultCode: 0000)
        NICEPAY->>Merchant: 9. returnUrl๋กœ ์ธ์ฆ ๊ฒฐ๊ณผ ์ „๋‹ฌ<br/>(tid, authToken, signature)

        Note over Merchant: signature ๊ฒ€์ฆ<br/>hex(sha256(authToken+clientId+amount+secretKey))

        Merchant->>Merchant: 10. ์ฃผ๋ฌธ ๊ฒ€์ฆ ๋ฐ ์žฌ๊ณ  ํ™•์ธ

        rect rgb(240, 255, 240)
            Note over Merchant,CardCo: ๐Ÿ’ณ Step 2: ์Šน์ธ (Authorization)
            Merchant->>NICEPAY: 11. ์Šน์ธ API ํ˜ธ์ถœ<br/>POST /v1/payments/{tid}<br/>Header: Authorization Basic base64(clientId:secretKey)<br/>Body: {"amount": 1004}

            NICEPAY->>CardCo: 12. ์Šน์ธ ์š”์ฒญ (์‹ค์ œ ๊ฒฐ์ œ ์ฒญ๊ตฌ)
            CardCo-->>NICEPAY: 13. ์Šน์ธ ๊ฒฐ๊ณผ

            NICEPAY-->>Merchant: 14. ์Šน์ธ ์‘๋‹ต<br/>(tid, orderId, status: paid, approveNo)
        end

        Merchant->>Merchant: 15. signature ๊ฒ€์ฆ ๋ฐ DB ์ €์žฅ<br/>hex(sha256(tid+amount+ediDate+secretKey))
        Merchant->>Customer: 16. ๊ฒฐ์ œ ์™„๋ฃŒ ํŽ˜์ด์ง€

    else ์ธ์ฆ ์‹คํŒจ
        NICEPAY->>Merchant: 9. returnUrl๋กœ ์‹คํŒจ ๊ฒฐ๊ณผ
        Merchant->>Customer: ๊ฒฐ์ œ ์‹คํŒจ ์•ˆ๋‚ด
    end

    Note over Merchant,NICEPAY: โœ… ๊ตฌ๊ฐ„๋ณ„ ์ œ์–ด ๊ฐ€๋Šฅ<br/>โœ… ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์œ ์—ฐ<br/>โœ… ์ถ”๊ฐ€ ๊ฒ€์ฆ ๊ฐ€๋Šฅ
Loading

๋‹จ๊ณ„๋ณ„ ์ƒ์„ธ ์„ค๋ช…

Step 1: ์ธ์ฆ (Authentication)

๋ชฉ์ : ๊ฒฐ์ œ์ˆ˜๋‹จ์˜ ์œ ํšจ์„ฑ๋งŒ ํ™•์ธ (์‹ค์ œ ๊ฒฐ์ œ X)

์ธ์ฆ ์‘๋‹ต ๋ฐ์ดํ„ฐ:

authResultCode: 0000
authResultMsg: ์ธ์ฆ ์„ฑ๊ณต
tid: ORD20231215XXXXXXXXXX (30์ž)
authToken: NICEUNTxxxxxxxxxxxxxx (40์ž)
signature: hex(sha256(authToken + clientId + amount + secretKey))

์ฃผ์š” ํฌ์ธํŠธ:

  • โš ๏ธ ์ธ์ฆ ๋‹จ๊ณ„์—์„œ๋Š” ์‹ค์ œ ๊ฒฐ์ œ ๋ฐœ์ƒ ์•ˆ ํ•จ
  • ์ƒŒ๋“œ๋ฐ•์Šค: tid๋กœ ์Šน์ธ ์‹œ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜
  • ์šด์˜: tid๋กœ ์Šน์ธ ์‹œ ์‹ค์ œ ์นด๋“œ ์ฒญ๊ตฌ

Step 2: ์Šน์ธ (Authorization)

๋ชฉ์ : ์‹ค์ œ ๊ฒฐ์ œ ๊ธˆ์•ก ์ฒญ๊ตฌ

์Šน์ธ ์š”์ฒญ:

curl -X POST 'https://api.nicepay.co.kr/v1/payments/{tid}' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Basic {base64(clientId:secretKey)}' \
  -d '{"amount": 1004}'

์Šน์ธ ์‘๋‹ต:

{
  "resultCode": "0000",
  "tid": "ORD20231215XXXXXXXXXX",
  "status": "paid",
  "approveNo": "12345678",
  "paidAt": "2023-12-15T14:30:00+09:00"
}

API ํ‚ค ์ค€๋น„

๊ฐ€๋งน์  ํ…Œ์ŠคํŠธ ์ƒ์ ์˜ Server ์Šน์ธ & basic ์ธ์ฆ์œผ๋กœ ๋ฐœ๊ธ‰ ๋ฐ›์€ clientId ๋ฐ secretKey๋กœ ์•„๋ž˜ ์—ฐ๋™์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ(๊ฒฐ์ œ์ฐฝ) ์š”์ฒญ

๊ฒฐ์ œ์ฐฝ JS SDK ์‚ฝ์ž…

<script src="https://pay.nicepay.co.kr/v1/js/"></script> // (1)
  • (1): https://pay.nicepay.co.kr/v1/js/
    • ๊ฐ€๋งน์ ์ด ๊ฒฐ์ œ์ฐฝ์„ ์ผ๊ด€๋˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •์˜ํ•œ JS SDK

๊ฒฐ์ œ์ฐฝ JS ํ˜ธ์ถœ ์ฝ”๋“œ

<script src="https://pay.nicepay.co.kr/v1/js/"></script>
<script>
    function serverAuth() {
        AUTHNICE.requestPay({                               // (1) ๋‚˜์ด์ŠคํŽ˜์ด๋จผ์ธ  ๊ฒฐ์ œ์ฐฝ ํ˜ธ์ถœ ํ•จ์ˆ˜
            clientId: 'R2_xxx',                             // (2) ๊ฐ€๋งน์  ์šด์˜ ํ™˜๊ฒฝ 2Transaction(Server ์Šน์ธ & basic ์ธ์ฆ)
            method: 'card',                                 // (3) ๊ณ ๊ฐ ๊ฒฐ์ œ ์ˆ˜๋‹จ
            orderId: 'your-unique-orderid',                 // (4) ๊ฐ€๋งน์  ๊ณ ์œ  ์ฃผ๋ฌธ์ •๋ณด
            amount: 1004,                                   // (5) ๊ฐ€๋งน์  ์ƒํ’ˆ ๊ธˆ์•ก
            goodsName: '๋‚˜์ด์ŠคํŽ˜์ด-์ƒํ’ˆ',                   // (6) ๊ฐ€๋งน์  ์ƒํ’ˆ ๋ช…
            returnUrl: 'http://localhost:4567/serverAuth'   // (7) ๊ฐ€๋งน์  ์ธ์ฆ ๊ฒฐ๊ณผ ์‘๋‹ต๋ฐ›์„ URL
        });
    }
</script>
  • (1): AUTHNICE.requestPay
    • ๋‚˜์ด์ŠคํŽ˜์ด๋จผ์ธ  ๊ฒฐ์ œ์ฐฝ ํ˜ธ์ถœ ํ•จ์ˆ˜
  • (2): clientId: 'R2_xxx'
    • ๊ฐ€๋งน์  ํ…Œ์ŠคํŠธ ์ƒ์ ์˜ key ์ •๋ณด์—์„œ ๋ฐœ๊ธ‰ ๋ฐ›์€ clientId
  • (3): method: 'card'
  • (4): orderId: 'your-unique-orderid'
    • ๊ฐ€๋งน์  ๊ณ ์œ  ์ฃผ๋ฌธ์ •๋ณด
    • ๋‚˜์ด์ŠคํŽ˜์ด๋จผ์ธ ์—์„œ ๊ฐ€๋งน์ ์ด ์š”์ฒญํ•œ ๊ฒฐ์ œ ์š”์ฒญ์ด ์ค‘๋ณต์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ๊ฒ€์ฆ
  • (5): amount: 1004
    • ๊ฒฐ์ œ ๊ธˆ์•ก
    • ๊ฐ€๋งน์ ์—์„œ ํŒ๋งคํ•˜๋Š” ์ƒํ’ˆ ๊ธˆ์•ก
  • (6): returnUrl: 'http://localhost:4567/serverAuth'

์ธ์ฆ ์š”์ฒญ์— ๋Œ€ํ•œ F&Q

Q1. [P006]. clientId๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.(GID ํš๋“ ์‹คํŒจ)
A. ์šด์˜ ์„œ๋น„์Šค์— ์ƒŒ๋“œ๋ฐ•์Šค ClientId๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์šด์˜ clientId๋Š” R1_ or R2_ ์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ ์‘๋‹ต

์ธ์ฆ ์š”์ฒญ์ด ์ •์ƒ์ ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด ์ธ์ฆ ์š”์ฒญ์‹œ returnUrl ํ•„๋“œ์— ๊ธฐ์ž…ํ•œ URL๋กœ ์ธ์ฆ์— ๋Œ€ํ•œ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MIME ์œ ํ˜•: application/x-www-form-urlencoded
authResultCode: 0000                                                    // (1)
authResultMsg: ์ธ์ฆ ์„ฑ๊ณต
tid: {{์ธ์ฆ ์„ฑ๊ณต์— ๋Œ€ํ•œ TID 30์ž}}                                      // (2)
clientId: {{R2_xxx server ์Šน์ธ & basic ์ธ์ฆ}}
orderId: {{๊ฐ€๋งน์  ๊ณ ์œ  ์ฃผ๋ฌธ๋ฒˆํ˜ธ}}
amount: 1004
authToken: {{NICEUNTxxx 40์ž}}
signature: {{hex(sha256(authToken + clientId + amount + secretKey}}     // (3)
  • (1): authResultCode: 0000
    • ์ธ์ฆ ๊ฒฐ๊ณผ ์ฝ”๋“œ
    • ์„ฑ๊ณต ์‹œ "0000"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • (2): tid: {{์ธ์ฆ ์„ฑ๊ณต์— ๋Œ€ํ•œ TID 30์ž}}
    • ์ธ์ฆ ์„ฑ๊ณต ์‹œ ์Šน์ธ ์š”์ฒญ์„ ์œ„ํ•œ ํŠธ๋žœ์žญ์…˜ ID
    • ๊ฑฐ๋ž˜ ์š”์ฒญ ๋ฐ ์ทจ์†Œ, ๊ฑฐ๋ž˜์กฐํšŒ ๋“ฑ์œผ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ID ์ž…๋‹ˆ๋‹ค.
  • (3): signature: {{hex(sha256(authToken + clientId + amount + secretKey}}
    • ์‘๋‹ต์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋ช… ๊ฐ’
    • ์ธ์ฆ ์‘๋‹ต์— ๋Œ€ํ•ด ๊ฐ€๋งน์ ์€ ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๊ฐ€๋Šฅ

์ธ์ฆ ์‘๋‹ต ์‹œ์ ์—์„œ ๊ฒฐ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ƒŒ๋“œ๋ฐ•์Šค ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฐœ๊ธ‰๋œ TID๋กœ ์Šน์ธ ์š”์ฒญ ์‹œ, ์Šน์ธ์‘๋‹ต ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์šด์˜ ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฐœ๊ธ‰๋œ TID๋กœ ์Šน์ธ ์š”์ฒญ ์‹œ, ์นด๋“œ์‚ฌ์— ์ธ์ฆ๋œ ๊ฒฐ์ œ๋ฅผ ๊ณ ๊ฐ์—๊ฒŒ ๊ฒฐ์ œ๊ธˆ์•ก์„ ์ฒญ๊ตฌํ•˜๋„๋ก ์š”์ฒญํ•˜์—ฌ ๊ฒฐ์ œ๊ฐ€ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.


์Šน์ธ ์š”์ฒญ

์Šน์ธ ์š”์ฒญ curl

curl -request POST 
--url 'https://api.nicepay.co.kr/v1/payments/{tid}' \                  # (1)
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Basic {base64(clientId:secretKey)}' \         # (2)
--data '{
  "amount": 1004                                                       # (3)
}'
  • (1): --url 'https://api.nicepay.co.kr/v1/payments/{tid}'
    • ์Šน์ธ์š”์ฒญ API ํ˜ธ์ถœ
    • ์ธ์ฆ ์‘๋‹ต ๊ฒฐ๊ณผ๋กœ ๋ฐ›์€ TID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ์ œ ์š”์ฒญ
  • (2): --header 'Authorization: Basic {base64(clientId:secretKey)}'
    • ์Šน์ธ ์š”์ฒญ ์‹œ ํŠน์ • ๊ฐ€๋งน์ ์˜ ์ธ๊ฐ€ ์ฒ˜๋ฆฌ
    • Server ์Šน์ธ & basic ์ธ์ฆ์œผ๋กœ ๋ฐœ๊ธ‰ ๋ฐ›์€ ํ‚ค ์ •๋ณด๋กœ base64 ์ธ์ฝ”๋”ฉ
  • (3): "amount": 1004
    • ๊ฒฐ์ œ ๊ธˆ์•ก
    • ์Šน์ธ ์š”์ฒญ์„ ์œ„ํ•œ ํ•„์ˆ˜ ๊ฐ’

Token ๋งŒ๋“ค๊ธฐ

Terminal์—์„œ base64 ์ธ์ฝ”๋”ฉํ•˜๊ธฐ

echo -n 'clientId:secretKey' | base64

Windows PowerShell์„ ์ด์šฉํ•œ ์ธ์ฝ”๋”ฉ

powershell "[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes('clientId:secretKey'))"

์Šน์ธ ์‘๋‹ต

์Šน์ธ ์‘๋‹ต์— ๋Œ€ํ•œ ์„ค๋ช…

์Šน์ธ ์‘๋‹ต์€ ๊ฒฐ์ œ ๊ณผ์ • ์ค‘์—์„œ ๊ณ ๊ฐ์˜ ์นด๋“œ์‚ฌ์— ์˜ํ•ด ํŠน์ • ๊ธˆ์•ก์˜ ๊ฒฐ์ œ๊ฐ€ ํ—ˆ๊ฐ€๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.

๊ฐ€๋งน์ ์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‘๋‹ต ๋ฐ›์•„๋ณผ ์ˆ˜๋„ ์žˆ๊ณ , ๋™์‹œ์— ๊ฒฐ์ œ์ˆ˜๋‹จ์— ๋Œ€ํ•œ ์›นํ›… URL์„ ๋“ฑ๋กํ•˜์˜€์„ ๊ฒฝ์šฐ, ์›นํ›…์„ ํ†ตํ•ด ๊ฒฐ์ œํ†ต๋ณด๋ฅผ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›นํ›…์„ ํ†ตํ•ด ๊ฒฐ์ œํ†ต๋ณด๋ฅผ ๋ฐ›๋Š” ๊ฒฝ์šฐ, ๋ณ„๋„์˜ ์‘๋‹ต์ด ํ•ด๋‹น URL๋กœ ์ „์†ก๋˜์–ด, ๊ฐ€๋งน์ ์€ ๊ฒฐ์ œ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ๊ฒ€์ฆ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šด์˜ํ™˜๊ฒฝ ์Šน์ธ ์‘๋‹ต ๋ฐ์ดํ„ฐ

{
  "resultCode": "0000",
  "resultMsg": "์ •์ƒ ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.",
  "tid": "{{tid}}",
  "cancelledTid": null,
  "orderId": "{{unique_orderId}",
  "ediDate": "2023-08-14T17:07:28.021+0900",
  "signature": "{{hex(sha256(tid + amount + ediDate+ SecretKey))}}",
  "status": "paid",
  "paidAt": "2023-08-14T17:07:27.000+0900",
  "failedAt": "0",
  "cancelledAt": "0",
  "payMethod": "card",
  "amount": 1004,
  "balanceAmt": 1004,
  "goodsName": "์ƒํ’ˆ๋ช…",
  "mallReserved": null,
  "useEscrow": false,
  "currency": "KRW",
  "channel": "pc",
  "approveNo": "000000",
  "buyerName": null,
  "buyerTel": null,
  "buyerEmail": null,
  "receiptUrl": "https://npg.nicepay.co.kr/issue/IssueLoader.do?type=0&innerWin=Y&TID={{tid}}",
  "mallUserId": null,
  "issuedCashReceipt": false,
  "coupon": null,
  "card": {
    "cardCode": "{{์นด๋“œ์‚ฌ์ฝ”๋“œ}}",
    "cardName": "{{์นด๋“œ์‚ฌ}}",
    "cardNum": "{{์‹ ์šฉ์นด๋“œ ๋ฒˆํ˜ธ}}", // PCI-DSS ์•ž 6์ž๋ฆฌ, ๋’ค 4์ž๋ฆฌ ์™ธ ๋งˆ์Šคํ‚น ์ฒ˜๋ฆฌ
    "cardQuota": 0,
    "isInterestFree": false,
    "cardType": "credit",
    "canPartCancel": true,
    "acquCardCode": "{{๋งค์ž…์‚ฌ ์ฝ”๋“œ}}",
    "acquCardName": "{{๋งค์ž…์‚ฌ ๋ช…}}"
  },
  "vbank": null,
  "bank": null,
  "cellphone": null,
  "cancels": null,
  "cashReceipts": null,
  "messageSource": "nicepay"
}
โš ๏ธ **GitHub.com Fallback** โš ๏ธ