Lewati ke konten
Buat akun
atau
Masuk
Logo Dokumen Stripe
/
Tanya AI
Buat akun
Masuk
Mulai
Pembayaran
Pendapatan
Platform dan situs belanja online
Manajemen uang
Developer resources
Gambaran Umum
Tentang pembayaran Stripe
Upgrade integrasi Anda
Analitik pembayaran
Pembayaran online
Gambaran umumTemukan contoh penggunaan AndaPembayaran Terkelola
Gunakan Payment Links
Buat halaman checkout
Bangun integrasi lanjutan
Bangun integrasi dalam aplikasi
Metode Pembayaran
Tambahkan metode pembayaran
    Gambaran umum
    Opsi integrasi metode pembayaran
    Kelola metode pembayaran default di Dashboard
    Tipe metode pembayaran
    Kartu
    Bayar dengan saldo Stripe
    Kripto
    Debit bank
    Halaman pembayaran bank
    Transfer bank
    Transfer kredit (Sumber)
    Beli sekarang, bayar nanti
    Pembayaran real-time
    Voucher
      Boleto
      Konbini
        Terima pembayaran
      Multibanco
      OXXO
    Dompet
    Aktifkan metode pembayaran lokal menurut negara
    Metode pembayaran custom
Kelola metode pembayaran
Checkout lebih cepat dengan Link
Antarmuka pembayaran
Payment Links
Checkout
Web Elements
Elements dalam aplikasi
Skenario pembayaran
Tangani beberapa mata uang
Alur pembayaran custom
Akuisisi fleksibel
Orkestrasi
Pembayaran di tempat
Terminal
Beyond payments
Incorporate your company
Kripto
Financial Connections
Climate
BerandaPembayaranAdd payment methodsVouchersKonbini

Pembayaran Konbini

Gunakan API Payment Intents dan Payment Methods untuk menerima pembayaran melalui Konbini, cara umum untuk melakukan pembayaran melalui minimarket di Jepang.

Pengguna Stripe di Jepang dapat menerima pembayaran Konbini dari pelanggan di Jepang dengan menggunakan API Payment Intens dan Payment Methods. Pelanggan membayar dengan memberikan kode pembayaran, nomor konfirmasi, dan pembayaran tunai di minimarket di Jepang. Stripe akan memberi tahu Anda bila pembayaran selesai.

Siapkan Stripe
Sisi server

Pertama, Anda membutuhkan akun Stripe. Daftar sekarang.

Gunakan pustaka resmi kami untuk mendapatkan akses ke API Stripe dari aplikasi Anda:

Command Line
Ruby
# Available as a gem sudo gem install stripe
Gemfile
Ruby
# If you use bundler, you can add this line to your Gemfile gem 'stripe'

Buat PaymentIntent
Sisi server

Stripe menggunakan objek PaymentIntent untuk mewakili maksud Anda menagih pembayaran dari pelanggan, melacak perubahan status dari pembuatan PaymentIntent Konbini hingga selesai.

Buat PaymentIntent di server Anda dengan jumlah dan mata uang jpy (Konbini tidak mendukung mata uang lain). Jika Anda sudah memiliki integrasi menggunakan Payment Intents API, tambahkan konbini ke daftar tipe metode pembayaran untuk PaymentIntent Anda.

Command Line
cURL
curl https://api.stripe.com/v1/payment_intents \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d amount=1099 \ -d currency=jpy \ -d "payment_method_types[]"=konbini \ -d "payment_method_options[konbini][product_description]"="Tシャツ" \ -d "payment_method_options[konbini][expires_after_days]"=3

Ambil client secret

PaymentIntent menyertakan client secret yang digunakan pada sisi client untuk menyelesaian proses pembayaran dengan aman. Anda dapat menggunakan pendekatan berbeda untuk meneruskan client secret ke sisi client.

Ambil client secret dari endpoint pada server Anda, menggunakan fungsi fetch browser. Pendekatan ini paling baik jika sisi client Anda adalah aplikasi satu halaman, terutama yang dibangun dengan kerangka kerja frontend modern seperti React. Buat endpoint server yang melayani client secret:

main.rb
Ruby
get '/secret' do intent = # ... Create or retrieve the PaymentIntent {client_secret: intent.client_secret}.to_json end

Kemudian ambil client secret dengan JavaScript pada sisi client:

(async () => { const response = await fetch('/secret'); const {client_secret: clientSecret} = await response.json(); // Render the form using the clientSecret })();

Opsi metode pembayaran tambahan

Opsi metode pembayaran dapat ditentukan di opsi metode pembayaran pada kunci konbini.

BidangNilaiDiperlukanNilai Default
expires_after_daysJumlah hari kalender sebelum pembayaran Konbini yang menunggu menjadi kedaluwarsa. Nilai yang valid adalah dari 1 hingga 60 hari. Lihat Kedaluwarsa.Tidak3
expires_atStempel waktu Unix yang menunjukkan kapan pembayaran Konbini yang menunggu akan kedaluwarsa. Tanggal kedaluwarsa ini harus lebih dari 30 menit sejak waktu saat ini dan kurang dari 60 hari setelah pengaturan diterapkan ke PaymentIntent. Lihat Kedaluwarsa.Tidakunset
product_descriptionKeterangan produk hingga 22 karakter, yang akan ditampilkan kepada pelanggan di minimarket. Keberadaan karakter non-Shift JIS (JIS X 0208:1997) akan menyebabkan dikembalikannya kesalahan. Meski tidak diharuskan, kami merekomendasikan pengaturan opsi ini. Bila tidak maka akan kami kembalikan ke placeholder umum yang dipilih berdasarkan kebijakan kami, mis. お買い上げ商品・サービス.Tidakplaceholder

Kedaluwarsa

Pembayaran Konbini yang menunggu akan kedaluwarsa tepat sebelum tengah malam (23.59.59 WSJ) pada tanggal yang ditentukan. Misalnya, jika expires_after_days diatur ke 2 dan PaymentIntent dikonfirmasi pada hari Senin, pembayaran Konbini yang menunggu akan kedaluwarsa pada hari Rabu pukul 23.59.59 waktu Jepang (UTC +9).

Pengaturan expires_at adalah cap waktu Unix dalam detik. Jika nilainya kurang dari 30 menit dari waktu saat ini, atau konfirmasi PaymentIntent terjadi kurang dari 30 menit sejak waktu kedaluwarsa, maka kesalahan akan dikembalikan.

expires_after_days dan expires_at saling terpisah. Kesalahan akan dikembalikan jika keduanya diatur. Keduanya juga opsional, dan jika tidak ada yang diatur, maka tanggal kedaluwarsa default menjadi 3 hari setelah pembuatan PaymentIntent pada pukul 23.59 waktu Jepang (UTC +9).

Penanganan kesalahan

Permintaan pada PaymentIntent seperti pembuatan, pembaruan, dan konfirmasi dapat gagal. Anda dapat memeriksa nilai error dari respons API untuk menentukan alasannya dan dalam banyak situasi baik menyerahkan ulang permintaan atau memperbaiki kesalahan tersebut. Jika Anda memberikan nilai opsi metode pembayaran confirmation_number, maka Anda mungkin ingin menangani kode kesalahan spesifik yang kami kembalikan. Lihat Nomor konfirmasi untuk detail selengkapnya.

Metode pembayaran untuk sementara mungkin sesekali tidak tersedia karena listrik mati, pemeliharaan terjadwal, atau pola penggunaan Anda. Lihat Menangani masalah ketersediaan sementara untuk detail selengkapnya.

Kumpulkan detail metode pembayaran
Sisi client

Buat formulir pembayaran pada client Anda untuk mengumpulkan detail tagihan yang diperlukan dari pelanggan:

BidangNilai
nameNama lengkap pelanggan, dipotong menjadi maksimal 20 karakter di UI minimarket dan resi. Karakter non-Shift JIS (JIS X 0208:1997) akan dibuang atau diganti.
emailAlamat email lengkap pelanggan.

Contoh formulir di sini juga mengumpulkan nomor telepon, untuk digunakan sebagai nomor konfirmasi yang disediakan oleh pelanggan:

checkout.html
<form id="payment-form"> <div class="form-row"> <label for="name"> Name </label> <input id="name" name="name" required> </div> <div class="form-row"> <label for="email"> Email </label> <input id="email" name="email" required> </div> <div class="form-row"> <label for="phone"> Phone Number </label> <input id="phone" name="phone" required> </div> <!-- Used to display form errors. --> <div id="error-message" role="alert"></div> <button id="submit-button">Pay with Konbini</button> </form>

Serahkan pembayaran ke Stripe
Sisi client

Saat pelanggan mengklik untuk membayar dengan Konbini, gunakan Stripe.js untuk menyerahkan pembayaran kepada Stripe. Stripe.js adalah pustaka JavaScript kami yang mendasar untuk membangun alur pembayaran.

Sertakan skrip Stripe.js di halaman checkout dengan menambahkannya ke head file HTML Anda.

checkout.html
<head> <title>Checkout</title> <script src="https://js.stripe.com/basil/stripe.js"></script> </head>

Buat instance Stripe.js dengan JavaScript berikut di halaman checkout Anda.

client.js
// Set your publishable key. Remember to switch to your live publishable key in production! // See your keys here: https://dashboard.stripe.com/apikeys const stripe = Stripe(
'pk_test_TYooMQauvdEDq54NiTphI7jx'
);

Gunakan stripe.confirmKonbiniPayment dan client secret objek PaymentIntent yang Anda buat di Langkah 2 untuk menyerahkan detail tagihan pelanggan.

Setelah konfirmasi, Stripe akan secara otomatis membuka modal untuk menampilkan instruksi pembayaran Konbini kepada pelanggan Anda.

client.js
const form = document.getElementById('payment-form'); form.addEventListener('submit', async (event) => { event.preventDefault(); const result = await stripe.confirmKonbiniPayment( '{{PAYMENT_INTENT_CLIENT_SECRET}}', { payment_method: { billing_details: { name: document.getElementById('name').value, email: document.getElementById('email').value, }, }, payment_method_options: { konbini: { confirmation_number: document.getElementById('phone').value.replace(/\D/g,''), }, }, } ); // Stripe.js will open a modal to display the Konbini payment instructions to your customer // This async function finishes when the customer closes the modal if (result.error) { // Display error to your customer const errorMsg = document.getElementById('error-message'); errorMsg.innerText = result.error.message; } });

Catatan

stripe.confirmKonbiniPayment mungkin perlu waktu beberapa detik untuk diselesaikan. Sambil menunggu, nonaktifkan formulir Anda agar tidak diserahkan ulang dan tampilkan indikator menunggu seperti spinner. Jika Anda menerima kesalahan, tampilkan kepada pelanggan, aktifkan kembali formulir, dan sembunyikan indikator menunggu.

Opsi metode pembayaran tambahan

Ketika mengonfirmasi PaymentIntent Konbini, Anda dapat menentukan opsi metode pembayaran tambahan di opsi metode pembayaran, pada kunci konbini.

BidangNilaiDiperlukanNilai default
confirmation_numberString numerik 10 hingga 11 angka. String ini juga ditampilkan dalam instruksi pembayaran dan tidak boleh hanya terdiri dari nol. Jika Anda tidak memberikan nilai untuk confirmation_number, Stripe membuatnya secara acak untuk Anda. Untuk informasi selengkapnya, lihat Nomor konfirmasi.Tidakunset

Nomor konfirmasi

Pelanggan Anda perlu menyebutkan confirmation_number saat menyelesaikan pembayaran. Saran umum untuk nilai ini, jika Anda memilih untuk mengaturnya atau mengizinkan pelanggan mengaturnya, adalah nomor telepon pelanggan. Suatu confirmation_number juga dapat diatur selama pembuatan PaymentIntent sisi server, tetapi yang lebih umum diatur sisi client oleh pelanggan selama konfirmasi PaymentIntent. Ini dapat diperbarui dari nilai yang diatur selama pembuatan PaymentIntent hingga konfirmasi.

Jika confirmation_number yang ditentukan terlalu umum di antara transaksi minimarket yang sedang berlangsung, maka mungkin akan ditolak saat konfirmasi PaymentIntent. Kode kesalahan yang dikembalikan dalam hal ini adalah payment_intent_konbini_rejected_confirmation_number, yang hanya diperkirakan saat mengonfirmasikan PaymentIntent.

Stripe secara proaktif memblokir nomor konfirmasi yang terdiri dari hanya nol pada saat pembuatan PaymentIntent serta selama pembaruan dan konfirmasi. Pastikan di pihak Anda tidak mengatur nilai ini atau mengizinkan pelanggan mengaturnya.

Penanganan kesalahan

Mengonfirmasi sisi client PaymentIntent juga mungkin gagal. Anda harus memeriksa nilai pengembalian error untuk menentukan sebabnya dan dapat menampilkan kesalahan tersebut kepada pelanggan atau perbaiki kesalahan tersebut dan coba lagi.

OpsionalTampilkan sendiri instruksi pembayaran Konbini Anda kepada pelanggan
Sisi client

OpsionalSerahkan pembayaran kepada Stripe dari server Anda
Sisi server

OpsionalSesuaikan instruksi pembayaran

OpsionalKirim email instruksi pembayaran

OpsionalKirim email pengingat

Tangani kejadian pascapembayaran
Sisi server

Konbini adalah metode pembayaran notifikasi tertunda, sehingga dana tidak segera tersedia. Pelanggan mungkin tidak membayar pembayaran Konbini yang menunggu di minimarket begitu selesai checkout.

Setelah Pembayaran Konbini yang menunggu selesai, Stripe mengirim kejadian payment_intent.succeeded untuknya. Gunakan Dashboard atau buat handler webhook untuk menerima kejadian ini dan menjalankan tindakan. Contoh tindakan termasuk mengirim email konfirmasi pesanan kepada pelanggan Anda, mencatat penjualan di database, atau memulai alur kerja pengiriman.

Bila jelas bahwa pembayaran Konbini yang menunggu tidak selesai, biasanya sekitar satu jam setelah batas waktu kedaluwarsa, Stripe akan mengirim kejadian payment_intent.payment_failed.

KejadianKeteranganLangkah berikutnya
payment_intent.requires_actionPembayaran Konbini yang menunggu telah dibuat.Secara opsional, kirim pelanggan ke halaman instruksi pembayaran. Tunggu pelanggan membayar pembayaran Konbini.
payment_intent.succeededPelanggan membayar pembayaran Konbini tertunda sebelum kedaluwarsa.Penuhi barang atau layanan yang dibeli oleh pelanggan.
payment_intent.payment_failedPelanggan tidak membayar pembayaran Konbini yang menunggu sebelum kedaluwarsa.Hubungi pelanggan menggunakan email atau notifikasi otomatis untuk meminta metode pembayaran yang lain.

Catatan

Ketika mencoba, status PaymentIntent Konbini mungkin berubah secara otomatis berdasarkan parameter yang dikirim, seperti email. Anda dapat mengonfirmasikan pembaruan di Dashboard. Lihat Coba integrasi untuk detail selengkapnya.

Terima kejadian dan jalankan tindakan bisnis

Secara manual

Gunakan Dashboard Stripe untuk melihat semua pembayaran Stripe Anda, mengirim resi email, menangani payout, atau mencoba ulang pembayaran yang gagal.

  • Lihat pembayaran percobaan Anda di Dashboard

Kode Custom

Bangun handler webhook untuk mendengarkan kejadian dan bangun alur pembayaran asinkron custom. Coba dan debug integrasi webhook Anda secara lokal dengan Stripe CLI.

  • Bangun webhook custom

Coba integrasi

Ketika mencoba, atur payment_method.billing_details.email ke nilai berikut bila Anda memanggil stripe.confirmKonbiniPayment untuk mencoba berbagai skenario. Anda dapat mencoba dengan nomor konfirmasi khusus ataupun pola email. Jika keduanya diberikan, maka yang berlaku adalah perilaku nomor konfirmasi khusus.

EmailNomor konfirmasiKeterangan

{any_prefix}@{any_domain}

11111111110

Menyimulasikan pembayaran Konbini yang berhasil setelah 3 menit dan webhook payment_intent.succeeded yang masuk setelah itu.

Contoh: hanako@test.com

{any_prefix}succeed_immediately@{any_domain}

22222222220

Menyimulasikan pembayaran Konbini yang seketika berhasil dan webhook payment_intent.succeeded yang masuk setelah itu.

Contoh: succeed_immediately@test.com

{any_prefix}expire_immediately@{any_domain}

33333333330

Menyimulasikan pembayaran Konbini yang segera kedaluwarsa dan webhook payment_intent.payment_failed yang masuk setelah itu.

Bidang expires_at di next_action.konbini_display_details diatur ke waktu saat ini, terlepas dari pengaturan parameter expires_after_days atau expires_at di opsi metode pembayaran.

Contoh: expire_immediately@test.com

{any_prefix}expire_with_delay@{any_domain}

44444444440

Menyimulasikan pembayaran Konbini yang tidak pernah berhasil; ini akan kedaluwarsa dalam waktu 3 menit dan webhook payment_intent.payment_failed akan masuk setelah itu.

Bidang expires_at di next_action.konbini_display_details diatur ke 3 menit mendatang terlepas dari pengaturan parameter expires_after_days atau expires_at di opsi metode pembayaran.

Contoh: expire_with_delay@test.com

{any_prefix}fill_never@{any_domain}

55555555550

Menyimulasikan pembayaran Konbini yang tidak pernah berhasil; Kedaluwarsa sesuai dengan bidang expires_at di next_action.konbini_display_details sesuai parameter yang diberikan di opsi metode pembayaran dan webhook payment_intent.payment_failed yang masuk setelah itu.

Contoh: fill_never@test.com

Untuk mencoba penanganan kesalahan nomor konfirmasi, Anda dapat menggunakan nilai-nilai berikut untuk payment_method_options[confirmation_number]:

  • 01234567890 menghasilkan kode kesalahan payment_intent_konbini_rejected_confirmation_number.
  • 00000000000 menghasilkan kode kesalahan validasi generik. Anda harus menghindari kesalahan ini dalam integrasi menggunakan pravalidasi.

Kedaluwarsa dan pembatalan

Setelah waktu yang ditentukan oleh nilai expires_at di next_action.konbini_display_details, pelanggan tidak dapat lagi initiate proses pembayaran untuk pembayaran Konbini yang menunggu di kios minimarket. Namun, jika mengeluarkan slip pembayaran yang valid sebelum batas waktu, pelanggan mungkin dapat menyelesaikan pembayaran di kasir setelah waktu expires_at.

Ada periode penyangga untuk menghindari kegagalan pembayaran prematur dalam kejadian demikian. Status PaymentIntent berubah menjadi requires_payment_method. Pada titik ini, Anda dapat membatalkan atau mengonfirmasikan PaymentIntent dengan metode pembayaran lain.

Anda juga dapat membatalkan pembayaran Konbini yang menunggu setelah konfirmasi dan sebelum waktu yang ditentukan oleh next_action.konbini_display_details.expires_at. Memperbarui PaymentIntent atau mengonfirmasinya dengan metode pembayaran lain juga secara implisit akan membatalkan pembayaran Konbini yang ada.

Jika pelanggan saat ini melakukan pembayaran Konbini di minimarket, permintaan pembatalan akan gagal. Pembatalan dapat dicoba kembali jika pelanggan mengabaikan upaya pembayaran dan setelah slip pembayaran habis masa berlakunya.

Perhatikan bahwa masalah ketersedian metode pembayaran sementara juga memengaruhi permintaan pembatalan (baik eksplisit serta implisit).

Peringatan

Saat Anda membatalkan pembayaran yang menunggu, petunjuk pembayaran semula akan menjadi tidak valid. Bagi kebanyakan kasus penggunaan, kami menyarankan Anda untuk menghubungi pelanggan untuk menginformasikan tentang pembatalan ini.

Ketika Anda berhasil memastikan kembali PaymentIntent dalam status requires_action kami membuat petunjuk baru dan hosted_voucher_url baru. Anda harus memastikan bahwa pelanggan Anda mengetahui tentang hal ini.

Tangani masalah ketersediaan sementara

Kode kesalahan berikut mengindikasikan masalah sementara pada ketersediaan metode pembayaran:

KodeKeteranganPenanganan
payment_method_rate_limit_exceededAda terlalu banyak permintaan yang dibuat dalam waktu berdekatan untuk metode pembayaran ini, yang memiliki batas lebih ketat daripada batas rasio API secara keseluruhan.Mencoba kembali dengan backoff pada umumnya akan menyelesaikan situasinya. Namun demikian, dalam hal penggunaan metode pembayaran yang tinggi secara terus menerus (misalnya selama masa diskon yang sedang berlangsung di situs web Anda) kesalahan ini dapat tetap ada pada sejumlah permintaan. Jika ini terjadi, meminta pelanggan untuk memilih metode pembayaran yang berbeda dapat menjadi opsi mitigasi tambahan.
payment_method_not_availableMetode pembayaran mengalami masalah sementara yang tidak diketahui yang berpotensi untuk terjadi selama beberapa waktu (misalnya saat aliran listrik mati atau periode pemeliharaan terjadwal).Sebaiknya undang pengguna untuk menyelesaikan pembelian mereka dengan metode pembayaran berbeda atau coba lagi nanti.

Peringatan

Jika Anda mengantisipasi penggunaan yang tinggi atau untuk acara mendatang, hubungi kami jauh hari sebelumnya.

Pengembalian dana

Pembayaran pengembalian dana Konbini dapat dilakukan melalui Dashboard atau API.

Untuk menyelesaikan pengembalian dana yang dikirim ke rekening bank pelanggan secara langsung, pelanggan Anda harus memberikan detail rekening bank untuk menerima dana tersebut. Stripe menghubungi pelanggan di alamat email dari detail tagihan pada metode pembayaran dan meminta detail ini dari mereka. Setelah menerima detail bank, kami akan memproses pengembalian dana secara otomatis.

Transisi status pengembalian dana sebagai berikut:

KejadianStatus pengembalian dana
Pengembalian dana dibuatrequires_action
Pelanggan menyerahkan detail rekening bank, dan Stripe mulai memproses pengembalian dananyapending
Pengembalian dana diperkirakan masuk di bank pelanggansucceeded
Bank pelanggan mengembalikan dana ke Striperequires_action
Pengembalian dana dalam requires_action 45 hari setelah pembuatanfailed
Pengembalian dana dibatalkan dari status requires_actioncanceled

Jika bank pelanggan tidak berhasil menyelesaikan transfer, dana dikembalikan ke Stripe dan transisi pengembalian dana ke requires_action. Hal ini dapat terjadi jika nama pemegang rekening tidak sesuai dengan yang tercatat di bank penerima atau jika nomor rekening bank yang diberikan salah ketik. Dalam kasus ini, Stripe mengirim email kepada pelanggan untuk memberitahukan kegagalan dan meminta mereka mengirimkan kembali detail rekening banknya.

Jika pelanggan Anda tidak memberikan detail rekening banknya dalam waktu 45 hari, status pengembalian dana bertransisi ke failed dan kami mengirim kejadian refund.failed. Ini berarti bahwa Stripe tidak dapat memproses pengembalian dana, dan Anda harus mengembalikan dana kepada pelanggan di luar Stripe.

Bidang instructions_email pada pengembalian dana merupakan email yang dikirimi pengembalian dana. Meski pengembalian dana menunggu tanggapan dari pelanggan, detail email yang dikirim kepada pelanggan juga dapat ditemukan di bawah bidang next_action.display_details.email_sent pada pengembalian dana.

Setiap pengembalian dana perorangan (termasuk setiap pengembalian dana sebagian) dapat dikenakan biaya. Hubungilah kontak Anda di Stripe untuk mempelajari selengkapnya tentang hal ini.

Mencoba Pengembalian Dana

Anda dapat mencoba perilaku pengembalian dana dalam mode percobaan menggunakan rekening bank percobaan berikut ini di halaman pengumpulan detail rekening bank yang ditautkan dalam email yang dikirim kepada pelanggan. Detail rekening bank di luar rekening bank percobaan ini tidak akan diterima.

RoutingAkunTipe
11000000001234Pengembalian dana berhasil.

1100000

1111113

1111116

1111113

3333335

4444440

Pengembalian dana gagal.

Mencoba Kedaluwarsa Pengembalian Dana

Anda dapat melakukan panggilan API untuk menyimulasikan berakhirnya pengembalian dana mode percobaan.

Command Line
curl https://api.stripe.com/v1/test_helpers/refunds/{{REFUND_ID}}/expire \ -X POST \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
Apakah halaman ini membantu?
YaTidak
Butuh bantuan? Hubungi Tim CS.
Bergabunglah dengan program akses awal kami.
Lihat log perubahan kami.
Ada pertanyaan? Hubungi Bagian Penjualan.
LLM? Baca llms.txt.
Dijalankan oleh Markdoc