{
  "info": {
    "name": "Dotkas API H2H",
    "description": "API H2H Dotkas, format standar OtomaX. Isi variabel koleksi: base_url, member_id, pin, api_key. Sign dihitung otomatis di Pre-request Script. Dokumentasi lengkap: https://app.dotkas.com/api-docs",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// sign = Base64URL(SHA1(\"OtomaX|member|product|dest|refID|PIN|APIKey\")), cek saldo: OtomaX|member|PIN|APIKey",
          "const v = k => pm.collectionVariables.get(k) || pm.environment.get(k) || '';",
          "const q = {}; pm.request.url.query.each(p => { if (!p.disabled) q[p.key.toLowerCase()] = pm.variables.replaceIn(p.value || ''); });",
          "if (!q.refid && pm.request.url.getPath().endsWith('/trx')) { pm.variables.set('ref_id', 'TES-' + Date.now()); }",
          "const ref = q.refid ? q.refid : pm.variables.get('ref_id');",
          "const isBal = pm.request.url.getPath().endsWith('/balance');",
          "const txt = isBal ? `OtomaX|${v('member_id')}|${v('pin')}|${v('api_key')}`",
          "                  : `OtomaX|${v('member_id')}|${q.product}|${q.dest}|${ref}|${v('pin')}|${v('api_key')}`;",
          "const sign = CryptoJS.SHA1(txt).toString(CryptoJS.enc.Base64).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');",
          "pm.variables.set('sign', sign);"
        ]
      }
    }
  ],
  "variable": [
    {"key": "base_url", "value": "https://app.dotkas.com/h2h"},
    {"key": "member_id", "value": "KP00000"},
    {"key": "pin", "value": ""},
    {"key": "api_key", "value": ""},
    {"key": "ref_id", "value": "INV-0001"}
  ],
  "item": [
    {
      "name": "Cek Saldo",
      "request": {
        "method": "GET",
        "url": {
          "raw": "{{base_url}}/balance?memberID={{member_id}}&sign={{sign}}",
          "host": ["{{base_url}}"], "path": ["balance"],
          "query": [{"key": "memberID", "value": "{{member_id}}"}, {"key": "sign", "value": "{{sign}}"}]
        },
        "description": "Sign: Base64URL(SHA1(\"OtomaX|memberID|PIN|APIKey\"))"
      },
      "response": [{"name": "Sukses", "originalRequest": {"method": "GET", "url": "{{base_url}}/balance"}, "status": "OK", "code": 200,
        "_postman_previewlanguage": "text", "body": "status=1&message=Saldo: Rp 489.650&saldo=489650"}]
    },
    {
      "name": "Transaksi",
      "request": {
        "method": "GET",
        "url": {
          "raw": "{{base_url}}/trx?product=S10&dest=081234567890&refID={{ref_id}}&memberID={{member_id}}&sign={{sign}}",
          "host": ["{{base_url}}"], "path": ["trx"],
          "query": [
            {"key": "product", "value": "S10", "description": "Kode produk Dotkas"},
            {"key": "dest", "value": "081234567890", "description": "Nomor tujuan / ID pelanggan"},
            {"key": "refID", "value": "{{ref_id}}", "description": "Nomor trx lo, unik, 3-30 karakter"},
            {"key": "memberID", "value": "{{member_id}}"},
            {"key": "sign", "value": "{{sign}}"},
            {"key": "qty", "value": "2", "disabled": true, "description": "2 = sengaja kirim ulang produk sama ke nomor sama"}
          ]
        },
        "description": "Balasan status=1 (diproses) / status=0 (gagal). Status akhir dikirim ke URL callback."
      },
      "response": [
        {"name": "Diproses", "originalRequest": {"method": "GET", "url": "{{base_url}}/trx"}, "status": "OK", "code": 200, "_postman_previewlanguage": "text",
          "body": "status=1&message=Trx S10 081234567890 akan diproses&refid=INV-0001&ref=KP261029A1B2C3&harga=10350&saldo=489650"},
        {"name": "Saldo kurang", "originalRequest": {"method": "GET", "url": "{{base_url}}/trx"}, "status": "OK", "code": 200, "_postman_previewlanguage": "text",
          "body": "status=0&message=Saldo tidak cukup. Transaksi GAGAL&refid=INV-0001"}
      ]
    },
    {
      "name": "Transaksi Open Denom",
      "request": {
        "method": "GET",
        "url": {
          "raw": "{{base_url}}/trx?product=BBSD&dest=081234567890&qty=50000&refID={{ref_id}}&memberID={{member_id}}&sign={{sign}}",
          "host": ["{{base_url}}"], "path": ["trx"],
          "query": [
            {"key": "product", "value": "BBSD", "description": "Kode produk bebas nominal"},
            {"key": "dest", "value": "081234567890"},
            {"key": "qty", "value": "50000", "description": "Nominal 10000 - 10000000"},
            {"key": "refID", "value": "{{ref_id}}"},
            {"key": "memberID", "value": "{{member_id}}"},
            {"key": "sign", "value": "{{sign}}"}
          ]
        },
        "description": "Saldo dipotong nominal + admin. qty gak ikut di sign."
      }
    },
    {
      "name": "Cek Status (kirim ulang refID sama)",
      "request": {
        "method": "GET",
        "url": {
          "raw": "{{base_url}}/trx?product=S10&dest=081234567890&refID=INV-0001&memberID={{member_id}}&sign={{sign}}",
          "host": ["{{base_url}}"], "path": ["trx"],
          "query": [
            {"key": "product", "value": "S10"}, {"key": "dest", "value": "081234567890"},
            {"key": "refID", "value": "INV-0001", "description": "refID trx yang mau dicek (JANGAN bikin baru)"},
            {"key": "memberID", "value": "{{member_id}}"}, {"key": "sign", "value": "{{sign}}"}
          ]
        },
        "description": "refID yang udah pernah masuk gak bikin trx baru, cuma balas statusnya: 1 proses, 2 sukses + SN, 0 gagal."
      },
      "response": [{"name": "Sukses", "originalRequest": {"method": "GET", "url": "{{base_url}}/trx"}, "status": "OK", "code": 200, "_postman_previewlanguage": "text",
        "body": "status=2&message=Trx S10 081234567890 SUKSES. SN: 0431890000145197 (refID udah masuk sebelumnya)&refid=INV-0001&ref=KP261029A1B2C3&sn=0431890000145197"}]
    },
    {
      "name": "Daftar Harga (publik)",
      "request": {"method": "GET", "url": {"raw": "https://app.dotkas.com/api/pub/harga", "protocol": "https", "host": ["app", "dotkas", "com"], "path": ["api", "pub", "harga"]},
        "description": "JSON kategori + kode + harga level Reguler + status normal/gangguan. Gak butuh sign."}
    },
    {
      "name": "Contoh Callback (dari Dotkas ke server lo)",
      "request": {
        "method": "GET",
        "url": {
          "raw": "https://server-lo.com/callback?refid=INV-0001&ref=KP261029A1B2C3&status=2&sn=0431890000145197&harga=10350&message=Trx S10 081234567890 SUKSES. SN: 0431890000145197",
          "protocol": "https", "host": ["server-lo", "com"], "path": ["callback"],
          "query": [
            {"key": "refid", "value": "INV-0001"}, {"key": "ref", "value": "KP261029A1B2C3"},
            {"key": "status", "value": "2", "description": "2 sukses, 0 gagal"}, {"key": "sn", "value": "0431890000145197"},
            {"key": "harga", "value": "10350"}, {"key": "message", "value": "Trx S10 081234567890 SUKSES. SN: 0431890000145197"}
          ]
        },
        "description": "Bentuk callback yang dikirim Dotkas. Balas HTTP 2xx. Gagal = dikirim ulang bertahap."
      }
    }
  ]
}
