Cegah pembayaran ganda dengan idempotensi

Koneksi dapat terputus setelah Valcentra membuat pembayaran tetapi sebelum backend menerima respons. Tanpa pengenal operasi yang stabil, retry bisa dianggap sebagai permintaan baru.

Pada POST /v1/payments, Idempotency-Key mengidentifikasi satu operasi create payment. Mengulang request dengan API key, idempotency key, dan body yang sama mengembalikan pembayaran yang sama, bukan membuat pembayaran kedua.

Pilih key sebelum mengirim request

Gunakan key yang bisa disimpan dan ditemukan kembali bersama pesanan:

Contoh pengenal satu operasi
merchant_reference: order-book-1001
Idempotency-Key: order-book-1001-create

Key menerima 1–255 karakter. Karakter pertama harus huruf atau angka; sisanya boleh huruf, angka, titik, underscore, atau tanda hubung. Jangan memasukkan secret atau data pribadi.

Simpan key dan body operasi di backend sebelum request dikirim. Membuat timestamp atau UUID baru setiap kali retry menghilangkan manfaat deduplikasi. UUID boleh dipakai jika dibuat sekali untuk operasi tersebut dan digunakan kembali.

Bedakan tiga pengenal

PengenalPemilikFungsi
merchant_referenceSistem AndaReferensi bisnis, unik per project dan environment.
Idempotency-KeySistem AndaPengenal operasi create yang dapat diulang dengan aman.
Payment idValcentraIdentitas pembayaran yang dipakai saat retrieve atau simulasi.

Deduplikasi create terikat pada API key yang mengirim request. Jangan menganggap key yang sama akan melanjutkan operasi setelah Anda berganti API key. Keunikan merchant_reference tetap berlaku pada project dan environment.

Apa yang terjadi saat request diulang?

Request berikutnyaHasil / tindakan
Key dan body sama, memakai API key yang samaPembayaran yang sama dikembalikan.
Key sama, body berubahHTTP 409 idempotency_conflict. Periksa data operasi; jangan retry tanpa perubahan.
Key baru, merchant_reference sudah terpakaiHTTP 409 merchant_reference_conflict. Cari pembayaran pesanan tersebut, bukan membuat referensi acak untuk melewati konflik.
Key baru dan referensi baruOperasi baru yang dapat membuat pembayaran baru.

Body mencakup jumlah, channel, deskripsi, metadata, dan return URL. Pertahankan semua nilainya pada retry, bukan hanya amount.

Setelah timeout

  1. Jangan langsung menyimpulkan pembayaran gagal.
  2. Jika ID sudah tersimpan, ambil status dengan GET /v1/payments/{payment_id}.
  3. Jika respons create belum diterima, ulang create memakai key dan body yang tersimpan serta API key yang sama.
  4. Simpan ID dan checkout URL ketika respons diterima.

Terapkan batas percobaan dan jeda retry. Lihat error API untuk menentukan kapan retry masuk akal.

Tidak semua operasi memiliki perilaku idempotensi yang sama

Endpoint simulasi mewajibkan header Idempotency-Key, tetapi tidak mendeduplikasi percobaan simulasi. Deduplikasi webhook juga berbeda: receiver Anda menggunakan event.id, bukan key request create payment.

Lanjutkan ke: payment dan status, atau webhook untuk mencegah pemrosesan pesanan berulang.

On this page