# Pembaruan status pembayaran Pantau dan verifikasikan status pembayaran, sehingga Anda dapat merespons pembayaran yang berhasil dan gagal. Pembaruan *PaymentIntents* (The Payment Intents API tracks the lifecycle of a customer checkout flow and triggers additional authentication steps when required by regulatory mandates, custom Radar fraud rules, or redirect-based payment methods) sebagai respons atas tindakan yang diambil oleh pelanggan atau metode pembayaran. Integrasi Anda dapat memeriksa PaymentIntent untuk menentukan status proses pembayaran, sehingga Anda dapat mengambil tindakan bisnis atau merespons keadaan yang memerlukan intervensi lebih lanjut. Anda juga dapat menggunakan Dashboard Stripe untuk mengonfigurasi akun untuk mengirim email tentang status pembayaran, seperti pembayaran yang berhasil. Ubah [notifikasi email](https://docs.stripe.com/get-started/account/teams.md#email-notifications) Anda di [pengaturan pengguna](https://dashboard.stripe.com/settings/user). ## Periksa status PaymentIntent di client Ketika menyelesaikan pembayaran di client dengan fungsi [confirmCardPayment](https://docs.stripe.com/js.md#stripe-confirm-card-payment), Anda dapat memeriksa PaymentIntent yang dikembalikan untuk menentukan statusnya saat ini: ```javascript (async () => { const {paymentIntent, error} = await stripe.confirmCardPayment(clientSecret); if (error) { // Handle error here } else if (paymentIntent && paymentIntent.status === 'succeeded') { // Handle successful payment here } })(); ``` Berikut ini adalah kemungkinan hasil dari penggunaan fungsi `confirmCardPayment`: | **Kejadian** | **Apa yang Terjadi** | **Perkiraan Integrasi** | | --------------------------------- | ----------------------------------------------------------- | -------------------------------------------------------------------------------- | | Diselesaikan dengan PaymentIntent | Pelanggan menyelesaikan pembayaran di halaman checkout Anda | Informasikan kepada pelanggan bahwa pembayaran mereka berhasil | | Diselesaikan dengan kesalahan | Pembayaran pelanggan gagal di halaman checkout Anda | Tampilkan pesan kesalahan dan minta pelanggan Anda untuk mencoba pembayaran lagi | Janji yang dikembalikan oleh `confirmCardPayment` diselesaikan bila proses pembayaran telah selesai atau gagal dengan kesalahan. Jika berhasil diselesaikan dan mengembalikan PaymentIntent, statusnya akan selalu `succeeded` (atau `requires_capture` jika [menarik nanti](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method.md)). Bila pembayaran memerlukan langkah tambahan seperti autentikasi, janji tidak akan diselesaikan hingga langkah itu selesai atau waktunya habis. ## Periksa status PaymentIntent di client tanpa menggunakan confirmCardPayment Untuk memeriksa status PaymentIntent tanpa menggunakan fungsi `confirmCardPayment`, ambil secara tersendiri dengan menggunakan fungsi [retrievePaymentIntent](https://docs.stripe.com/js/payment_intents/retrieve_payment_intent) dan meneruskan *client secret* (The client secret is a unique key returned from Stripe as part of a PaymentIntent. This key lets the client access important fields from the PaymentIntent (status, amount, currency) while hiding sensitive ones (metadata, customer)). ```javascript (async () => { const {paymentIntent} = await stripe.retrievePaymentIntent(clientSecret); if (paymentIntent && paymentIntent.status === 'succeeded') { // Handle successful payment here } else { // Handle unsuccessful, processing, or canceled payments and API errors here } })(); ``` Berikut ini adalah beberapa [kemungkinan status](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-status) dari PaymentIntent setelah konfirmasi: | **Apa yang Terjadi** | **Perkiraan Status PaymentIntent** | | ----------------------------------------------------------- | ---------------------------------- | | Pelanggan menyelesaikan pembayaran di halaman checkout Anda | `succeeded` | | Pelanggan tidak menyelesaikan checkout | `requires_action` | | Pembayaran pelanggan gagal di halaman checkout Anda | `requires_payment_method` | [Baca lebih lanjut tentang status PaymentIntent](https://docs.stripe.com/payments/paymentintents/lifecycle.md). ## Pantau PaymentIntent dengan webhook Stripe dapat mengirim kejadian *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) ke server Anda untuk memberitahukan bila status PaymentIntent berubah, yang dapat Anda gunakan untuk keperluan seperti penentuan kapan akan memenuhi barang dan layanan. Jangan mencoba menangani *pemenuhan* (Fulfillment is the process of providing the goods or services purchased by a customer, typically after payment is collected) pesanan di sisi client karena pelanggan dapat meninggalkan halaman setelah pembayaran selesai tetapi sebelum proses pemenuhan dimulai. Sebagai gantinya, gunakan webhook untuk memantau kejadian `payment_intent.succeeded` dan menangani penyelesaiannya secara asinkron, bukan mencoba memulai pemenuhan di sisi client. > Secara teknis dimungkinkan penggunaan penjajakan bukannya webhook untuk memantau perubahan yang disebabkan oleh operasi asinkron—mengambil PaymentIntent berulang kali sehingga Anda dapat memeriksa statusnya—tetapi melakukannya kurang dapat diandalkan dan dapat menyebabkan masalah pembatasan rasio. Stripe memberlakukan [pembatasan tingkat](https://docs.stripe.com/testing.md#rate-limits) pada permintaan API, jadi berhati-hatilah jika Anda memutuskan penggunaan penjajakan. Untuk menangani kejadian webhook, buat rute di server Anda dan konfigurasikan endpoint webhook yang sesuai [di Dashboard](https://dashboard.stripe.com/account/webhooks). Stripe mengirimkan kejadian `payment_intent.succeeded` bila pembayaran berhasil, dan kejadian `payment_intent.payment_failed` bila pembayaran gagal. Payload webhook melampirkan objek PaymentIntent. Contoh berikut menunjukkan cara menangani kedua kejadian tersebut: #### Ruby ```ruby require 'sinatra' require 'stripe' post '/webhook' do payload = request.body.read sig_header = request.env['HTTP_STRIPE_SIGNATURE'] event = nil begin event = Stripe::Webhook.construct_event( payload, sig_header, endpoint_secret ) rescue JSON::ParserError => e # Invalid payload status 400 return rescue Stripe::SignatureVerificationError => e # Invalid signature status 400 return end case event['type'] when 'payment_intent.succeeded' intent = event['data']['object'] puts "Succeeded:", intent['id'] # Fulfill the customer's purchase when 'payment_intent.payment_failed' intent = event['data']['object'] error_message = intent['last_payment_error'] && intent['last_payment_error']['message'] puts "Failed:", intent['id'], error_message # Notify the customer that payment failed end status 200 end ``` Bila pembayaran tidak berhasil, Anda dapat menemukan detail selengkapnya dengan memeriksa properti `last_payment_error` PaymentIntent. Anda dapat memberi tahu pelanggan bahwa pembayaran mereka belum selesai dan mendorong mereka untuk mencoba lagi dengan metode pembayaran yang berbeda. Gunakan kembali PaymentIntent yang sama untuk terus melacak pembelian pelanggan. ### Menangani kejadian webhook tertentu Daftar berikut menerangkan cara menangani kejadian webhook: | Kejadian | Keterangan | Langkah berikutnya | | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | | `processing` | The customer’s payment was submitted to Stripe successfully. Only applicable to payment methods with [delayed success confirmation](https://docs.stripe.com/payments/payment-methods.md#payment-notification). | Tunggu pembayaran yang diprakarsai berhasil atau gagal. | | `succeeded` | The customer’s payment succeeded. | Fulfill the purchased goods or services. | | `amount_capturable_updated` | The customer’s payment is authorized and ready for capture. | Capture the funds that are available for payment. | | `payment_failed` | The customer’s payment was declined by a card network or otherwise expired. | Reach out to your customer through email or push notification and prompt them to provide another payment method. | Untuk mencoba webhook secara lokal, Anda dapat menggunakan [Stripe CLI](https://docs.stripe.com/stripe-cli.md). Setelah menginstalnya, Anda dapat meneruskan kejadian ke server: ```bash stripe listen --forward-to localhost:4242/webhook Ready! Your webhook signing secret is '{{WEBHOOK_SIGNING_SECRET}}' (^C to quit) ``` Pelajari selengkapnya tentang [penyiapan webhook](https://docs.stripe.com/webhooks.md). ## Mengidentifikasi charge di PaymentIntent Bila Anda mencoba untuk menagih pembayaran dari pelanggan, PaymentIntent membuat [Charge](https://docs.stripe.com/api/charges.md). Untuk mendapatkan identifikasi charge terbaru, periksa properti [latest_charge](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-latest_charge) PaymentIntent: #### Ruby ```ruby # Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. # Find your keys at https://dashboard.stripe.com/apikeys. Stripe.api_key = '<>' intent = Stripe::PaymentIntent.retrieve('{{PAYMENT_INTENT_ID}}') latest_charge = intent.latest_charge ``` Untuk melihat semua charge yang dikaitkan dengan PaymentIntent, termasuk charge yang tidak berhasil, [cantumkan semua charge](https://docs.stripe.com/api/charges/list.md#list_charges-payment_intent) dan tentukan parameter `payment_intent​`. ```curl curl -G https://api.stripe.com/v1/charges \ -u "<>:" \ -d payment_intent="{{PAYMENTINTENT_ID}}" ``` ## Menangani tindakan berikutnya Beberapa metode pembayaran memerlukan langkah tambahan, seperti autentikasi, guna menyelesaikan proses pembayaran. Stripe.js menangani ini secara otomatis ketika mengonfirmasi PaymentIntent, tetapi jika Anda memiliki integrasi lanjutan, Anda mungkin ingin menangani secara manual. Properti [next_action](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-next_action) PaymentIntent menunjukkan langkah berikutnya yang harus ditangani integrasi Anda guna menyelesaikan pembayaran. Tipe dari kemungkinan tindakan berikutnya dapat berbeda di antara berbagai metode pembayaran. Anda dapat menemukan daftar lengkap tindakan berikutnya yang mungkin dalam dokumentasi [API](https://docs.stripe.com/api.md#payment_intent_object-next_action-type). Anda dapat membaca [dokumentasi metode pembayaran](https://docs.stripe.com/payments/payment-methods/overview.md) untuk mengetahui detail selengkapnya tentang cara menangani tindakan berikutnya yang diperlukan.