# Penanganan kesalahan Tangkap dan berikan respons terhadap penolakan, data yang tidak valid, masalah jaringan, dan lainnya. Stripe menawarkan berbagai jenis kesalahan. Jenis kesalahan tersebut dapat mencerminkan kejadian eksternal, seperti pembayaran yang ditolak dan gangguan jaringan, atau masalah kode, seperti panggilan API yang tidak valid. ## Uraikan data kesalahan Bila Stripe mengembalikan kesalahan ke permintaan API, Anda menerima detail tentang kesalahan yang membantu Anda memahami cara menerapkan saran penanganan dalam panduan ini. Detail ini juga membantu Anda memberikan informasi penting ke dukungan Stripe, jika dibutuhkan. | Properti | Deskripsi | | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `code` | Kode kesalahan. | | `doc_url` | Tautan ke dokumentasi Stripe untuk kode kesalahan spesifik. | | `message` | Keterangan alasan kesalahan. | | `param` | Parameter permintaan yang menyebabkan kesalahan. | | `request_log_url` | Tautan ke Dashboard Stripe tempat Anda dapat melihat log mendetail tentang permintaan asal dan kesalahannya. | | Identifikasi permintaan | Pengidentifikasi unik untuk permintaan asal yang mengalami kesalahan. Header respons kesalahan menyertakan nilai ini (string yang dimulai dengan `req`), tetapi Anda dapat menentukan cetakan dalam permintaan, seperti yang diperlihatkan dalam sampel kode di panduan ini. | | `type` | Referensi ke kategori kesalahan yang dimiliki kesalahan ini. | Untuk menangani kesalahan, gunakan beberapa atau semua teknik dalam tabel di bawah ini. Apa pun teknik yang digunakan, Anda dapat menindaklanjutinya dengan [respons yang direkomendasikan untuk setiap tipe kesalahan](https://docs.stripe.com/error-handling.md#error-types) kami. | Teknik | Tujuan | Bila dibutuhkan | | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------- | --------------- | | [Tangkap pengecualian](https://docs.stripe.com/error-handling.md#catch-exceptions) | Memulihkan ketika panggilan API tidak dapat dilanjutkan | Selalu | | [Pantau webhook](https://docs.stripe.com/error-handling.md#monitor-webhooks) | Bereaksi terhadap notifikasi dari Stripe | Terkadang | | [Dapatkan informasi tersimpan tentang kegagalan](https://docs.stripe.com/error-handling.md#use-stored-information) | Selidiki masalah masa lalu dan dukung teknik lainnya | Terkadang | ## Tangkap pengecualian Dengan pustaka ini, Anda tidak perlu memeriksa respons HTTP non-200. Pustaka ini menerjemahkannya sebagai pengecualian. Dalam kejadian langka, Anda membutuhkan detail HTTP, lihat [Penanganan pengecualian tingkat rendah](https://docs.stripe.com/error-low-level.md) dan objek [Kesalahan](https://docs.stripe.com/api/errors.md). Jika sebuah masalah langsung mencegah panggilan API untuk dilanjutkan, pustaka Ruby Stripe memunculkan sebuah pengecualian. Praktik terbaiknya adalah untuk menangkap dan menangani pengecualian. Untuk menangkap pengecualian, gunakan kata kunci `rescue` Ruby. Tangkap `Stripe::StripeError` atau subkelasnya hanya untuk menangani pengecualian khusus Stripe. Setiap subkelas mewakili jenis pengecualian yang berbeda. Saat menangkap pengecualian, Anda dapat [menggunakan kelasnya untuk memilih respons](https://docs.stripe.com/error-handling.md#error-types). | Teknik | Tujuan | Bila dibutuhkan | | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------- | --------------- | | [Tangkap pengecualian](https://docs.stripe.com/error-handling.md#catch-exceptions) | Memulihkan ketika panggilan API tidak dapat dilanjutkan | Selalu | | [Pantau webhook](https://docs.stripe.com/error-handling.md#monitor-webhooks) | Bereaksi terhadap notifikasi dari Stripe | Terkadang | | [Dapatkan informasi tersimpan tentang kegagalan](https://docs.stripe.com/error-handling.md#use-stored-information) | Selidiki masalah masa lalu dan dukung teknik lainnya | Terkadang | ## Tangkap pengecualian Dengan pustaka ini, Anda tidak perlu memeriksa respons HTTP non-200. Pustaka ini menerjemahkannya sebagai pengecualian. Dalam kejadian langka, Anda membutuhkan detail HTTP, lihat [Penanganan pengecualian tingkat rendah](https://docs.stripe.com/error-low-level.md) dan objek [Kesalahan](https://docs.stripe.com/api/errors.md). Jika masalah nyata mencegah kelanjutan panggilan API, pustaka Stripe Python akan memunculkan pengecualian. Merupakan praktik terbaik untuk menangkap dan menangani pengecualian. Untuk menangkap pengecualian, gunakan sintaks `try`/`except` Python. Tangkap `stripe.StripeError` atau subkelasnya hanya untuk menangani pengecualian khusus Stripe. Setiap subkelas mewakili jenis pengecualian yang berbeda. Saat menangkap pengecualian, Anda dapat [menggunakan kelasnya untuk memilih respons](https://docs.stripe.com/error-handling.md#error-types). | Teknik | Tujuan | Bila dibutuhkan | | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------- | --------------- | | [Tangkap pengecualian](https://docs.stripe.com/error-handling.md#catch-exceptions) | Memulihkan ketika panggilan API tidak dapat dilanjutkan | Selalu | | [Pantau webhook](https://docs.stripe.com/error-handling.md#monitor-webhooks) | Bereaksi terhadap notifikasi dari Stripe | Terkadang | | [Dapatkan informasi tersimpan tentang kegagalan](https://docs.stripe.com/error-handling.md#use-stored-information) | Selidiki masalah masa lalu dan dukung teknik lainnya | Terkadang | ## Tangkap pengecualian Dengan pustaka ini, Anda tidak perlu memeriksa respons HTTP non-200. Pustaka ini menerjemahkannya sebagai pengecualian. Dalam kejadian langka, Anda membutuhkan detail HTTP, lihat [Penanganan pengecualian tingkat rendah](https://docs.stripe.com/error-low-level.md) dan objek [Kesalahan](https://docs.stripe.com/api/errors.md). Jika masalah nyata mencegah kelanjutan panggilan API, pustaka Stripe PHP akan memunculkan pengecualian. Merupakan praktik terbaik untuk menangkap dan menangani pengecualian. Untuk menangkap pengecualian, gunakan sintaks `try`/`catch` PHP. Stripe menyediakan beberapa kelas pengecualian yang bisa Anda tangkap. Masing-masing mewakili jenis kesalahan yang berbeda. Saat Anda menangkap pengecualian, Anda dapat [menggunakan kelasnya untuk memilih respons](https://docs.stripe.com/error-handling.md#error-types). | Teknik | Tujuan | Bila dibutuhkan | | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------- | --------------- | | [Tangkap pengecualian](https://docs.stripe.com/error-handling.md#catch-exceptions) | Memulihkan ketika panggilan API tidak dapat dilanjutkan | Selalu | | [Pantau webhook](https://docs.stripe.com/error-handling.md#monitor-webhooks) | Bereaksi terhadap notifikasi dari Stripe | Terkadang | | [Dapatkan informasi tersimpan tentang kegagalan](https://docs.stripe.com/error-handling.md#use-stored-information) | Selidiki masalah masa lalu dan dukung teknik lainnya | Terkadang | ## Tangkap pengecualian Dengan pustaka ini, Anda tidak perlu memeriksa respons HTTP non-200. Pustaka ini menerjemahkannya sebagai pengecualian. Dalam kejadian langka, Anda membutuhkan detail HTTP, lihat [Penanganan pengecualian tingkat rendah](https://docs.stripe.com/error-low-level.md) dan objek [Kesalahan](https://docs.stripe.com/api/errors.md). Jika masalah nyata mencegah kelanjutan panggilan API, pustaka Stripe Java akan memunculkan pengecualian. Merupakan praktik terbaik untuk menangkap dan menangani pengecualian. Untuk menangkap pengecualian, gunakan sintaks `try`/`catch` Java. Tangkap `StripeException` atau subkelasnya hanya untuk menangani pengecualian khusus Stripe. Setiap subkelas mewakili jenis pengecualian yang berbeda. Saat menangkap pengecualian, Anda dapat [menggunakan kelasnya untuk memilih respons](https://docs.stripe.com/error-handling.md#error-types). | Teknik | Tujuan | Bila dibutuhkan | | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------- | --------------- | | [Tangkap pengecualian](https://docs.stripe.com/error-handling.md#catch-exceptions) | Memulihkan ketika panggilan API tidak dapat dilanjutkan | Selalu | | [Pantau webhook](https://docs.stripe.com/error-handling.md#monitor-webhooks) | Bereaksi terhadap notifikasi dari Stripe | Terkadang | | [Dapatkan informasi tersimpan tentang kegagalan](https://docs.stripe.com/error-handling.md#use-stored-information) | Selidiki masalah masa lalu dan dukung teknik lainnya | Terkadang | ## Tangkap pengecualian Dengan pustaka ini, Anda tidak perlu memeriksa respons HTTP non-200. Pustaka ini menerjemahkannya sebagai pengecualian. Dalam kejadian langka, Anda membutuhkan detail HTTP, lihat [Penanganan pengecualian tingkat rendah](https://docs.stripe.com/error-low-level.md) dan objek [Kesalahan](https://docs.stripe.com/api/errors.md). Jika masalah nyata mencegah berlanjutnya panggilan API, pustaka Node.js Stripe dapat memunculkan pengecualian. Ini merupakan praktik terbaik guna menangkap dan menangani pengecualian. Untuk mengaktifkan munculnya pengecualian serta menangkap pengecualian, lakukan hal berikut: - Jika Anda membuat panggilan API dalam sebuah fungsi, awali definisi fungsi dengan kata kunci `async`. - Awali panggilan API itu sendiri dengan kata kunci `await`. - Bungkus panggilan API dalam blok `try`/`catch`. Saat menangkap pengecualian, Anda dapat [menggunakan atribut tipenya untuk memilih respons](https://docs.stripe.com/error-handling.md#error-types). | Teknik | Tujuan | Bila dibutuhkan | | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------- | --------------- | | [Gunakan nilai kesalahan](https://docs.stripe.com/error-handling.md#catch-exceptions) | Memulihkan ketika panggilan API tidak dapat dilanjutkan | Selalu | | [Pantau webhook](https://docs.stripe.com/error-handling.md#monitor-webhooks) | Bereaksi terhadap notifikasi dari Stripe | Terkadang | | [Dapatkan informasi tersimpan tentang kegagalan](https://docs.stripe.com/error-handling.md#use-stored-information) | Selidiki masalah masa lalu dan dukung teknik lainnya | Terkadang | ## Gunakan nilai kesalahan Dengan pustaka ini, Anda tidak perlu memeriksa respons HTTP non-200. Pustaka ini menerjemahkannya menjadi nilai kesalahan. Dalam kejadian langka, Anda membutuhkan detail HTTP, lihat [Penanganan pengecualian tingkat rendah](https://docs.stripe.com/error-low-level.md) dan objek [Kesalahan](https://docs.stripe.com/api/errors.md). Panggilan API di pustaka Stripe Go mengembalikan nilai hasil dan nilai kesalahan. Gunakan beberapa tugas untuk menangkap keduanya. Jika nilai kesalahan bukan `nil`, berarti ada masalah nyata yang mencegah kelanjutan panggilan API. Jika nilai kesalahan terkait dengan Stripe, Anda dapat mentransmisikannya ke objek `stripe.Error`, yang memiliki bidang berisi keterangan masalah. [Gunakan bidang Type untuk memilih respons](https://docs.stripe.com/error-handling.md#error-types). Dalam sejumlah kasus, Anda dapat memaksa properti `Err` ke tipe kesalahan yang lebih spesifik dengan informasi tambahan. | Teknik | Tujuan | Bila dibutuhkan | | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------- | --------------- | | [Tangkap pengecualian](https://docs.stripe.com/error-handling.md#catch-exceptions) | Memulihkan ketika panggilan API tidak dapat dilanjutkan | Selalu | | [Pantau webhook](https://docs.stripe.com/error-handling.md#monitor-webhooks) | Bereaksi terhadap notifikasi dari Stripe | Terkadang | | [Dapatkan informasi tersimpan tentang kegagalan](https://docs.stripe.com/error-handling.md#use-stored-information) | Selidiki masalah masa lalu dan dukung teknik lainnya | Terkadang | ## Tangkap pengecualian Dengan pustaka ini, Anda tidak perlu memeriksa respons HTTP non-200. Pustaka ini menerjemahkannya menjadi pengecualian. Dalam kejadian langka, Anda membutuhkan detail HTTP, lihat [Penanganan pengecualian tingkat rendah](https://docs.stripe.com/error-low-level.md) dan objek [Kesalahan](https://docs.stripe.com/api/errors.md). Jika masalah nyata mencegah kelanjutan panggilan API, pustaka Stripe .NET memunculkan pengecualian. Merupakan praktik terbaik untuk menangkap dan menangani pengecualian. Untuk menangkap pengecualian, gunakan sintaks `try`/`catch` .NET. Tangkap `StripeException`, lalu [gunakan atribut Type untuk memilih respons](https://docs.stripe.com/error-handling.md#error-types). #### PHP ```php >'); function example_function($args) { try { $stripe->paymentIntents->create($args); error_log("No error."); } catch(\Stripe\Exception\CardException $e) { error_log("A payment error occurred: {$e->getError()->message}. (request id: {$e->getRequestId()})"); } catch (\Stripe\Exception\InvalidRequestException $e) { error_log("An invalid request occurred. (request id: {$e->getRequestId()})"); // Add additional catch cases for other Stripe exception types as needed. // See all exception types at https://docs.stripe.com/api/errors/handling?lang=php } catch (\Stripe\Exception\ApiErrorException $e) { // All other Stripe API errors error_log("Status: " . $e->getHttpStatus() . ", Code: " . $e->getStripeCode() . ", Message: " . $e->getMessage() . ", Request ID: " . $e->getRequestId()); } catch (Exception $e) { error_log("Another problem occurred, maybe unrelated to Stripe."); } } ``` Setelah menyiapkan penanganan pengecualian, coba pada berbagai data, termasuk [kartu percobaan](https://docs.stripe.com/testing.md), untuk menyimulasikan hasil pembayaran yang berbeda. #### Kesalahan untuk memicu - Permintaan tidak valid #### PHP ```php example_function([ // The required parameter currency is missing 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_visa', // Ini adalah kartu percobaan yang selalu berhasil bila Anda menggunakannya di lingkungan percobaan. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` An invalid request occurred. ``` #### Kesalahan untuk memicu - Kesalahan kartu #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_chargeDeclinedFraudulent', // Ini adalah kartu percobaan yang selalu menghasilkan kesalahan pembayaran charge penipuan. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` A payment error occurred: Your card was declined. ``` #### Kesalahan untuk memicu - Tidak ada kesalahan #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_visa', // Ini adalah kartu percobaan yang selalu berhasil bila Anda menggunakannya di lingkungan percobaan. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` No error. ``` ## Pantau webhook Stripe memberi tahu Anda tentang berbagai macam masalah menggunakan *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests). Ini termasuk masalah yang tidak langsung muncul setelah panggilan API. Sebagai contoh: - Anda kalah dalam sengketa. - Pembayaran rutin gagal setelah berbulan-bulan keberhasilan. - Frontend Anda *mengkonfirmasi* (Confirming a PaymentIntent indicates that the customer intends to pay with the current or provided payment method. Upon confirmation, the PaymentIntent attempts to initiate a payment) pembayaran, tetapi menjadi offline sebelum mengetahui bahwa pembayaran gagal. (Backend masih menerima notifikasi webhook, meskipun bukan yang melakukan panggilan API Anda tidak perlu menangani setiap tipe event webhook. Bahkan, beberapa integrasi tidak menangani satu pun. Di handler webhook Anda, mulai dengan langkah-langkah dasar dari [pembangun webhook](https://docs.stripe.com/webhooks/quickstart.md): dapatkan objek kejadian dan gunakan tipe kejadian untuk mengetahui apa yang terjadi. Kemudian, jika tipe kejadian mengindikasikan kesalahan, ikuti langkah-langkah ekstra ini: 1. Akses [event.data.object](https://docs.stripe.com/api/events/object.md#event_object-data-object) untuk mengambil objek yang terpengaruh. 1. [Gunakan informasi tersimpan](https://docs.stripe.com/error-handling.md#use-stored-information) pada objek yang terpengaruh untuk mendapatkan konteks, termasuk objek kesalahan. 1. [Gunakan tipenya untuk memilih respons](https://docs.stripe.com/error-handling.md#error-types). 1. Akses [event[‘data’][‘object’]](https://docs.stripe.com/api/events/object.md#event_object-data-object) untuk mengambil objek yang terpengaruh. 1. [Gunakan informasi tersimpan](https://docs.stripe.com/error-handling.md#use-stored-information) pada objek yang terpengaruh untuk mendapatkan konteks, termasuk objek kesalahan. 1. [Gunakan tipenya untuk memilih respons](https://docs.stripe.com/error-handling.md#error-types). 1. Akses [event->data->object](https://docs.stripe.com/api/events/object.md#event_object-data-object) untuk mengambil objek yang terpengaruh. 1. [Gunakan informasi tersimpan](https://docs.stripe.com/error-handling.md#use-stored-information) pada objek yang terpengaruh untuk mendapatkan konteks, termasuk objek kesalahan. 1. [Gunakan tipenya untuk memilih respons](https://docs.stripe.com/error-handling.md#error-types). 1. Dapatkan objek yang terpengaruh menggunakan `EventDataObjectDeserializer` dan transmisikan outputnya ke tipe yang sesuai. 1. [Gunakan informasi tersimpan](https://docs.stripe.com/error-handling.md#use-stored-information) pada objek yang terpengaruh untuk mendapatkan konteks, termasuk objek kesalahan. 1. [Gunakan tipenya untuk memilih respons](https://docs.stripe.com/error-handling.md#error-types). 1. Akses [event.data.object](https://docs.stripe.com/api/events/object.md#event_object-data-object) untuk mengambil objek yang terpengaruh. 1. [Gunakan informasi tersimpan](https://docs.stripe.com/error-handling.md#use-stored-information) pada objek yang terpengaruh untuk mendapatkan konteks, termasuk objek kesalahan. 1. [Gunakan tipenya untuk memilih respons](https://docs.stripe.com/error-handling.md#error-types). 1. Dapatkan objek yang terpengaruh dengan membongkar data dari `event.Data.Raw`. 1. [Gunakan informasi tersimpan](https://docs.stripe.com/error-handling.md#use-stored-information) pada objek yang terpengaruh untuk mendapatkan konteks, termasuk objek kesalahan. 1. [Gunakan tipenya untuk memilih respons](https://docs.stripe.com/error-handling.md#error-types). 1. Dapatkan objek yang terpengaruh dengan mentransmisikan [stripeEvent.Data.Object](https://docs.stripe.com/api/events/object.md#event_object-data-object) ke tipe yang sesuai. 1. [Gunakan informasi tersimpan](https://docs.stripe.com/error-handling.md#use-stored-information) pada objek yang terpengaruh untuk mendapatkan konteks, termasuk objek kesalahan. 1. [Gunakan tipenya untuk memilih respons](https://docs.stripe.com/error-handling.md#error-types). #### PHP ```php >'); $payload = @file_get_contents('php://input'); $event = null; // Get the event object try { $event = \Stripe\Event::constructFrom( json_decode($payload, true) ); } catch(\UnexpectedValueException $e) { echo '⚠️ Webhook error while parsing basic request.'; http_response_code(400); exit(); } // Use the event type to find out what happened if ($event->type == 'payment_intent.payment_failed') { // Get the object affected $paymentIntent = $event->data->object; // Use stored information to get an error object $e = $paymentIntent->last_payment_error; // Use its type to choose a response switch ($e->type) { case \Stripe\Exception\CardException: error_log("A payment error occurred: {$e->getError()->message}"); break; case \Stripe\Exception\InvalidRequestException: error_log("An invalid request occurred."); if (isset($e->getError()->param)) { error_log("The parameter {$e->getError()->param} is invalid or missing."); } break; default: error_log("Another problem occurred, maybe unrelated to Stripe."); } } http_response_code(200); ``` Untuk mencoba cara integrasi menanggapi kejadian webhook, Anda dapat [memicu kejadian webhook secara lokal](https://docs.stripe.com/webhooks.md#test-webhook). Setelah menyelesaikan langkah-langkah penyiapan di tautan itu, picu pembayaran yang gagal untuk melihat pesan kesalahan yang dihasilkan. ```bash stripe trigger payment_intent.payment_failed ``` ```bash A payment error occurred: Your card was declined. ``` ## Dapatkan informasi tersimpan tentang kegagalan Banyak objek menyimpan informasi tentang kegagalan. Artinya, jika terjadi kesalahan, Anda dapat mengambil objek dan memeriksanya untuk mempelajari lebih lanjut. Dalam banyak kasus, informasi yang disimpan dalam bentuk objek kesalahan, dan Anda dapat [menggunakan tipenya untuk memilih respons](https://docs.stripe.com/error-handling.md#error-types). Misalnya: 1. Ambil tujuan pembayaran tertentu. 1. Periksa apakah telah mengalami kesalahan pembayaran dengan menentukan apakah [last_payment_error](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-last_payment_error) kosong. 1. Jika demikian, catat kesalahannya, termasuk tipenya dan objek yang terpengaruh. #### PHP ```php >'); $payment_intent = $stripe->paymentIntents->retrieve(% identifier type="paymentIntent" /%}); $e = $payment_intent->last_payment_error; if (isset($e)) { error_log("PaymentIntent {$payment_intent->id} experienced a {$e->getError()->type} error."); } ``` Berikut adalah objek umum yang menyimpan informasi tentang kegagalan. | Objek | Atribut | Nilai | | ---------------------------------------------------------------- | ------------------------- | -------------------------------------------------------------------------------------------------------------- | | [Payment Intent](https://docs.stripe.com/api/payment_intents.md) | `last_payment_error` | [Objek kesalahan](https://docs.stripe.com/error-handling.md#work-with-error-objects) | | [Setup Intent](https://docs.stripe.com/api/setup_intents.md) | `last_setup_error` | [Objek kesalahan](https://docs.stripe.com/error-handling.md#work-with-error-objects) | | [Invoice](https://docs.stripe.com/api/invoices.md) | `last_finalization_error` | [Objek kesalahan](https://docs.stripe.com/error-handling.md#work-with-error-objects) | | [Upaya Penyiapan](https://docs.stripe.com/api/setup_attempts.md) | `setup_error` | [Objek kesalahan](https://docs.stripe.com/error-handling.md#work-with-error-objects) | | [Payout](https://docs.stripe.com/api/payouts.md) | `failure_code` | [Kode kegagalan payout](https://docs.stripe.com/api/payouts/failures.md) | | [Pengembalian dana](https://docs.stripe.com/api/refunds.md) | `failure_reason` | [Kode kegagalan pengembalian dana](https://docs.stripe.com/api/refunds/object.md#refund_object-failure_reason) | Untuk mencoba kode yang menggunakan informasi tersimpan tentang kegagalan, sering kali Anda perlu menyimulasikan transaksi yang gagal. Anda dapat sering melakukannya menggunakan [kartu percobaan](https://docs.stripe.com/testing.md) atau nomor bank percobaan. Misalnya: - [Simulasikan pembayaran yang ditolak](https://docs.stripe.com/testing.md#declined-payments), untuk membuat Charges, PaymentIntents, SetupIntents, dan sebagainya yang telah gagal. - [Simulasikan payout yang gagal](https://docs.stripe.com/connect/testing.md#account-numbers). - [Simulasikan pengembalian dana yang gagal](https://docs.stripe.com/testing.md#refunds). ## Tipe kesalahan dan respons Di pustaka Ruby Stripe, objek kesalahan dimiliki oleh `stripe.error.StripeError` dan subkelasnya. Gunakan dokumentasi bagi setiap kelas untuk saran dalam merespons. | Nama | Kelas | Keterangan | | --------------------------------- | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Kesalahan pembayaran | [Stripe::CardError](https://docs.stripe.com/error-handling.md#payment-errors) | Terjadi kesalahan selama pembayaran, yang melibatkan salah satu situasi berikut: - [Pembayaran yang diblokir karena dugaan penipuan](https://docs.stripe.com/error-handling.md#payment-blocked) - [Pembayaran yang ditolak oleh penerbit](https://docs.stripe.com/error-handling.md#payment-declined). - [Kesalahan pembayaran lainnya](https://docs.stripe.com/error-handling.md#other-payment-errors). | | Kesalahan permintaan tidak valid | [Stripe::InvalidRequestError](https://docs.stripe.com/error-handling.md#invalid-request-errors) | Anda melakukan panggilan API dengan parameter yang salah, dalam status yang salah, atau dengan cara yang tidak valid. | | Kesalahan koneksi | [Stripe::APIConnectionError](https://docs.stripe.com/error-handling.md#connection-errors) | Ada masalah jaringan antara server Anda dan Stripe. | | Kesalahan API | [Stripe::APIError](https://docs.stripe.com/error-handling.md#api-errors) | Terjadi kesalahan di pihak Stripe. (Hal ini jarang terjadi.) | | Kesalahan autentikasi | [Stripe::AuthenticationError](https://docs.stripe.com/error-handling.md#authentication-errors) | Stripe tidak dapat mengautentikasi Anda dengan informasi yang diberikan. | | Kesalahan idempotensi | [Stripe::IdempotencyError](https://docs.stripe.com/error-handling.md#idempotency-errors) | Anda menggunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md) untuk suatu hal yang tak terduga, seperti memutar ulang permintaan, tetapi meneruskan parameter yang berbeda. | | Kesalahan izin | [Stripe::PermissionError](https://docs.stripe.com/error-handling.md#permission-errors) | Kunci API yang digunakan untuk permintaan ini tidak memiliki izin yang diperlukan. | | Kesalahan batas tingkat | [Stripe::RateLimitError](https://docs.stripe.com/error-handling.md#rate-limit-errors) | Anda melakukan panggilan API terlalu banyak dalam waktu terlalu singkat. | | Kesalahan verifikasi tanda tangan | [Stripe::SignatureVerificationError](https://docs.stripe.com/error-handling.md#signature-verification-errors) | Anda menggunakan [verifikasi tanda tangan](https://docs.stripe.com/webhooks.md#verify-events) *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) dan tidak dapat memverifikasi jika kejadian webhook bersifat autentik. | ## Kesalahan pembayaran Segala sesuatu di bagian ini juga berlaku untuk pembayaran nonkartu. Karena alasan historis, kesalahan pembayaran memiliki tipe [Stripe::CardError](https://docs.stripe.com/error-handling.md#card-error). Namun pada kenyataannya, tipe tersebut dapat mewakili masalah pada pembayaran, apa pun metode pembayarannya. Kesalahan pembayaran—terkadang disebut sebagai “kesalahan kartu” karena alasan historis—mencakup beragam masalah umum. Kesalahan itu terbagi dalam tiga kategori: - [Pembayaran yang diblokir karena dugaan penipuan](https://docs.stripe.com/error-handling.md#payment-blocked) - [Pembayaran yang ditolak oleh penerbit](https://docs.stripe.com/error-handling.md#payment-declined) - [Kesalahan pembayaran lainnya](https://docs.stripe.com/error-handling.md#other-payment-errors) Untuk membedakan kategori ini atau mendapatkan informasi selengkapnya tentang cara merespons, periksa [kode kesalahan](https://docs.stripe.com/error-codes.md), [kode penolakan](https://docs.stripe.com/declines/codes.md), dan [hasil charge](https://docs.stripe.com/api/charges/object.md#charge_object-outcome). (Untuk menemukan hasil charge dari objek kesalahan, dapatkan terlebih dahulu [Payment Intent yang terlibat](https://docs.stripe.com/api/errors.md#errors-payment_intent) dan [Charge terbaru yang dibuatnya](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-latest_charge). Lihat contoh di bawah untuk demonstrasi.) #### PHP ```php >'); function example_function($args) { try { $stripe->paymentIntents->create($args); } catch(\Stripe\Exception\CardException $e) { $charge = $stripe->charge->retrieve($e->getError()->payment_intent->latest_charge); if ($charge->outcome->type == 'blocked') { error_log('Blocked for suspected fraud.'); } elseif ($e->getError()->code == 'expired_card') { error_log('Card expired.'); } elseif ($e->getError()->code == 'card_declined') { error_log('Declined by the issuer.'); } else { error_log('Other card error.'); } } } ``` Pengguna pada versi API [2022-08-01](https://docs.stripe.com/upgrades.md#2022-08-01) atau lebih lama: (Untuk menemukan hasil charge dari objek kesalahan, dapatkan terlebih dahulu [Payment Intent yang terlibat](https://docs.stripe.com/api/errors.md#errors-payment_intent) dan [Charge terbaru yang dibuatnya](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-charges-data). Lihat contoh di bawah untuk demonstrasi.) #### PHP ```php >'); function example_function($args) { try { $stripe->paymentIntents->create($args); } catch(\Stripe\Exception\CardException $e) { if ($e->getError()->payment_intent->charges->data[0]->outcome->type == 'blocked') { error_log('Blocked for suspected fraud.'); } elseif ($e->getError()->code == 'expired_card') { error_log('Card expired.'); } elseif ($e->getError()->code == 'card_declined') { error_log('Declined by the issuer.'); } else { error_log('Other card error.'); } } } ``` Anda dapat memicu beberapa jenis kesalahan pembayaran yang umum dengan kartu percobaan. Lihat daftar ini untuk mengetahui opsinya: - [Menyimulasikan pembayaran yang diblokir karena risiko penipuan](https://docs.stripe.com/testing.md#fraud-prevention) - [Menyimulasikan pembayaran yang ditolak dan kesalahan kartu lainnya](https://docs.stripe.com/testing.md#declined-payments) Kode percobaan di bawah ini memperagakan beberapa kemungkinan. #### Kesalahan untuk memicu - Diblokir karena dugaan penipuan #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_radarBlock', // Ini adalah kartu percobaan yang selalu diblokir karena dugaan penipuan bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Payment blocked for suspected fraud. ``` #### Kesalahan untuk memicu - Ditolak oleh penerbit #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_visa_chargeDeclined', // Ini adalah kartu percobaan yang selalu ditolak oleh penerbit bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Payment declined by the issuer ``` #### Kesalahan untuk memicu - Kartu kedaluwarsa #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_chargeDeclinedExpiredCard', // Ini adalah kartu percobaan yang selalu gagal karena kedaluwarsa bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Card expired. ``` #### Kesalahan untuk memicu - Kesalahan kartu lainnya #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_chargeDeclinedProcessingError', // Ini adalah kartu percobaan yang selalu gagal karena kesalahan pemrosesan bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Other payment error. ``` ### Pembayaran yang diblokir karena dugaan penipuan | | | | | **Tipe** | `Stripe::CardError` | | **Kode** | ```ruby charge = Stripe::Charge.retrieve(e.error.payment_intent.latest_charge) charge.outcome.type == 'blocked' ``` Users on API version [2022-08-01](https://docs.stripe.com/upgrades.md#2022-08-01) or older: | **Kode** | `e.error.payment_intent.charges.data[0].outcome.type == 'blocked'` | | **Masalah** | | Sistem pencegahan penipuan Stripe, *Radar* (Radar for Fraud Teams helps you fine-tune how Radar operates, get fraud insights on suspicious charges, and assess your fraud management performance from a unified dashboard), memblokir pembayaran | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Tangkap kesalahan dan minta agar pelanggan menggunakan metode pembayaran berbeda. Untuk meminimalkan pemblokiran pembayaran yang sah, cobalah ini: - [Optimalkan integrasi Radar Anda](https://docs.stripe.com/radar/optimize-fraud-signals.md) untuk mengumpulkan informasi yang lebih mendetail. - Gunakan [Payment Links](https://docs.stripe.com/payment-links.md), [Checkout](https://docs.stripe.com/payments/checkout.md), atau [Stripe Elements](https://docs.stripe.com/payments/elements.md) untuk elemen formulir siap-rakit yang dioptimalkan. Pelanggan *Radar for Fraud Teams* (Radar for Fraud Teams helps you fine-tune how Radar operates, get fraud insights on suspicious charges, and assess your fraud management performance from a unified dashboard) memiliki opsi tambahan berikut: - Untuk membebaskan pembayaran tertentu, tambahkan ke daftar izin Anda. (Radar for Fraud Teams) - Untuk mengubah toleransi risiko, sesuaikan [pengaturan risiko](https://docs.stripe.com/radar/risk-settings.md) Anda. (Radar for Fraud Teams) - Untuk mengubah kriteria pemblokiran pembayaran, gunakan [aturan custom](https://docs.stripe.com/radar/rules.md). (Radar for Fraud Teams) Anda dapat mencoba pengaturan integrasi dengan [kartu percobaan yang menyimulasikan penipuan](https://docs.stripe.com/radar/testing.md). Jika Anda memiliki aturan Radar custom, ikuti saran percobaan dalam [dokumentasi Radar](https://docs.stripe.com/radar/testing.md). | ### Pembayaran yang ditolak oleh penerbit | | | | | **Tipe** | `Stripe::CardError` | | **Kode** | `e.error.code == "card_declined"` | | **Masalah** | Penerbit kartu menolak pembayaran. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Ini mencerminkan suatu tindakan oleh penerbit, dan tindakan itu mungkin sah. Gunakan kode penolakan untuk menentukan langkah berikutnya yang sesuai. Lihat [dokumentasi tentang kode penolakan](https://docs.stripe.com/declines/codes.md) untuk respons yang sesuai terhadap setiap kode. Anda juga dapat: - [Ikuti rekomendasi untuk mengurangi penolakan penerbit](https://docs.stripe.com/declines/card.md#reducing-bank-declines). - Gunakan [Payment Links](https://docs.stripe.com/payment-links.md), [Checkout](https://docs.stripe.com/payments/checkout.md), atau [Stripe Elements](https://docs.stripe.com/payments/elements.md) untuk elemen formulir siap-rakit yang mengimplementasikan rekomendasi tersebut. Coba cara integrasi Anda menangani penolakan dengan [kartu percobaan yang menyimulasikan pembayaran yang berhasil dan ditolak](https://docs.stripe.com/radar/testing.md). | ### Kesalahan pembayaran lainnya | | | | | **Tipe** | `Stripe::CardError` | | **Masalah** | Terjadi kesalahan pembayaran lain. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Gunakan kode kesalahan untuk menentukan langkah selanjutnya yang sesuai. Lihat [dokumentasi tentang kode kesalahan](https://docs.stripe.com/error-codes.md) untuk respons yang sesuai terhadap setiap kode. | ## Kesalahan permintaan tidak valid | | | | | **Tipe** | `Stripe::InvalidRequestError` | | **Masalah** | Anda melakukan panggilan API dengan parameter yang salah, dalam status yang salah, atau dengan cara yang tidak valid. | | **Solusi** | Dalam sebagian besar kasus, masalahnya ada pada permintaannya itu sendiri. Parameternya tidak valid atau tidak dapat dijalankan dalam status integrasi Anda saat ini. - Baca [dokumentasi kode kesalahan](https://docs.stripe.com/error-codes.md) untuk mendapatkan detail tentang masalah. - Demi kenyamanan, Anda dapat mengikuti tautan di untuk dokumentasi tentang kode kesalahan. - Jika kesalahan melibatkan parameter tertentu, gunakan untuk menentukan yang mana. | ## Kesalahan koneksi | | | | | **Tipe** | `Stripe::APIConnectionError` | | **Masalah** | Ada masalah jaringan antara server Anda dan Stripe. | | **Solusi** | Perlakukan hasil panggilan API sebagai tidak tentu. Artinya, jangan menganggapnya berhasil atau gagal. Untuk mengetahui apakah berhasil, Anda dapat: - Ambil objek yang relevan dari Stripe dan periksa statusnya. - Dengarkan notifikasi webhook apakah operasi telah berhasil atau gagal. Untuk membantu memulihkan dari kesalahan koneksi, Anda dapat: - Saat membuat atau memperbarui objek, gunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md). Kemudian, jika terjadi kesalahan koneksi, Anda dapat mengulangi permintaan dengan aman tanpa risiko membuat objek kedua atau melakukan pembaruan dua kali. Ulangi permintaan dengan kunci idempotensi yang sama sampai Anda menerima keberhasilan atau kegagalan yang jelas. Untuk saran lanjutan tentang strategi ini, lihat [Penanganan kesalahan tingkat rendah](https://docs.stripe.com/error-low-level.md#idempotency). - Aktifkan [pengulangan otomatis](https://github.com/stripe/stripe-java?tab=readme-ov-file#configuring-automatic-retries). Setelah itu, Stripe akan menghasilkan idempotency key untuk Anda, dan mengulangi permintaan saat dianggap aman untuk dilakukan. Kesalahan ini dapat menutupi yang lainnya. Bisa jadi bila kesalahan koneksi teratasi, beberapa kesalahan lain menjadi tampak. Periksa kesalahan dalam semua solusi ini sebagaimana yang Anda lakukan di permintaan semula. | ## Kesalahan API | | | | | **Tipe** | `Stripe::APIError` | | **Masalah** | Terjadi kesalahan di pihak Stripe. (Hal ini jarang terjadi.) | | **Solusi** | Perlakukan hasil panggilan API sebagai tidak tentu. Artinya, jangan beranggapan apakah telah berhasil atau gagal. Andalkan *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) untuk informasi tentang hasilnya. Bila memungkinkan, Stripe mengaktifkan webhook untuk objek baru yang kami buat ketika memecahkan masalah. Untuk menyiapkan integrasi Anda demi ketahanan maksimum dalam situasi yang tidak biasa, lihat [diskusi lanjutan tentang kesalahan server ini.](https://docs.stripe.com/error-low-level.md#server-errors) | ## Kesalahan autentikasi | | | | | **Tipe** | `Stripe::AuthenticationError` | | **Masalah** | Stripe tidak dapat mengautentikasi Anda dengan informasi yang diberikan. | | **Solusi** | - Gunakan [kunci API](https://docs.stripe.com/keys.md) yang benar. - Pastikan Anda tidak menggunakan kunci yang Anda [“rotasikan” atau cabut](https://docs.stripe.com/keys.md#rolling-keys). | ## Kesalahan idempotensi | | | | | **Tipe** | `Stripe::IdempotencyError` | | **Masalah** | Anda menggunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md) untuk suatu hal yang tak terduga, seperti memutar ulang permintaan, tetapi meneruskan parameter yang berbeda. | | **Solusi** | - Setelah Anda menggunakan kunci idempotensi, hanya gunakan kembali untuk panggilan API yang sama persis. - Gunakan kunci idempotensi di bawah batas 255 karakter. | ## Kesalahan izin | | | | | **Tipe** | `Stripe::PermissionError` | | **Masalah** | Kunci API yang digunakan untuk permintaan ini tidak memiliki izin yang diperlukan. | | **Solusi** | - Pastikan Anda tidak menggunakan [kunci API yang dibatasi](https://docs.stripe.com/keys-best-practices.md#limit-access) untuk layanan yang aksesnya tidak dimilikinya. - Jangan melakukan tindakan di Dashboard saat masuk sebagai [peran pengguna](https://docs.stripe.com/get-started/account/teams/roles.md) yang tidak memiliki izin. | ## Kesalahan batas tingkat | | | | | **Tipe** | `Stripe::RateLimitError` | | **Masalah** | Anda melakukan panggilan API terlalu banyak dalam waktu terlalu singkat. | | **Solusi** | - Jika satu panggilan API memicu kesalahan ini, tunggu dan coba lagi. - Untuk menangani pembatasan rasio secara otomatis, coba ulang panggilan API setelah penundaan, dan tingkatkan penundaan secara eksponensial jika kesalahan berlanjut. Lihat dokumentasi tentang [batas rasio](https://docs.stripe.com/rate-limits.md) untuk saran lebih lanjut. - Jika Anda mengantisipasi peningkatan lalu lintas yang besar dan ingin meminta peningkatan batas tingkat, [hubungi Tim CS](https://support.stripe.com/) terlebih dahulu. | ## Kesalahan verifikasi tanda tangan | | | | | **Tipe** | `Stripe::SignatureVerificationError` | | **Masalah** | Anda menggunakan [verifikasi tanda tangan](https://docs.stripe.com/webhooks.md#verify-events) *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) dan tidak dapat memverifikasi jika kejadian webhook bersifat autentik. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Jika Anda menggunakan verifikasi tanda tangan webhook dan pihak ketiga mencoba mengirimi Anda webhook palsu atau jahat, maka verifikasi akan gagal dan menghasilkan kesalahan ini. Tangkap dan respons dengan kode status `400 Bad Request`. Jika Anda menerima kesalahan ini, padahal seharusnya tidak—misalnya, dengan webhook yang Anda ketahui berasal dari Stripe—maka lihat dokumentasi di [memeriksa tanda tangan webhook](https://docs.stripe.com/webhooks.md#verify-events) untuk saran lebih lanjut. Secara khusus, pastikan Anda menggunakan rahasia endpoint yang benar. Ini berbeda dengan kunci API Anda. | Di pustaka Python Stripe, objek kesalahan dimiliki oleh `stripe.StripeError` dan subkelasnya. Gunakan dokumentasi bagi setiap kelas untuk saran tentang cara merespons. | Nama | Kelas | Keterangan | | --------------------------------- | ------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Kesalahan pembayaran | [stripe.CardError](https://docs.stripe.com/error-handling.md#payment-errors) | Terjadi kesalahan selama pembayaran, yang melibatkan salah satu situasi berikut: - [Pembayaran yang diblokir karena dugaan penipuan](https://docs.stripe.com/error-handling.md#payment-blocked) - [Pembayaran yang ditolak oleh penerbit](https://docs.stripe.com/error-handling.md#payment-declined). - [Kesalahan pembayaran lainnya](https://docs.stripe.com/error-handling.md#other-payment-errors). | | Kesalahan permintaan tidak valid | [stripe.InvalidRequestError](https://docs.stripe.com/error-handling.md#invalid-request-errors) | Anda melakukan panggilan API dengan parameter yang salah, dalam status yang salah, atau dengan cara yang tidak valid. | | Kesalahan koneksi | [stripe.APIConnectionError](https://docs.stripe.com/error-handling.md#connection-errors) | Ada masalah jaringan antara server Anda dan Stripe. | | Kesalahan API | [stripe.APIError](https://docs.stripe.com/error-handling.md#api-errors) | Terjadi kesalahan di pihak Stripe. (Hal ini jarang terjadi.) | | Kesalahan autentikasi | [stripe.AuthenticationError](https://docs.stripe.com/error-handling.md#authentication-errors) | Stripe tidak dapat mengautentikasi Anda dengan informasi yang diberikan. | | Kesalahan idempotensi | [stripe.IdempotencyError](https://docs.stripe.com/error-handling.md#idempotency-errors) | Anda menggunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md) untuk suatu hal yang tak terduga, seperti memutar ulang permintaan, tetapi meneruskan parameter yang berbeda. | | Kesalahan izin | [stripe.PermissionError](https://docs.stripe.com/error-handling.md#permission-errors) | Kunci API yang digunakan untuk permintaan ini tidak memiliki izin yang diperlukan. | | Kesalahan batas tingkat | [stripe.RateLimitError](https://docs.stripe.com/error-handling.md#rate-limit-errors) | Anda melakukan panggilan API terlalu banyak dalam waktu terlalu singkat. | | Kesalahan verifikasi tanda tangan | [stripe.SignatureVerificationError](https://docs.stripe.com/error-handling.md#signature-verification-errors) | Anda menggunakan [verifikasi tanda tangan](https://docs.stripe.com/webhooks.md#verify-events) *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) dan tidak dapat memverifikasi jika kejadian webhook bersifat autentik. | ## Kesalahan pembayaran Segala sesuatu di bagian ini juga berlaku untuk pembayaran nonkartu. Karena alasan historis, kesalahan pembayaran memiliki tipe [stripe.CardError](https://docs.stripe.com/error-handling.md#card-error). Namun pada kenyataannya, tipe tersebut dapat mewakili masalah pada pembayaran, apa pun metode pembayarannya. Kesalahan pembayaran—terkadang disebut sebagai “kesalahan kartu” karena alasan historis—mencakup beragam masalah umum. Kesalahan itu terbagi dalam tiga kategori: - [Pembayaran yang diblokir karena dugaan penipuan](https://docs.stripe.com/error-handling.md#payment-blocked) - [Pembayaran yang ditolak oleh penerbit](https://docs.stripe.com/error-handling.md#payment-declined) - [Kesalahan pembayaran lainnya](https://docs.stripe.com/error-handling.md#other-payment-errors) Untuk membedakan kategori ini atau mendapatkan informasi selengkapnya tentang cara merespons, periksa [kode kesalahan](https://docs.stripe.com/error-codes.md), [kode penolakan](https://docs.stripe.com/declines/codes.md), dan [hasil charge](https://docs.stripe.com/api/charges/object.md#charge_object-outcome). (Untuk menemukan hasil charge dari objek kesalahan, dapatkan terlebih dahulu [Payment Intent yang terlibat](https://docs.stripe.com/api/errors.md#errors-payment_intent) dan [Charge terbaru yang dibuatnya](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-latest_charge). Lihat contoh di bawah untuk demonstrasi.) #### PHP ```php >'); function example_function($args) { try { $stripe->paymentIntents->create($args); } catch(\Stripe\Exception\CardException $e) { $charge = $stripe->charge->retrieve($e->getError()->payment_intent->latest_charge); if ($charge->outcome->type == 'blocked') { error_log('Blocked for suspected fraud.'); } elseif ($e->getError()->code == 'expired_card') { error_log('Card expired.'); } elseif ($e->getError()->code == 'card_declined') { error_log('Declined by the issuer.'); } else { error_log('Other card error.'); } } } ``` Pengguna pada versi API [2022-08-01](https://docs.stripe.com/upgrades.md#2022-08-01) atau lebih lama: (Untuk menemukan hasil charge dari objek kesalahan, dapatkan terlebih dahulu [Payment Intent yang terlibat](https://docs.stripe.com/api/errors.md#errors-payment_intent) dan [Charge terbaru yang dibuatnya](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-charges-data). Lihat contoh di bawah untuk demonstrasi.) #### PHP ```php >'); function example_function($args) { try { $stripe->paymentIntents->create($args); } catch(\Stripe\Exception\CardException $e) { if ($e->getError()->payment_intent->charges->data[0]->outcome->type == 'blocked') { error_log('Blocked for suspected fraud.'); } elseif ($e->getError()->code == 'expired_card') { error_log('Card expired.'); } elseif ($e->getError()->code == 'card_declined') { error_log('Declined by the issuer.'); } else { error_log('Other card error.'); } } } ``` Anda dapat memicu beberapa jenis kesalahan pembayaran yang umum dengan kartu percobaan. Lihat daftar ini untuk mengetahui opsinya: - [Menyimulasikan pembayaran yang diblokir karena risiko penipuan](https://docs.stripe.com/testing.md#fraud-prevention) - [Menyimulasikan pembayaran yang ditolak dan kesalahan kartu lainnya](https://docs.stripe.com/testing.md#declined-payments) Kode percobaan di bawah ini memperagakan beberapa kemungkinan. #### Kesalahan untuk memicu - Diblokir karena dugaan penipuan #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_radarBlock', // Ini adalah kartu percobaan yang selalu diblokir karena dugaan penipuan bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Payment blocked for suspected fraud. ``` #### Kesalahan untuk memicu - Ditolak oleh penerbit #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_visa_chargeDeclined', // Ini adalah kartu percobaan yang selalu ditolak oleh penerbit bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Payment declined by the issuer ``` #### Kesalahan untuk memicu - Kartu kedaluwarsa #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_chargeDeclinedExpiredCard', // Ini adalah kartu percobaan yang selalu gagal karena kedaluwarsa bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Card expired. ``` #### Kesalahan untuk memicu - Kesalahan kartu lainnya #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_chargeDeclinedProcessingError', // Ini adalah kartu percobaan yang selalu gagal karena kesalahan pemrosesan bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Other payment error. ``` ### Pembayaran yang diblokir karena dugaan penipuan | | | | | **Tipe** | `stripe.CardError` | | **Kode** | ```python charge = stripe.Charge.retrieve(e.error.payment_intent.latest_charge) charge.outcome.type == 'blocked' ``` Users on API version [2022-08-01](https://docs.stripe.com/upgrades.md#2022-08-01) or older: | **Kode** | `e.error.payment_intent.charges.data[0].outcome.type == 'blocked'` | | **Masalah** | | Sistem pencegahan penipuan Stripe, *Radar* (Radar for Fraud Teams helps you fine-tune how Radar operates, get fraud insights on suspicious charges, and assess your fraud management performance from a unified dashboard), memblokir pembayaran | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Tangkap kesalahan dan minta agar pelanggan menggunakan metode pembayaran berbeda. Untuk meminimalkan pemblokiran pembayaran yang sah, cobalah ini: - [Optimalkan integrasi Radar Anda](https://docs.stripe.com/radar/optimize-fraud-signals.md) untuk mengumpulkan informasi yang lebih mendetail. - Gunakan [Payment Links](https://docs.stripe.com/payment-links.md), [Checkout](https://docs.stripe.com/payments/checkout.md), atau [Stripe Elements](https://docs.stripe.com/payments/elements.md) untuk elemen formulir siap-rakit yang dioptimalkan. Pelanggan *Radar for Fraud Teams* (Radar for Fraud Teams helps you fine-tune how Radar operates, get fraud insights on suspicious charges, and assess your fraud management performance from a unified dashboard) memiliki opsi tambahan berikut: - Untuk membebaskan pembayaran tertentu, tambahkan ke daftar izin Anda. (Radar for Fraud Teams) - Untuk mengubah toleransi risiko, sesuaikan [pengaturan risiko](https://docs.stripe.com/radar/risk-settings.md) Anda. (Radar for Fraud Teams) - Untuk mengubah kriteria pemblokiran pembayaran, gunakan [aturan custom](https://docs.stripe.com/radar/rules.md). (Radar for Fraud Teams) Anda dapat mencoba pengaturan integrasi dengan [kartu percobaan yang menyimulasikan penipuan](https://docs.stripe.com/radar/testing.md). Jika Anda memiliki aturan Radar custom, ikuti saran percobaan dalam [dokumentasi Radar](https://docs.stripe.com/radar/testing.md). | ### Pembayaran yang ditolak oleh penerbit | | | | | **Tipe** | `stripe.CardError` | | **Kode** | `e.code == "card_declined"` | | **Masalah** | Penerbit kartu menolak pembayaran. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Ini mencerminkan suatu tindakan oleh penerbit, dan tindakan itu mungkin sah. Gunakan kode penolakan untuk menentukan langkah berikutnya yang sesuai. Lihat [dokumentasi tentang kode penolakan](https://docs.stripe.com/declines/codes.md) untuk respons yang sesuai terhadap setiap kode. Anda juga dapat: - [Ikuti rekomendasi untuk mengurangi penolakan penerbit](https://docs.stripe.com/declines/card.md#reducing-bank-declines). - Gunakan [Payment Links](https://docs.stripe.com/payment-links.md), [Checkout](https://docs.stripe.com/payments/checkout.md), atau [Stripe Elements](https://docs.stripe.com/payments/elements.md) untuk elemen formulir siap-rakit yang mengimplementasikan rekomendasi tersebut. Coba cara integrasi Anda menangani penolakan dengan [kartu percobaan yang menyimulasikan pembayaran yang berhasil dan ditolak](https://docs.stripe.com/radar/testing.md). | ### Kesalahan pembayaran lainnya | | | | | **Tipe** | `stripe.CardError` | | **Masalah** | Terjadi kesalahan pembayaran lain. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Gunakan kode kesalahan untuk menentukan langkah selanjutnya yang sesuai. Lihat [dokumentasi tentang kode kesalahan](https://docs.stripe.com/error-codes.md) untuk respons yang sesuai terhadap setiap kode. | ## Kesalahan permintaan tidak valid | | | | | **Tipe** | `stripe.InvalidRequestError` | | **Masalah** | Anda melakukan panggilan API dengan parameter yang salah, dalam status yang salah, atau dengan cara yang tidak valid. | | **Solusi** | Dalam sebagian besar kasus, masalahnya ada pada permintaannya itu sendiri. Parameternya tidak valid atau tidak dapat dijalankan dalam status integrasi Anda saat ini. - Baca [dokumentasi kode kesalahan](https://docs.stripe.com/error-codes.md) untuk mendapatkan detail tentang masalah. - Demi kenyamanan, Anda dapat mengikuti tautan di `e.doc_url` untuk dokumentasi tentang kode kesalahan. - Jika kesalahan melibatkan parameter tertentu, gunakan `e.param` untuk menentukan yang mana. | ## Kesalahan koneksi | | | | | **Tipe** | `stripe.APIConnectionError` | | **Masalah** | Ada masalah jaringan antara server Anda dan Stripe. | | **Solusi** | Perlakukan hasil panggilan API sebagai tidak tentu. Artinya, jangan menganggapnya berhasil atau gagal. Untuk mengetahui apakah berhasil, Anda dapat: - Ambil objek yang relevan dari Stripe dan periksa statusnya. - Dengarkan notifikasi webhook apakah operasi telah berhasil atau gagal. Untuk membantu memulihkan dari kesalahan koneksi, Anda dapat: - Saat membuat atau memperbarui objek, gunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md). Kemudian, jika terjadi kesalahan koneksi, Anda dapat mengulangi permintaan dengan aman tanpa risiko membuat objek kedua atau melakukan pembaruan dua kali. Ulangi permintaan dengan kunci idempotensi yang sama sampai Anda menerima keberhasilan atau kegagalan yang jelas. Untuk saran lanjutan tentang strategi ini, lihat [Penanganan kesalahan tingkat rendah](https://docs.stripe.com/error-low-level.md#idempotency). - Aktifkan [pengulangan otomatis](https://github.com/stripe/stripe-java?tab=readme-ov-file#configuring-automatic-retries). Setelah itu, Stripe akan menghasilkan idempotency key untuk Anda, dan mengulangi permintaan saat dianggap aman untuk dilakukan. Kesalahan ini dapat menutupi yang lainnya. Bisa jadi bila kesalahan koneksi teratasi, beberapa kesalahan lain menjadi tampak. Periksa kesalahan dalam semua solusi ini sebagaimana yang Anda lakukan di permintaan semula. | ## Kesalahan API | | | | | **Tipe** | `stripe.APIError` | | **Masalah** | Terjadi kesalahan di pihak Stripe. (Hal ini jarang terjadi.) | | **Solusi** | Perlakukan hasil panggilan API sebagai tidak tentu. Artinya, jangan beranggapan apakah telah berhasil atau gagal. Andalkan *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) untuk informasi tentang hasilnya. Bila memungkinkan, Stripe mengaktifkan webhook untuk objek baru yang kami buat ketika memecahkan masalah. Untuk menyiapkan integrasi Anda demi ketahanan maksimum dalam situasi yang tidak biasa, lihat [diskusi lanjutan tentang kesalahan server ini.](https://docs.stripe.com/error-low-level.md#server-errors) | ## Kesalahan autentikasi | | | | | **Tipe** | `stripe.AuthenticationError` | | **Masalah** | Stripe tidak dapat mengautentikasi Anda dengan informasi yang diberikan. | | **Solusi** | - Gunakan [kunci API](https://docs.stripe.com/keys.md) yang benar. - Pastikan Anda tidak menggunakan kunci yang Anda [“rotasikan” atau cabut](https://docs.stripe.com/keys.md#rolling-keys). | ## Kesalahan idempotensi | | | | | **Tipe** | `stripe.IdempotencyError` | | **Masalah** | Anda menggunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md) untuk suatu hal yang tak terduga, seperti memutar ulang permintaan, tetapi meneruskan parameter yang berbeda. | | **Solusi** | - Setelah Anda menggunakan kunci idempotensi, hanya gunakan kembali untuk panggilan API yang sama persis. - Gunakan kunci idempotensi di bawah batas 255 karakter. | ## Kesalahan izin | | | | | **Tipe** | `stripe.PermissionError` | | **Masalah** | Kunci API yang digunakan untuk permintaan ini tidak memiliki izin yang diperlukan. | | **Solusi** | - Pastikan Anda tidak menggunakan [kunci API yang dibatasi](https://docs.stripe.com/keys-best-practices.md#limit-access) untuk layanan yang aksesnya tidak dimilikinya. - Jangan melakukan tindakan di Dashboard saat masuk sebagai [peran pengguna](https://docs.stripe.com/get-started/account/teams/roles.md) yang tidak memiliki izin. | ## Kesalahan batas tingkat | | | | | **Tipe** | `stripe.RateLimitError` | | **Masalah** | Anda melakukan panggilan API terlalu banyak dalam waktu terlalu singkat. | | **Solusi** | - Jika satu panggilan API memicu kesalahan ini, tunggu dan coba lagi. - Untuk menangani pembatasan rasio secara otomatis, coba ulang panggilan API setelah penundaan, dan tingkatkan penundaan secara eksponensial jika kesalahan berlanjut. Lihat dokumentasi tentang [batas rasio](https://docs.stripe.com/rate-limits.md) untuk saran lebih lanjut. - Jika Anda mengantisipasi peningkatan lalu lintas yang besar dan ingin meminta peningkatan batas tingkat, [hubungi Tim CS](https://support.stripe.com/) terlebih dahulu. | ## Kesalahan verifikasi tanda tangan | | | | | **Tipe** | `stripe.SignatureVerificationError` | | **Masalah** | Anda menggunakan [verifikasi tanda tangan](https://docs.stripe.com/webhooks.md#verify-events) *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) dan tidak dapat memverifikasi jika kejadian webhook bersifat autentik. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Jika Anda menggunakan verifikasi tanda tangan webhook dan pihak ketiga mencoba mengirimi Anda webhook palsu atau jahat, maka verifikasi akan gagal dan menghasilkan kesalahan ini. Tangkap dan respons dengan kode status `400 Bad Request`. Jika Anda menerima kesalahan ini, padahal seharusnya tidak—misalnya, dengan webhook yang Anda ketahui berasal dari Stripe—maka lihat dokumentasi di [memeriksa tanda tangan webhook](https://docs.stripe.com/webhooks.md#verify-events) untuk saran lebih lanjut. Secara khusus, pastikan Anda menggunakan rahasia endpoint yang benar. Ini berbeda dengan kunci API Anda. | Di pustaka Stripe PHP, setiap jenis kesalahan memiliki kelasnya sendiri. Gunakan dokumentasi untuk setiap kelas untuk saran tentang cara merespons. | Nama | Kelas | Keterangan | | --------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Kesalahan pembayaran | [Stripe\Exception\CardException](https://docs.stripe.com/error-handling.md#payment-errors) | Terjadi kesalahan selama pembayaran, yang melibatkan salah satu situasi berikut: - [Pembayaran yang diblokir karena dugaan penipuan](https://docs.stripe.com/error-handling.md#payment-blocked) - [Pembayaran yang ditolak oleh penerbit](https://docs.stripe.com/error-handling.md#payment-declined). - [Kesalahan pembayaran lainnya](https://docs.stripe.com/error-handling.md#other-payment-errors). | | Kesalahan permintaan tidak valid | [Stripe\Exception\InvalidRequestException](https://docs.stripe.com/error-handling.md#invalid-request-errors) | Anda melakukan panggilan API dengan parameter yang salah, dalam status yang salah, atau dengan cara yang tidak valid. | | Kesalahan koneksi | [Stripe\Exception\ApiConnectionException](https://docs.stripe.com/error-handling.md#connection-errors) | Ada masalah jaringan antara server Anda dan Stripe. | | Kesalahan API | [Stripe\Exception\ApiErrorException](https://docs.stripe.com/error-handling.md#api-errors) | Terjadi kesalahan di pihak Stripe. (Hal ini jarang terjadi.) | | Kesalahan autentikasi | [Stripe\Exception\AuthenticationException](https://docs.stripe.com/error-handling.md#authentication-errors) | Stripe tidak dapat mengautentikasi Anda dengan informasi yang diberikan. | | Kesalahan idempotensi | [Stripe\Exception\IdempotencyException](https://docs.stripe.com/error-handling.md#idempotency-errors) | Anda menggunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md) untuk suatu hal yang tak terduga, seperti memutar ulang permintaan, tetapi meneruskan parameter yang berbeda. | | Kesalahan izin | [Stripe\Exception\PermissionException](https://docs.stripe.com/error-handling.md#permission-errors) | Kunci API yang digunakan untuk permintaan ini tidak memiliki izin yang diperlukan. | | Kesalahan batas tingkat | [Stripe\Exception\RateLimitException](https://docs.stripe.com/error-handling.md#rate-limit-errors) | Anda melakukan panggilan API terlalu banyak dalam waktu terlalu singkat. | | Kesalahan verifikasi tanda tangan | [Stripe\Exception\SignatureVerificationException](https://docs.stripe.com/error-handling.md#signature-verification-errors) | Anda menggunakan [verifikasi tanda tangan](https://docs.stripe.com/webhooks.md#verify-events) *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) dan tidak dapat memverifikasi jika kejadian webhook bersifat autentik. | ## Kesalahan pembayaran Segala sesuatu di bagian ini juga berlaku untuk pembayaran nonkartu. Karena alasan historis, kesalahan pembayaran memiliki tipe [Stripe\Exception\CardException](https://docs.stripe.com/error-handling.md#card-error). Namun pada kenyataannya, tipe tersebut dapat mewakili masalah pada pembayaran, apa pun metode pembayarannya. Kesalahan pembayaran—terkadang disebut sebagai “kesalahan kartu” karena alasan historis—mencakup beragam masalah umum. Kesalahan itu terbagi dalam tiga kategori: - [Pembayaran yang diblokir karena dugaan penipuan](https://docs.stripe.com/error-handling.md#payment-blocked) - [Pembayaran yang ditolak oleh penerbit](https://docs.stripe.com/error-handling.md#payment-declined) - [Kesalahan pembayaran lainnya](https://docs.stripe.com/error-handling.md#other-payment-errors) Untuk membedakan kategori ini atau mendapatkan informasi selengkapnya tentang cara merespons, periksa [kode kesalahan](https://docs.stripe.com/error-codes.md), [kode penolakan](https://docs.stripe.com/declines/codes.md), dan [hasil charge](https://docs.stripe.com/api/charges/object.md#charge_object-outcome). (Untuk menemukan hasil charge dari objek kesalahan, dapatkan terlebih dahulu [Payment Intent yang terlibat](https://docs.stripe.com/api/errors.md#errors-payment_intent) dan [Charge terbaru yang dibuatnya](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-latest_charge). Lihat contoh di bawah untuk demonstrasi.) #### PHP ```php >'); function example_function($args) { try { $stripe->paymentIntents->create($args); } catch(\Stripe\Exception\CardException $e) { $charge = $stripe->charge->retrieve($e->getError()->payment_intent->latest_charge); if ($charge->outcome->type == 'blocked') { error_log('Blocked for suspected fraud.'); } elseif ($e->getError()->code == 'expired_card') { error_log('Card expired.'); } elseif ($e->getError()->code == 'card_declined') { error_log('Declined by the issuer.'); } else { error_log('Other card error.'); } } } ``` Pengguna pada versi API [2022-08-01](https://docs.stripe.com/upgrades.md#2022-08-01) atau lebih lama: (Untuk menemukan hasil charge dari objek kesalahan, dapatkan terlebih dahulu [Payment Intent yang terlibat](https://docs.stripe.com/api/errors.md#errors-payment_intent) dan [Charge terbaru yang dibuatnya](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-charges-data). Lihat contoh di bawah untuk demonstrasi.) #### PHP ```php >'); function example_function($args) { try { $stripe->paymentIntents->create($args); } catch(\Stripe\Exception\CardException $e) { if ($e->getError()->payment_intent->charges->data[0]->outcome->type == 'blocked') { error_log('Blocked for suspected fraud.'); } elseif ($e->getError()->code == 'expired_card') { error_log('Card expired.'); } elseif ($e->getError()->code == 'card_declined') { error_log('Declined by the issuer.'); } else { error_log('Other card error.'); } } } ``` Anda dapat memicu beberapa jenis kesalahan pembayaran yang umum dengan kartu percobaan. Lihat daftar ini untuk mengetahui opsinya: - [Menyimulasikan pembayaran yang diblokir karena risiko penipuan](https://docs.stripe.com/testing.md#fraud-prevention) - [Menyimulasikan pembayaran yang ditolak dan kesalahan kartu lainnya](https://docs.stripe.com/testing.md#declined-payments) Kode percobaan di bawah ini memperagakan beberapa kemungkinan. #### Kesalahan untuk memicu - Diblokir karena dugaan penipuan #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_radarBlock', // Ini adalah kartu percobaan yang selalu diblokir karena dugaan penipuan bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Payment blocked for suspected fraud. ``` #### Kesalahan untuk memicu - Ditolak oleh penerbit #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_visa_chargeDeclined', // Ini adalah kartu percobaan yang selalu ditolak oleh penerbit bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Payment declined by the issuer ``` #### Kesalahan untuk memicu - Kartu kedaluwarsa #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_chargeDeclinedExpiredCard', // Ini adalah kartu percobaan yang selalu gagal karena kedaluwarsa bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Card expired. ``` #### Kesalahan untuk memicu - Kesalahan kartu lainnya #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_chargeDeclinedProcessingError', // Ini adalah kartu percobaan yang selalu gagal karena kesalahan pemrosesan bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Other payment error. ``` ### Pembayaran yang diblokir karena dugaan penipuan | | | | | **Tipe** | `Stripe\Exception\CardException` | | **Kode** | ```php $charge = $stripe->charge->retrieve($e->getError()->payment_intent->latest_charge); $charge->outcome->type == 'blocked' ``` Users on API version [2022-08-01](https://docs.stripe.com/upgrades.md#2022-08-01) or older: | **Kode** | `$e->getError()->payment_intent->charges->data[0]->outcome->type == 'blocked'` | | **Masalah** | | Sistem pencegahan penipuan Stripe, *Radar* (Radar for Fraud Teams helps you fine-tune how Radar operates, get fraud insights on suspicious charges, and assess your fraud management performance from a unified dashboard), memblokir pembayaran | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Tangkap kesalahan dan minta agar pelanggan menggunakan metode pembayaran berbeda. Untuk meminimalkan pemblokiran pembayaran yang sah, cobalah ini: - [Optimalkan integrasi Radar Anda](https://docs.stripe.com/radar/optimize-fraud-signals.md) untuk mengumpulkan informasi yang lebih mendetail. - Gunakan [Payment Links](https://docs.stripe.com/payment-links.md), [Checkout](https://docs.stripe.com/payments/checkout.md), atau [Stripe Elements](https://docs.stripe.com/payments/elements.md) untuk elemen formulir siap-rakit yang dioptimalkan. Pelanggan *Radar for Fraud Teams* (Radar for Fraud Teams helps you fine-tune how Radar operates, get fraud insights on suspicious charges, and assess your fraud management performance from a unified dashboard) memiliki opsi tambahan berikut: - Untuk membebaskan pembayaran tertentu, tambahkan ke daftar izin Anda. (Radar for Fraud Teams) - Untuk mengubah toleransi risiko, sesuaikan [pengaturan risiko](https://docs.stripe.com/radar/risk-settings.md) Anda. (Radar for Fraud Teams) - Untuk mengubah kriteria pemblokiran pembayaran, gunakan [aturan custom](https://docs.stripe.com/radar/rules.md). (Radar for Fraud Teams) Anda dapat mencoba pengaturan integrasi dengan [kartu percobaan yang menyimulasikan penipuan](https://docs.stripe.com/radar/testing.md). Jika Anda memiliki aturan Radar custom, ikuti saran percobaan dalam [dokumentasi Radar](https://docs.stripe.com/radar/testing.md). | ### Pembayaran yang ditolak oleh penerbit | | | | | **Tipe** | `Stripe\Exception\CardException` | | **Kode** | `$e->getError()->code == "card_declined"` | | **Masalah** | Penerbit kartu menolak pembayaran. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Ini mencerminkan suatu tindakan oleh penerbit, dan tindakan itu mungkin sah. Gunakan kode penolakan untuk menentukan langkah berikutnya yang sesuai. Lihat [dokumentasi tentang kode penolakan](https://docs.stripe.com/declines/codes.md) untuk respons yang sesuai terhadap setiap kode. Anda juga dapat: - [Ikuti rekomendasi untuk mengurangi penolakan penerbit](https://docs.stripe.com/declines/card.md#reducing-bank-declines). - Gunakan [Payment Links](https://docs.stripe.com/payment-links.md), [Checkout](https://docs.stripe.com/payments/checkout.md), atau [Stripe Elements](https://docs.stripe.com/payments/elements.md) untuk elemen formulir siap-rakit yang mengimplementasikan rekomendasi tersebut. Coba cara integrasi Anda menangani penolakan dengan [kartu percobaan yang menyimulasikan pembayaran yang berhasil dan ditolak](https://docs.stripe.com/radar/testing.md). | ### Kesalahan pembayaran lainnya | | | | | **Tipe** | `Stripe\Exception\CardException` | | **Masalah** | Terjadi kesalahan pembayaran lain. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Gunakan kode kesalahan untuk menentukan langkah selanjutnya yang sesuai. Lihat [dokumentasi tentang kode kesalahan](https://docs.stripe.com/error-codes.md) untuk respons yang sesuai terhadap setiap kode. | ## Kesalahan permintaan tidak valid | | | | | **Tipe** | `Stripe\Exception\InvalidRequestException` | | **Masalah** | Anda melakukan panggilan API dengan parameter yang salah, dalam status yang salah, atau dengan cara yang tidak valid. | | **Solusi** | Dalam sebagian besar kasus, masalahnya ada pada permintaannya itu sendiri. Parameternya tidak valid atau tidak dapat dijalankan dalam status integrasi Anda saat ini. - Baca [dokumentasi kode kesalahan](https://docs.stripe.com/error-codes.md) untuk mendapatkan detail tentang masalah. - Demi kenyamanan, Anda dapat mengikuti tautan di `e->getError()->doc_url` untuk dokumentasi tentang kode kesalahan. - Jika kesalahan melibatkan parameter tertentu, gunakan `e->getError()->param` untuk menentukan yang mana. | ## Kesalahan koneksi | | | | | **Tipe** | `Stripe\Exception\ApiConnectionException` | | **Masalah** | Ada masalah jaringan antara server Anda dan Stripe. | | **Solusi** | Perlakukan hasil panggilan API sebagai tidak tentu. Artinya, jangan menganggapnya berhasil atau gagal. Untuk mengetahui apakah berhasil, Anda dapat: - Ambil objek yang relevan dari Stripe dan periksa statusnya. - Dengarkan notifikasi webhook apakah operasi telah berhasil atau gagal. Untuk membantu memulihkan dari kesalahan koneksi, Anda dapat: - Saat membuat atau memperbarui objek, gunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md). Kemudian, jika terjadi kesalahan koneksi, Anda dapat mengulangi permintaan dengan aman tanpa risiko membuat objek kedua atau melakukan pembaruan dua kali. Ulangi permintaan dengan kunci idempotensi yang sama sampai Anda menerima keberhasilan atau kegagalan yang jelas. Untuk saran lanjutan tentang strategi ini, lihat [Penanganan kesalahan tingkat rendah](https://docs.stripe.com/error-low-level.md#idempotency). - Aktifkan [pengulangan otomatis](https://github.com/stripe/stripe-java?tab=readme-ov-file#configuring-automatic-retries). Setelah itu, Stripe akan menghasilkan idempotency key untuk Anda, dan mengulangi permintaan saat dianggap aman untuk dilakukan. Kesalahan ini dapat menutupi yang lainnya. Bisa jadi bila kesalahan koneksi teratasi, beberapa kesalahan lain menjadi tampak. Periksa kesalahan dalam semua solusi ini sebagaimana yang Anda lakukan di permintaan semula. | ## Kesalahan API | | | | | **Tipe** | `Stripe\Exception\APIException` | | **Masalah** | Terjadi kesalahan di pihak Stripe. (Hal ini jarang terjadi.) | | **Solusi** | Perlakukan hasil panggilan API sebagai tidak tentu. Artinya, jangan beranggapan apakah telah berhasil atau gagal. Andalkan *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) untuk informasi tentang hasilnya. Bila memungkinkan, Stripe mengaktifkan webhook untuk objek baru yang kami buat ketika memecahkan masalah. Untuk menyiapkan integrasi Anda demi ketahanan maksimum dalam situasi yang tidak biasa, lihat [diskusi lanjutan tentang kesalahan server ini.](https://docs.stripe.com/error-low-level.md#server-errors) | ## Kesalahan autentikasi | | | | | **Tipe** | `Stripe\Exception\AuthenticationException` | | **Masalah** | Stripe tidak dapat mengautentikasi Anda dengan informasi yang diberikan. | | **Solusi** | - Gunakan [kunci API](https://docs.stripe.com/keys.md) yang benar. - Pastikan Anda tidak menggunakan kunci yang Anda [“rotasikan” atau cabut](https://docs.stripe.com/keys.md#rolling-keys). | ## Kesalahan idempotensi | | | | | **Tipe** | `Stripe\Exception\IdempotencyException` | | **Masalah** | Anda menggunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md) untuk suatu hal yang tak terduga, seperti memutar ulang permintaan, tetapi meneruskan parameter yang berbeda. | | **Solusi** | - Setelah Anda menggunakan kunci idempotensi, hanya gunakan kembali untuk panggilan API yang sama persis. - Gunakan kunci idempotensi di bawah batas 255 karakter. | ## Kesalahan izin | | | | | **Tipe** | `Stripe\Exception\PermissionException` | | **Masalah** | Kunci API yang digunakan untuk permintaan ini tidak memiliki izin yang diperlukan. | | **Solusi** | - Pastikan Anda tidak menggunakan [kunci API yang dibatasi](https://docs.stripe.com/keys-best-practices.md#limit-access) untuk layanan yang aksesnya tidak dimilikinya. - Jangan melakukan tindakan di Dashboard saat masuk sebagai [peran pengguna](https://docs.stripe.com/get-started/account/teams/roles.md) yang tidak memiliki izin. | ## Kesalahan batas tingkat | | | | | **Tipe** | `Stripe\Exception\RateLimitException` | | **Masalah** | Anda melakukan panggilan API terlalu banyak dalam waktu terlalu singkat. | | **Solusi** | - Jika satu panggilan API memicu kesalahan ini, tunggu dan coba lagi. - Untuk menangani pembatasan rasio secara otomatis, coba ulang panggilan API setelah penundaan, dan tingkatkan penundaan secara eksponensial jika kesalahan berlanjut. Lihat dokumentasi tentang [batas rasio](https://docs.stripe.com/rate-limits.md) untuk saran lebih lanjut. - Jika Anda mengantisipasi peningkatan lalu lintas yang besar dan ingin meminta peningkatan batas tingkat, [hubungi Tim CS](https://support.stripe.com/) terlebih dahulu. | ## Kesalahan verifikasi tanda tangan | | | | | **Tipe** | `Stripe\Exception\SignatureVerificationException` | | **Masalah** | Anda menggunakan [verifikasi tanda tangan](https://docs.stripe.com/webhooks.md#verify-events) *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) dan tidak dapat memverifikasi jika kejadian webhook bersifat autentik. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Jika Anda menggunakan verifikasi tanda tangan webhook dan pihak ketiga mencoba mengirimi Anda webhook palsu atau jahat, maka verifikasi akan gagal dan menghasilkan kesalahan ini. Tangkap dan respons dengan kode status `400 Bad Request`. Jika Anda menerima kesalahan ini, padahal seharusnya tidak—misalnya, dengan webhook yang Anda ketahui berasal dari Stripe—maka lihat dokumentasi di [memeriksa tanda tangan webhook](https://docs.stripe.com/webhooks.md#verify-events) untuk saran lebih lanjut. Secara khusus, pastikan Anda menggunakan rahasia endpoint yang benar. Ini berbeda dengan kunci API Anda. | Di pustaka Stripe Java, setiap jenis kesalahan memiliki kelasnya sendiri. Gunakan dokumentasi untuk setiap kelas untuk saran tentang cara merespons. | Nama | Kelas | Keterangan | | --------------------------------- | --------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Kesalahan pembayaran | [CardException](https://docs.stripe.com/error-handling.md#payment-errors) | Terjadi kesalahan selama pembayaran, yang melibatkan salah satu situasi berikut: - [Pembayaran yang diblokir karena dugaan penipuan](https://docs.stripe.com/error-handling.md#payment-blocked) - [Pembayaran yang ditolak oleh penerbit](https://docs.stripe.com/error-handling.md#payment-declined). - [Kesalahan pembayaran lainnya](https://docs.stripe.com/error-handling.md#other-payment-errors). | | Kesalahan permintaan tidak valid | [InvalidRequestException](https://docs.stripe.com/error-handling.md#invalid-request-errors) | Anda melakukan panggilan API dengan parameter yang salah, dalam status yang salah, atau dengan cara yang tidak valid. | | Kesalahan koneksi | [ApiConnectionException](https://docs.stripe.com/error-handling.md#connection-errors) | Ada masalah jaringan antara server Anda dan Stripe. | | Kesalahan API | [APIException](https://docs.stripe.com/error-handling.md#api-errors) | Terjadi kesalahan di pihak Stripe. (Hal ini jarang terjadi.) | | Kesalahan autentikasi | [AuthenticationException](https://docs.stripe.com/error-handling.md#authentication-errors) | Stripe tidak dapat mengautentikasi Anda dengan informasi yang diberikan. | | Kesalahan idempotensi | [IdempotencyException](https://docs.stripe.com/error-handling.md#idempotency-errors) | Anda menggunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md) untuk suatu hal yang tak terduga, seperti memutar ulang permintaan, tetapi meneruskan parameter yang berbeda. | | Kesalahan izin | [PermissionException](https://docs.stripe.com/error-handling.md#permission-errors) | Kunci API yang digunakan untuk permintaan ini tidak memiliki izin yang diperlukan. | | Kesalahan batas tingkat | [RateLimitException](https://docs.stripe.com/error-handling.md#rate-limit-errors) | Anda melakukan panggilan API terlalu banyak dalam waktu terlalu singkat. | | Kesalahan verifikasi tanda tangan | [SignatureVerificationException](https://docs.stripe.com/error-handling.md#signature-verification-errors) | Anda menggunakan [verifikasi tanda tangan](https://docs.stripe.com/webhooks.md#verify-events) *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) dan tidak dapat memverifikasi jika kejadian webhook bersifat autentik. | ## Kesalahan pembayaran Segala sesuatu di bagian ini juga berlaku untuk pembayaran nonkartu. Karena alasan historis, kesalahan pembayaran memiliki tipe [CardException](https://docs.stripe.com/error-handling.md#card-error). Namun pada kenyataannya, tipe tersebut dapat mewakili masalah pada pembayaran, apa pun metode pembayarannya. Kesalahan pembayaran—terkadang disebut sebagai “kesalahan kartu” karena alasan historis—mencakup beragam masalah umum. Kesalahan itu terbagi dalam tiga kategori: - [Pembayaran yang diblokir karena dugaan penipuan](https://docs.stripe.com/error-handling.md#payment-blocked) - [Pembayaran yang ditolak oleh penerbit](https://docs.stripe.com/error-handling.md#payment-declined) - [Kesalahan pembayaran lainnya](https://docs.stripe.com/error-handling.md#other-payment-errors) Untuk membedakan kategori ini atau mendapatkan informasi selengkapnya tentang cara merespons, periksa [kode kesalahan](https://docs.stripe.com/error-codes.md), [kode penolakan](https://docs.stripe.com/declines/codes.md), dan [hasil charge](https://docs.stripe.com/api/charges/object.md#charge_object-outcome). (Untuk menemukan hasil charge dari objek kesalahan, dapatkan terlebih dahulu [Payment Intent yang terlibat](https://docs.stripe.com/api/errors.md#errors-payment_intent) dan [Charge terbaru yang dibuatnya](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-latest_charge). Lihat contoh di bawah untuk demonstrasi.) #### PHP ```php >'); function example_function($args) { try { $stripe->paymentIntents->create($args); } catch(\Stripe\Exception\CardException $e) { $charge = $stripe->charge->retrieve($e->getError()->payment_intent->latest_charge); if ($charge->outcome->type == 'blocked') { error_log('Blocked for suspected fraud.'); } elseif ($e->getError()->code == 'expired_card') { error_log('Card expired.'); } elseif ($e->getError()->code == 'card_declined') { error_log('Declined by the issuer.'); } else { error_log('Other card error.'); } } } ``` Pengguna pada versi API [2022-08-01](https://docs.stripe.com/upgrades.md#2022-08-01) atau lebih lama: (Untuk menemukan hasil charge dari objek kesalahan, dapatkan terlebih dahulu [Payment Intent yang terlibat](https://docs.stripe.com/api/errors.md#errors-payment_intent) dan [Charge terbaru yang dibuatnya](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-charges-data). Lihat contoh di bawah untuk demonstrasi.) #### PHP ```php >'); function example_function($args) { try { $stripe->paymentIntents->create($args); } catch(\Stripe\Exception\CardException $e) { if ($e->getError()->payment_intent->charges->data[0]->outcome->type == 'blocked') { error_log('Blocked for suspected fraud.'); } elseif ($e->getError()->code == 'expired_card') { error_log('Card expired.'); } elseif ($e->getError()->code == 'card_declined') { error_log('Declined by the issuer.'); } else { error_log('Other card error.'); } } } ``` Anda dapat memicu beberapa jenis kesalahan pembayaran yang umum dengan kartu percobaan. Lihat daftar ini untuk mengetahui opsinya: - [Menyimulasikan pembayaran yang diblokir karena risiko penipuan](https://docs.stripe.com/testing.md#fraud-prevention) - [Menyimulasikan pembayaran yang ditolak dan kesalahan kartu lainnya](https://docs.stripe.com/testing.md#declined-payments) Kode percobaan di bawah ini memperagakan beberapa kemungkinan. #### Kesalahan untuk memicu - Diblokir karena dugaan penipuan #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_radarBlock', // Ini adalah kartu percobaan yang selalu diblokir karena dugaan penipuan bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Payment blocked for suspected fraud. ``` #### Kesalahan untuk memicu - Ditolak oleh penerbit #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_visa_chargeDeclined', // Ini adalah kartu percobaan yang selalu ditolak oleh penerbit bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Payment declined by the issuer ``` #### Kesalahan untuk memicu - Kartu kedaluwarsa #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_chargeDeclinedExpiredCard', // Ini adalah kartu percobaan yang selalu gagal karena kedaluwarsa bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Card expired. ``` #### Kesalahan untuk memicu - Kesalahan kartu lainnya #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_chargeDeclinedProcessingError', // Ini adalah kartu percobaan yang selalu gagal karena kesalahan pemrosesan bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Other payment error. ``` ### Pembayaran yang diblokir karena dugaan penipuan | | | | | **Tipe** | `CardException` | | **Kode** | ```java Charge charge = Charge.retrieve(ex.getStripeError() .getPaymentIntent() .getLatestCharge()); charge.getOutcome().getType() == "blocked" ``` Users on API version [2022-08-01](https://docs.stripe.com/upgrades.md#2022-08-01) or older: | **Kode** | `ex.getStripeError().getPaymentIntent().getCharges().getData().get(0).getOutcome().getType() == "blocked"` | | **Masalah** | | Sistem pencegahan penipuan Stripe, *Radar* (Radar for Fraud Teams helps you fine-tune how Radar operates, get fraud insights on suspicious charges, and assess your fraud management performance from a unified dashboard), memblokir pembayaran | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Tangkap kesalahan dan minta agar pelanggan menggunakan metode pembayaran berbeda. Untuk meminimalkan pemblokiran pembayaran yang sah, cobalah ini: - [Optimalkan integrasi Radar Anda](https://docs.stripe.com/radar/optimize-fraud-signals.md) untuk mengumpulkan informasi yang lebih mendetail. - Gunakan [Payment Links](https://docs.stripe.com/payment-links.md), [Checkout](https://docs.stripe.com/payments/checkout.md), atau [Stripe Elements](https://docs.stripe.com/payments/elements.md) untuk elemen formulir siap-rakit yang dioptimalkan. Pelanggan *Radar for Fraud Teams* (Radar for Fraud Teams helps you fine-tune how Radar operates, get fraud insights on suspicious charges, and assess your fraud management performance from a unified dashboard) memiliki opsi tambahan berikut: - Untuk membebaskan pembayaran tertentu, tambahkan ke daftar izin Anda. (Radar for Fraud Teams) - Untuk mengubah toleransi risiko, sesuaikan [pengaturan risiko](https://docs.stripe.com/radar/risk-settings.md) Anda. (Radar for Fraud Teams) - Untuk mengubah kriteria pemblokiran pembayaran, gunakan [aturan custom](https://docs.stripe.com/radar/rules.md). (Radar for Fraud Teams) Anda dapat mencoba pengaturan integrasi dengan [kartu percobaan yang menyimulasikan penipuan](https://docs.stripe.com/radar/testing.md). Jika Anda memiliki aturan Radar custom, ikuti saran percobaan dalam [dokumentasi Radar](https://docs.stripe.com/radar/testing.md). | ### Pembayaran yang ditolak oleh penerbit | | | | | **Tipe** | `CardException` | | **Kode** | `e.getCode() == "card_declined"` | | **Masalah** | Penerbit kartu menolak pembayaran. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Ini mencerminkan suatu tindakan oleh penerbit, dan tindakan itu mungkin sah. Gunakan kode penolakan untuk menentukan langkah berikutnya yang sesuai. Lihat [dokumentasi tentang kode penolakan](https://docs.stripe.com/declines/codes.md) untuk respons yang sesuai terhadap setiap kode. Anda juga dapat: - [Ikuti rekomendasi untuk mengurangi penolakan penerbit](https://docs.stripe.com/declines/card.md#reducing-bank-declines). - Gunakan [Payment Links](https://docs.stripe.com/payment-links.md), [Checkout](https://docs.stripe.com/payments/checkout.md), atau [Stripe Elements](https://docs.stripe.com/payments/elements.md) untuk elemen formulir siap-rakit yang mengimplementasikan rekomendasi tersebut. Coba cara integrasi Anda menangani penolakan dengan [kartu percobaan yang menyimulasikan pembayaran yang berhasil dan ditolak](https://docs.stripe.com/radar/testing.md). | ### Kesalahan pembayaran lainnya | | | | | **Tipe** | `CardException` | | **Masalah** | Terjadi kesalahan pembayaran lain. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Gunakan kode kesalahan untuk menentukan langkah selanjutnya yang sesuai. Lihat [dokumentasi tentang kode kesalahan](https://docs.stripe.com/error-codes.md) untuk respons yang sesuai terhadap setiap kode. | ## Kesalahan permintaan tidak valid | | | | | **Tipe** | `InvalidRequestException` | | **Masalah** | Anda melakukan panggilan API dengan parameter yang salah, dalam status yang salah, atau dengan cara yang tidak valid. | | **Solusi** | Dalam sebagian besar kasus, masalahnya ada pada permintaannya itu sendiri. Parameternya tidak valid atau tidak dapat dijalankan dalam status integrasi Anda saat ini. - Baca [dokumentasi kode kesalahan](https://docs.stripe.com/error-codes.md) untuk mendapatkan detail tentang masalah. - Demi kenyamanan, Anda dapat mengikuti tautan di `e.getDocUrl()` untuk dokumentasi tentang kode kesalahan. - Jika kesalahan melibatkan parameter tertentu, gunakan `e.getParam()` untuk menentukan yang mana. | ## Kesalahan koneksi | | | | | **Tipe** | `APIConnectionException` | | **Masalah** | Ada masalah jaringan antara server Anda dan Stripe. | | **Solusi** | Perlakukan hasil panggilan API sebagai tidak tentu. Artinya, jangan menganggapnya berhasil atau gagal. Untuk mengetahui apakah berhasil, Anda dapat: - Ambil objek yang relevan dari Stripe dan periksa statusnya. - Dengarkan notifikasi webhook apakah operasi telah berhasil atau gagal. Untuk membantu memulihkan dari kesalahan koneksi, Anda dapat: - Saat membuat atau memperbarui objek, gunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md). Kemudian, jika terjadi kesalahan koneksi, Anda dapat mengulangi permintaan dengan aman tanpa risiko membuat objek kedua atau melakukan pembaruan dua kali. Ulangi permintaan dengan kunci idempotensi yang sama sampai Anda menerima keberhasilan atau kegagalan yang jelas. Untuk saran lanjutan tentang strategi ini, lihat [Penanganan kesalahan tingkat rendah](https://docs.stripe.com/error-low-level.md#idempotency). - Aktifkan [pengulangan otomatis](https://github.com/stripe/stripe-java?tab=readme-ov-file#configuring-automatic-retries). Setelah itu, Stripe akan menghasilkan idempotency key untuk Anda, dan mengulangi permintaan saat dianggap aman untuk dilakukan. Kesalahan ini dapat menutupi yang lainnya. Bisa jadi bila kesalahan koneksi teratasi, beberapa kesalahan lain menjadi tampak. Periksa kesalahan dalam semua solusi ini sebagaimana yang Anda lakukan di permintaan semula. | ## Kesalahan API | | | | | **Tipe** | `APIException` | | **Masalah** | Terjadi kesalahan di pihak Stripe. (Hal ini jarang terjadi.) | | **Solusi** | Perlakukan hasil panggilan API sebagai tidak tentu. Artinya, jangan beranggapan apakah telah berhasil atau gagal. Andalkan *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) untuk informasi tentang hasilnya. Bila memungkinkan, Stripe mengaktifkan webhook untuk objek baru yang kami buat ketika memecahkan masalah. Untuk menyiapkan integrasi Anda demi ketahanan maksimum dalam situasi yang tidak biasa, lihat [diskusi lanjutan tentang kesalahan server ini.](https://docs.stripe.com/error-low-level.md#server-errors) | ## Kesalahan autentikasi | | | | | **Tipe** | `AuthenticationException` | | **Masalah** | Stripe tidak dapat mengautentikasi Anda dengan informasi yang diberikan. | | **Solusi** | - Gunakan [kunci API](https://docs.stripe.com/keys.md) yang benar. - Pastikan Anda tidak menggunakan kunci yang Anda [“rotasikan” atau cabut](https://docs.stripe.com/keys.md#rolling-keys). | ## Kesalahan idempotensi | | | | | **Tipe** | `IdempotencyException` | | **Masalah** | Anda menggunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md) untuk suatu hal yang tak terduga, seperti memutar ulang permintaan, tetapi meneruskan parameter yang berbeda. | | **Solusi** | - Setelah Anda menggunakan kunci idempotensi, hanya gunakan kembali untuk panggilan API yang sama persis. - Gunakan kunci idempotensi di bawah batas 255 karakter. | ## Kesalahan izin | | | | | **Tipe** | `PermissionException` | | **Masalah** | Kunci API yang digunakan untuk permintaan ini tidak memiliki izin yang diperlukan. | | **Solusi** | - Pastikan Anda tidak menggunakan [kunci API yang dibatasi](https://docs.stripe.com/keys-best-practices.md#limit-access) untuk layanan yang aksesnya tidak dimilikinya. - Jangan melakukan tindakan di Dashboard saat masuk sebagai [peran pengguna](https://docs.stripe.com/get-started/account/teams/roles.md) yang tidak memiliki izin. | ## Kesalahan batas tingkat | | | | | **Tipe** | `RateLimitException` | | **Masalah** | Anda melakukan panggilan API terlalu banyak dalam waktu terlalu singkat. | | **Solusi** | - Jika satu panggilan API memicu kesalahan ini, tunggu dan coba lagi. - Untuk menangani pembatasan rasio secara otomatis, coba ulang panggilan API setelah penundaan, dan tingkatkan penundaan secara eksponensial jika kesalahan berlanjut. Lihat dokumentasi tentang [batas rasio](https://docs.stripe.com/rate-limits.md) untuk saran lebih lanjut. - Jika Anda mengantisipasi peningkatan lalu lintas yang besar dan ingin meminta peningkatan batas tingkat, [hubungi Tim CS](https://support.stripe.com/) terlebih dahulu. | ## Kesalahan verifikasi tanda tangan | | | | | **Tipe** | `SignatureVerificationException` | | **Masalah** | Anda menggunakan [verifikasi tanda tangan](https://docs.stripe.com/webhooks.md#verify-events) *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) dan tidak dapat memverifikasi jika kejadian webhook bersifat autentik. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Jika Anda menggunakan verifikasi tanda tangan webhook dan pihak ketiga mencoba mengirimi Anda webhook palsu atau jahat, maka verifikasi akan gagal dan menghasilkan kesalahan ini. Tangkap dan respons dengan kode status `400 Bad Request`. Jika Anda menerima kesalahan ini, padahal seharusnya tidak—misalnya, dengan webhook yang Anda ketahui berasal dari Stripe—maka lihat dokumentasi di [memeriksa tanda tangan webhook](https://docs.stripe.com/webhooks.md#verify-events) untuk saran lebih lanjut. Secara khusus, pastikan Anda menggunakan rahasia endpoint yang benar. Ini berbeda dengan kunci API Anda. | Di pustaka Stripe Node.js, setiap objek kesalahan memiliki atribut `type`. Gunakan dokumentasi untuk setiap jenis saran tentang cara merespons. | Nama | Tipe | Keterangan | | --------------------------------- | ----------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Kesalahan pembayaran | [StripeCardError](https://docs.stripe.com/error-handling.md#payment-errors) | Terjadi kesalahan selama pembayaran, yang melibatkan salah satu situasi berikut: - [Pembayaran yang diblokir karena dugaan penipuan](https://docs.stripe.com/error-handling.md#payment-blocked) - [Pembayaran yang ditolak oleh penerbit](https://docs.stripe.com/error-handling.md#payment-declined). - [Kesalahan pembayaran lainnya](https://docs.stripe.com/error-handling.md#other-payment-errors). | | Kesalahan permintaan tidak valid | [StripeInvalidRequestError](https://docs.stripe.com/error-handling.md#invalid-request-errors) | Anda melakukan panggilan API dengan parameter yang salah, dalam status yang salah, atau dengan cara yang tidak valid. | | Kesalahan koneksi | [StripeConnectionError](https://docs.stripe.com/error-handling.md#connection-errors) | Ada masalah jaringan antara server Anda dan Stripe. | | Kesalahan API | [StripeAPIError](https://docs.stripe.com/error-handling.md#api-errors) | Terjadi kesalahan di pihak Stripe. (Hal ini jarang terjadi.) | | Kesalahan autentikasi | [StripeAuthenticationError](https://docs.stripe.com/error-handling.md#authentication-errors) | Stripe tidak dapat mengautentikasi Anda dengan informasi yang diberikan. | | Kesalahan idempotensi | [StripeIdempotencyError](https://docs.stripe.com/error-handling.md#idempotency-errors) | Anda menggunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md) untuk suatu hal yang tak terduga, seperti memutar ulang permintaan, tetapi meneruskan parameter yang berbeda. | | Kesalahan izin | [StripePermissionError](https://docs.stripe.com/error-handling.md#permission-errors) | Kunci API yang digunakan untuk permintaan ini tidak memiliki izin yang diperlukan. | | Kesalahan batas tingkat | [StripeRateLimitError](https://docs.stripe.com/error-handling.md#rate-limit-errors) | Anda melakukan panggilan API terlalu banyak dalam waktu terlalu singkat. | | Kesalahan verifikasi tanda tangan | [StripeSignatureVerificationError](https://docs.stripe.com/error-handling.md#signature-verification-errors) | Anda menggunakan [verifikasi tanda tangan](https://docs.stripe.com/webhooks.md#verify-events) *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) dan tidak dapat memverifikasi jika kejadian webhook bersifat autentik. | ## Kesalahan pembayaran Segala sesuatu di bagian ini juga berlaku untuk pembayaran nonkartu. Karena alasan historis, kesalahan pembayaran memiliki tipe [StripeCardError](https://docs.stripe.com/error-handling.md#card-error). Namun pada kenyataannya, tipe tersebut dapat mewakili masalah pada pembayaran, apa pun metode pembayarannya. Kesalahan pembayaran—terkadang disebut sebagai “kesalahan kartu” karena alasan historis—mencakup beragam masalah umum. Kesalahan itu terbagi dalam tiga kategori: - [Pembayaran yang diblokir karena dugaan penipuan](https://docs.stripe.com/error-handling.md#payment-blocked) - [Pembayaran yang ditolak oleh penerbit](https://docs.stripe.com/error-handling.md#payment-declined) - [Kesalahan pembayaran lainnya](https://docs.stripe.com/error-handling.md#other-payment-errors) Untuk membedakan kategori ini atau mendapatkan informasi selengkapnya tentang cara merespons, periksa [kode kesalahan](https://docs.stripe.com/error-codes.md), [kode penolakan](https://docs.stripe.com/declines/codes.md), dan [hasil charge](https://docs.stripe.com/api/charges/object.md#charge_object-outcome). (Untuk menemukan hasil charge dari objek kesalahan, dapatkan terlebih dahulu [Payment Intent yang terlibat](https://docs.stripe.com/api/errors.md#errors-payment_intent) dan [Charge terbaru yang dibuatnya](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-latest_charge). Lihat contoh di bawah untuk demonstrasi.) #### PHP ```php >'); function example_function($args) { try { $stripe->paymentIntents->create($args); } catch(\Stripe\Exception\CardException $e) { $charge = $stripe->charge->retrieve($e->getError()->payment_intent->latest_charge); if ($charge->outcome->type == 'blocked') { error_log('Blocked for suspected fraud.'); } elseif ($e->getError()->code == 'expired_card') { error_log('Card expired.'); } elseif ($e->getError()->code == 'card_declined') { error_log('Declined by the issuer.'); } else { error_log('Other card error.'); } } } ``` Pengguna pada versi API [2022-08-01](https://docs.stripe.com/upgrades.md#2022-08-01) atau lebih lama: (Untuk menemukan hasil charge dari objek kesalahan, dapatkan terlebih dahulu [Payment Intent yang terlibat](https://docs.stripe.com/api/errors.md#errors-payment_intent) dan [Charge terbaru yang dibuatnya](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-charges-data). Lihat contoh di bawah untuk demonstrasi.) #### PHP ```php >'); function example_function($args) { try { $stripe->paymentIntents->create($args); } catch(\Stripe\Exception\CardException $e) { if ($e->getError()->payment_intent->charges->data[0]->outcome->type == 'blocked') { error_log('Blocked for suspected fraud.'); } elseif ($e->getError()->code == 'expired_card') { error_log('Card expired.'); } elseif ($e->getError()->code == 'card_declined') { error_log('Declined by the issuer.'); } else { error_log('Other card error.'); } } } ``` Anda dapat memicu beberapa jenis kesalahan pembayaran yang umum dengan kartu percobaan. Lihat daftar ini untuk mengetahui opsinya: - [Menyimulasikan pembayaran yang diblokir karena risiko penipuan](https://docs.stripe.com/testing.md#fraud-prevention) - [Menyimulasikan pembayaran yang ditolak dan kesalahan kartu lainnya](https://docs.stripe.com/testing.md#declined-payments) Kode percobaan di bawah ini memperagakan beberapa kemungkinan. #### Kesalahan untuk memicu - Diblokir karena dugaan penipuan #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_radarBlock', // Ini adalah kartu percobaan yang selalu diblokir karena dugaan penipuan bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Payment blocked for suspected fraud. ``` #### Kesalahan untuk memicu - Ditolak oleh penerbit #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_visa_chargeDeclined', // Ini adalah kartu percobaan yang selalu ditolak oleh penerbit bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Payment declined by the issuer ``` #### Kesalahan untuk memicu - Kartu kedaluwarsa #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_chargeDeclinedExpiredCard', // Ini adalah kartu percobaan yang selalu gagal karena kedaluwarsa bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Card expired. ``` #### Kesalahan untuk memicu - Kesalahan kartu lainnya #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_chargeDeclinedProcessingError', // Ini adalah kartu percobaan yang selalu gagal karena kesalahan pemrosesan bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Other payment error. ``` ### Pembayaran yang diblokir karena dugaan penipuan | | | | | **Tipe** | `StripeCardError` | | **Kode** | ```javascript const charge = await stripe.charges.retrieve(e.payment_intent.latest_charge) charge.outcome.type === 'blocked' ``` Users on API version [2022-08-01](https://docs.stripe.com/upgrades.md#2022-08-01) or older: | **Kode** | `e.payment_intent.charges.data[0].outcome.type === 'blocked'` | | **Masalah** | | Sistem pencegahan penipuan Stripe, *Radar* (Radar for Fraud Teams helps you fine-tune how Radar operates, get fraud insights on suspicious charges, and assess your fraud management performance from a unified dashboard), memblokir pembayaran | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Tangkap kesalahan dan minta agar pelanggan menggunakan metode pembayaran berbeda. Untuk meminimalkan pemblokiran pembayaran yang sah, cobalah ini: - [Optimalkan integrasi Radar Anda](https://docs.stripe.com/radar/optimize-fraud-signals.md) untuk mengumpulkan informasi yang lebih mendetail. - Gunakan [Payment Links](https://docs.stripe.com/payment-links.md), [Checkout](https://docs.stripe.com/payments/checkout.md), atau [Stripe Elements](https://docs.stripe.com/payments/elements.md) untuk elemen formulir siap-rakit yang dioptimalkan. Pelanggan *Radar for Fraud Teams* (Radar for Fraud Teams helps you fine-tune how Radar operates, get fraud insights on suspicious charges, and assess your fraud management performance from a unified dashboard) memiliki opsi tambahan berikut: - Untuk membebaskan pembayaran tertentu, tambahkan ke daftar izin Anda. (Radar for Fraud Teams) - Untuk mengubah toleransi risiko, sesuaikan [pengaturan risiko](https://docs.stripe.com/radar/risk-settings.md) Anda. (Radar for Fraud Teams) - Untuk mengubah kriteria pemblokiran pembayaran, gunakan [aturan custom](https://docs.stripe.com/radar/rules.md). (Radar for Fraud Teams) Anda dapat mencoba pengaturan integrasi dengan [kartu percobaan yang menyimulasikan penipuan](https://docs.stripe.com/radar/testing.md). Jika Anda memiliki aturan Radar custom, ikuti saran percobaan dalam [dokumentasi Radar](https://docs.stripe.com/radar/testing.md). | ### Pembayaran yang ditolak oleh penerbit | | | | | **Tipe** | `StripeCardError` | | **Kode** | `e.code === 'card_declined'` | | **Masalah** | Penerbit kartu menolak pembayaran. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Ini mencerminkan suatu tindakan oleh penerbit, dan tindakan itu mungkin sah. Gunakan kode penolakan untuk menentukan langkah berikutnya yang sesuai. Lihat [dokumentasi tentang kode penolakan](https://docs.stripe.com/declines/codes.md) untuk respons yang sesuai terhadap setiap kode. Anda juga dapat: - [Ikuti rekomendasi untuk mengurangi penolakan penerbit](https://docs.stripe.com/declines/card.md#reducing-bank-declines). - Gunakan [Payment Links](https://docs.stripe.com/payment-links.md), [Checkout](https://docs.stripe.com/payments/checkout.md), atau [Stripe Elements](https://docs.stripe.com/payments/elements.md) untuk elemen formulir siap-rakit yang mengimplementasikan rekomendasi tersebut. Coba cara integrasi Anda menangani penolakan dengan [kartu percobaan yang menyimulasikan pembayaran yang berhasil dan ditolak](https://docs.stripe.com/radar/testing.md). | ### Kesalahan pembayaran lainnya | | | | | **Tipe** | `StripeCardError` | | **Masalah** | Terjadi kesalahan pembayaran lain. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Gunakan kode kesalahan untuk menentukan langkah selanjutnya yang sesuai. Lihat [dokumentasi tentang kode kesalahan](https://docs.stripe.com/error-codes.md) untuk respons yang sesuai terhadap setiap kode. | ## Kesalahan permintaan tidak valid | | | | | **Tipe** | `StripeInvalidRequestError` | | **Masalah** | Anda melakukan panggilan API dengan parameter yang salah, dalam status yang salah, atau dengan cara yang tidak valid. | | **Solusi** | Dalam sebagian besar kasus, masalahnya ada pada permintaannya itu sendiri. Parameternya tidak valid atau tidak dapat dijalankan dalam status integrasi Anda saat ini. - Baca [dokumentasi kode kesalahan](https://docs.stripe.com/error-codes.md) untuk mendapatkan detail tentang masalah. - Demi kenyamanan, Anda dapat mengikuti tautan di `e.doc_url` untuk dokumentasi tentang kode kesalahan. - Jika kesalahan melibatkan parameter tertentu, gunakan `e.param` untuk menentukan yang mana. | ## Kesalahan koneksi | | | | | **Tipe** | `StripeAPIConnectionError` | | **Masalah** | Ada masalah jaringan antara server Anda dan Stripe. | | **Solusi** | Perlakukan hasil panggilan API sebagai tidak tentu. Artinya, jangan menganggapnya berhasil atau gagal. Untuk mengetahui apakah berhasil, Anda dapat: - Ambil objek yang relevan dari Stripe dan periksa statusnya. - Dengarkan notifikasi webhook apakah operasi telah berhasil atau gagal. Untuk membantu memulihkan dari kesalahan koneksi, Anda dapat: - Saat membuat atau memperbarui objek, gunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md). Kemudian, jika terjadi kesalahan koneksi, Anda dapat mengulangi permintaan dengan aman tanpa risiko membuat objek kedua atau melakukan pembaruan dua kali. Ulangi permintaan dengan kunci idempotensi yang sama sampai Anda menerima keberhasilan atau kegagalan yang jelas. Untuk saran lanjutan tentang strategi ini, lihat [Penanganan kesalahan tingkat rendah](https://docs.stripe.com/error-low-level.md#idempotency). - Aktifkan [pengulangan otomatis](https://github.com/stripe/stripe-java?tab=readme-ov-file#configuring-automatic-retries). Setelah itu, Stripe akan menghasilkan idempotency key untuk Anda, dan mengulangi permintaan saat dianggap aman untuk dilakukan. Kesalahan ini dapat menutupi yang lainnya. Bisa jadi bila kesalahan koneksi teratasi, beberapa kesalahan lain menjadi tampak. Periksa kesalahan dalam semua solusi ini sebagaimana yang Anda lakukan di permintaan semula. | ## Kesalahan API | | | | | **Tipe** | `StripeAPIError` | | **Masalah** | Terjadi kesalahan di pihak Stripe. (Hal ini jarang terjadi.) | | **Solusi** | Perlakukan hasil panggilan API sebagai tidak tentu. Artinya, jangan beranggapan apakah telah berhasil atau gagal. Andalkan *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) untuk informasi tentang hasilnya. Bila memungkinkan, Stripe mengaktifkan webhook untuk objek baru yang kami buat ketika memecahkan masalah. Untuk menyiapkan integrasi Anda demi ketahanan maksimum dalam situasi yang tidak biasa, lihat [diskusi lanjutan tentang kesalahan server ini.](https://docs.stripe.com/error-low-level.md#server-errors) | ## Kesalahan autentikasi | | | | | **Tipe** | `StripeAuthenticationError` | | **Masalah** | Stripe tidak dapat mengautentikasi Anda dengan informasi yang diberikan. | | **Solusi** | - Gunakan [kunci API](https://docs.stripe.com/keys.md) yang benar. - Pastikan Anda tidak menggunakan kunci yang Anda [“rotasikan” atau cabut](https://docs.stripe.com/keys.md#rolling-keys). | ## Kesalahan idempotensi | | | | | **Tipe** | `StripeIdempotencyError` | | **Masalah** | Anda menggunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md) untuk suatu hal yang tak terduga, seperti memutar ulang permintaan, tetapi meneruskan parameter yang berbeda. | | **Solusi** | - Setelah Anda menggunakan kunci idempotensi, hanya gunakan kembali untuk panggilan API yang sama persis. - Gunakan kunci idempotensi di bawah batas 255 karakter. | ## Kesalahan izin | | | | | **Tipe** | `StripePermissionError` | | **Masalah** | Kunci API yang digunakan untuk permintaan ini tidak memiliki izin yang diperlukan. | | **Solusi** | - Pastikan Anda tidak menggunakan [kunci API yang dibatasi](https://docs.stripe.com/keys-best-practices.md#limit-access) untuk layanan yang aksesnya tidak dimilikinya. - Jangan melakukan tindakan di Dashboard saat masuk sebagai [peran pengguna](https://docs.stripe.com/get-started/account/teams/roles.md) yang tidak memiliki izin. | ## Kesalahan batas tingkat | | | | | **Tipe** | `StripeRateLimitError` | | **Masalah** | Anda melakukan panggilan API terlalu banyak dalam waktu terlalu singkat. | | **Solusi** | - Jika satu panggilan API memicu kesalahan ini, tunggu dan coba lagi. - Untuk menangani pembatasan rasio secara otomatis, coba ulang panggilan API setelah penundaan, dan tingkatkan penundaan secara eksponensial jika kesalahan berlanjut. Lihat dokumentasi tentang [batas rasio](https://docs.stripe.com/rate-limits.md) untuk saran lebih lanjut. - Jika Anda mengantisipasi peningkatan lalu lintas yang besar dan ingin meminta peningkatan batas tingkat, [hubungi Tim CS](https://support.stripe.com/) terlebih dahulu. | ## Kesalahan verifikasi tanda tangan | | | | | **Tipe** | `StripeSignatureVerificationError` | | **Masalah** | Anda menggunakan [verifikasi tanda tangan](https://docs.stripe.com/webhooks.md#verify-events) *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) dan tidak dapat memverifikasi jika kejadian webhook bersifat autentik. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Jika Anda menggunakan verifikasi tanda tangan webhook dan pihak ketiga mencoba mengirimi Anda webhook palsu atau jahat, maka verifikasi akan gagal dan menghasilkan kesalahan ini. Tangkap dan respons dengan kode status `400 Bad Request`. Jika Anda menerima kesalahan ini, padahal seharusnya tidak—misalnya, dengan webhook yang Anda ketahui berasal dari Stripe—maka lihat dokumentasi di [memeriksa tanda tangan webhook](https://docs.stripe.com/webhooks.md#verify-events) untuk saran lebih lanjut. Secara khusus, pastikan Anda menggunakan rahasia endpoint yang benar. Ini berbeda dengan kunci API Anda. | Di pustaka Stripe Go, setiap objek kesalahan memiliki atribut `Type`. Gunakan dokumentasi untuk setiap jenis saran tentang cara merespons. | Nama | Tipe | Keterangan | | -------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Kesalahan pembayaran | [stripe.ErrorTypeCard](https://docs.stripe.com/error-handling.md#payment-errors) | Terjadi kesalahan selama pembayaran, yang melibatkan salah satu situasi berikut: - [Pembayaran yang diblokir karena dugaan penipuan](https://docs.stripe.com/error-handling.md#payment-blocked) - [Pembayaran yang ditolak oleh penerbit](https://docs.stripe.com/error-handling.md#payment-declined). - [Kesalahan pembayaran lainnya](https://docs.stripe.com/error-handling.md#other-payment-errors). | | Kesalahan permintaan tidak valid | [stripe.ErrorTypeInvalidRequest](https://docs.stripe.com/error-handling.md#invalid-request-errors) | Anda melakukan panggilan API dengan cara yang saat ini tidak valid. Hal ini dapat termasuk: - [Kesalahan pembatasan rasio](https://docs.stripe.com/error-handling.md#rate-limiting) - [Kesalahan autentikasi](https://docs.stripe.com/error-handling.md#authentication-errors) - [Parameter atau status yang tidak valid](https://docs.stripe.com/error-handling.md#invalid-parameters-or-state) | | Kesalahan API | [stripe.ErrorTypeAPI](https://docs.stripe.com/error-handling.md#api-errors) | Terjadi kesalahan di pihak Stripe. (Hal ini jarang terjadi.) | | Kesalahan idempotensi | [stripe.ErrorTypeIdempotency](https://docs.stripe.com/error-handling.md#idempotency-errors) | Anda menggunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md) untuk suatu hal yang tak terduga, seperti memutar ulang permintaan, tetapi meneruskan parameter yang berbeda. | ## Kesalahan kartu Segala sesuatu di bagian ini juga berlaku untuk pembayaran nonkartu. Karena alasan historis, kesalahan pembayaran memiliki tipe [stripe.ErrorTypeCard](https://docs.stripe.com/error-handling.md#card-error). Namun pada kenyataannya, tipe tersebut dapat mewakili masalah pada pembayaran, apa pun metode pembayarannya. Kesalahan pembayaran—terkadang disebut sebagai “kesalahan kartu” karena alasan historis—mencakup beragam masalah umum. Kesalahan itu terbagi dalam tiga kategori: - [Pembayaran yang diblokir karena dugaan penipuan](https://docs.stripe.com/error-handling.md#payment-blocked) - [Pembayaran yang ditolak oleh penerbit](https://docs.stripe.com/error-handling.md#payment-declined) - [Kesalahan pembayaran lainnya](https://docs.stripe.com/error-handling.md#other-payment-errors) Untuk membedakan kategori ini atau mendapatkan informasi selengkapnya tentang cara merespons, periksa [kode kesalahan](https://docs.stripe.com/error-codes.md), [kode penolakan](https://docs.stripe.com/declines/codes.md), dan [hasil charge](https://docs.stripe.com/api/charges/object.md#charge_object-outcome). (Untuk menemukan hasil charge dari objek kesalahan, dapatkan terlebih dahulu [Payment Intent yang terlibat](https://docs.stripe.com/api/errors.md#errors-payment_intent) dan [Charge terbaru yang dibuatnya](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-latest_charge). Lihat contoh di bawah untuk demonstrasi.) #### PHP ```php >'); function example_function($args) { try { $stripe->paymentIntents->create($args); } catch(\Stripe\Exception\CardException $e) { $charge = $stripe->charge->retrieve($e->getError()->payment_intent->latest_charge); if ($charge->outcome->type == 'blocked') { error_log('Blocked for suspected fraud.'); } elseif ($e->getError()->code == 'expired_card') { error_log('Card expired.'); } elseif ($e->getError()->code == 'card_declined') { error_log('Declined by the issuer.'); } else { error_log('Other card error.'); } } } ``` Pengguna pada versi API [2022-08-01](https://docs.stripe.com/upgrades.md#2022-08-01) atau lebih lama: (Untuk menemukan hasil charge dari objek kesalahan, dapatkan terlebih dahulu [Payment Intent yang terlibat](https://docs.stripe.com/api/errors.md#errors-payment_intent) dan [Charge terbaru yang dibuatnya](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-charges-data). Lihat contoh di bawah untuk demonstrasi.) #### PHP ```php >'); function example_function($args) { try { $stripe->paymentIntents->create($args); } catch(\Stripe\Exception\CardException $e) { if ($e->getError()->payment_intent->charges->data[0]->outcome->type == 'blocked') { error_log('Blocked for suspected fraud.'); } elseif ($e->getError()->code == 'expired_card') { error_log('Card expired.'); } elseif ($e->getError()->code == 'card_declined') { error_log('Declined by the issuer.'); } else { error_log('Other card error.'); } } } ``` Anda dapat memicu beberapa jenis kesalahan pembayaran yang umum dengan kartu percobaan. Lihat daftar ini untuk mengetahui opsinya: - [Menyimulasikan pembayaran yang diblokir karena risiko penipuan](https://docs.stripe.com/testing.md#fraud-prevention) - [Menyimulasikan pembayaran yang ditolak dan kesalahan kartu lainnya](https://docs.stripe.com/testing.md#declined-payments) Kode percobaan di bawah ini memperagakan beberapa kemungkinan. #### Kesalahan untuk memicu - Diblokir karena dugaan penipuan #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_radarBlock', // Ini adalah kartu percobaan yang selalu diblokir karena dugaan penipuan bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Payment blocked for suspected fraud. ``` #### Kesalahan untuk memicu - Ditolak oleh penerbit #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_visa_chargeDeclined', // Ini adalah kartu percobaan yang selalu ditolak oleh penerbit bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Payment declined by the issuer ``` #### Kesalahan untuk memicu - Kartu kedaluwarsa #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_chargeDeclinedExpiredCard', // Ini adalah kartu percobaan yang selalu gagal karena kedaluwarsa bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Card expired. ``` #### Kesalahan untuk memicu - Kesalahan kartu lainnya #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_chargeDeclinedProcessingError', // Ini adalah kartu percobaan yang selalu gagal karena kesalahan pemrosesan bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Other payment error. ``` ### Diblokir karena dugaan penipuan | | | | | **Tipe** | `stripe.ErrorTypeCard` | | **Kode** | ```go charge = Charge.retrieve(stripeErr.PaymentIntent.LatestCharge) charge.Outcome.Type == "blocked" ``` Users on API version [2022-08-01](https://docs.stripe.com/upgrades.md#2022-08-01) or older: | **Kode** | `stripeErr.PaymentIntent.Charges.Data[0].Outcome.Type == "blocked"` | | **Masalah** | | Sistem pencegahan penipuan Stripe, *Radar* (Radar for Fraud Teams helps you fine-tune how Radar operates, get fraud insights on suspicious charges, and assess your fraud management performance from a unified dashboard), memblokir pembayaran | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Tangkap kesalahan dan minta agar pelanggan menggunakan metode pembayaran berbeda. Untuk meminimalkan pemblokiran pembayaran yang sah, cobalah ini: - [Optimalkan integrasi Radar Anda](https://docs.stripe.com/radar/optimize-fraud-signals.md) untuk mengumpulkan informasi yang lebih mendetail. - Gunakan [Payment Links](https://docs.stripe.com/payment-links.md), [Checkout](https://docs.stripe.com/payments/checkout.md), atau [Stripe Elements](https://docs.stripe.com/payments/elements.md) untuk elemen formulir siap-rakit yang dioptimalkan. Pelanggan *Radar for Fraud Teams* (Radar for Fraud Teams helps you fine-tune how Radar operates, get fraud insights on suspicious charges, and assess your fraud management performance from a unified dashboard) memiliki opsi tambahan berikut: - Untuk membebaskan pembayaran tertentu, tambahkan ke daftar izin Anda. (Radar for Fraud Teams) - Untuk mengubah toleransi risiko, sesuaikan [pengaturan risiko](https://docs.stripe.com/radar/risk-settings.md) Anda. (Radar for Fraud Teams) - Untuk mengubah kriteria pemblokiran pembayaran, gunakan [aturan custom](https://docs.stripe.com/radar/rules.md). (Radar for Fraud Teams) Anda dapat mencoba pengaturan integrasi dengan [kartu percobaan yang menyimulasikan penipuan](https://docs.stripe.com/radar/testing.md). Jika Anda memiliki aturan Radar custom, ikuti saran percobaan dalam [dokumentasi Radar](https://docs.stripe.com/radar/testing.md). | ### Ditolak oleh penerbit | | | | | **Tipe** | `stripe.ErrorTypeCard` | | **Kode** | `cardErr.Error.Code == stripe.ErrorCodeCardDeclined` | | **Masalah** | Penerbit kartu menolak pembayaran. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Ini mencerminkan suatu tindakan oleh penerbit, dan tindakan itu mungkin sah. Gunakan kode penolakan untuk menentukan langkah berikutnya yang sesuai. Lihat [dokumentasi tentang kode penolakan](https://docs.stripe.com/declines/codes.md) untuk respons yang sesuai terhadap setiap kode. Anda juga dapat: - [Ikuti rekomendasi untuk mengurangi penolakan penerbit](https://docs.stripe.com/declines/card.md#reducing-bank-declines). - Gunakan [Payment Links](https://docs.stripe.com/payment-links.md), [Checkout](https://docs.stripe.com/payments/checkout.md), atau [Stripe Elements](https://docs.stripe.com/payments/elements.md) untuk elemen formulir siap-rakit yang mengimplementasikan rekomendasi tersebut. Coba cara integrasi Anda menangani penolakan dengan [kartu percobaan yang menyimulasikan pembayaran yang berhasil dan ditolak](https://docs.stripe.com/radar/testing.md). | ### Kesalahan pembayaran lainnya | | | | | **Tipe** | `stripe.ErrorTypeCard` | | **Masalah** | Terjadi kesalahan pembayaran lain. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Gunakan kode kesalahan untuk menentukan langkah selanjutnya yang sesuai. Lihat [dokumentasi tentang kode kesalahan](https://docs.stripe.com/error-codes.md) untuk respons yang sesuai terhadap setiap kode. | ## Kesalahan permintaan tidak valid Kesalahan permintaan yang tidak valid mencakup berbagai situasi. Yang paling umum adalah saat permintaan API memiliki parameter yang tidak valid atau tidak diizinkan dalam status integrasi Anda saat ini. Gunakan kode kesalahan (`stripeErr.Code`) dan lihat [dokumentasi kode kesalahan](https://docs.stripe.com/error-codes.md) untuk menemukan solusi. Beberapa kode kesalahan memerlukan respons khusus: - `rate_limit` dan `lock_timeout` mencerminkan [kesalahan batas rasio](https://docs.stripe.com/error-handling.md#rate-limit-errors) - `secret_key_required` mencerminkan [kesalahan autentikasi](https://docs.stripe.com/error-handling.md#authentication-errors) - Kode kesalahan lainnya mencerminkan [parameter atau status yang tidak valid](https://docs.stripe.com/error-handling.md#other-invalid-request-errors) ### Kesalahan batas rasio | | | | | **Tipe** | `stripe.ErrorTypeInvalidRequest` | | **Kode** | `stripeErr.Code == stripe.ErrorCodeRateLimit or stripeErr.Code == stripe.ErrorCodeLockTimeout` | | **Masalah** | Anda melakukan panggilan API terlalu banyak dalam waktu terlalu singkat. | | **Solusi** | - Jika satu panggilan API memicu kesalahan ini, tunggu dan coba lagi. - Untuk menangani pembatasan rasio secara otomatis, coba ulang panggilan API setelah penundaan, dan tingkatkan penundaan secara eksponensial jika kesalahan berlanjut. Lihat dokumentasi tentang [batas rasio](https://docs.stripe.com/rate-limits.md) untuk saran lebih lanjut. - Jika Anda mengantisipasi peningkatan lalu lintas yang besar dan ingin meminta peningkatan batas tingkat, [hubungi Tim CS](https://support.stripe.com/) terlebih dahulu. | ### Kesalahan autentikasi | | | | | **Tipe** | `stripe.ErrorTypeInvalidRequest` | | **Kode** | `stripeErr.Code == stripe.ErrorCodeSecretKeyRequired` | | **Masalah** | Stripe tidak dapat mengautentikasi Anda dengan informasi yang diberikan. | | **Solusi** | - Gunakan [kunci API](https://docs.stripe.com/keys.md) yang benar. - Pastikan Anda tidak menggunakan kunci yang Anda [“rotasikan” atau cabut](https://docs.stripe.com/keys.md#rolling-keys). | ### Parameter atau status yang tidak valid | | | | | **Tipe** | `stripe.ErrorTypeInvalidRequest` | | **Kode** | `stripeErr.Code != stripe.ErrorCodeRateLimit and stripeErr.Code != stripe.ErrorCodeLockTimeout and stripeErr.Code != stripe.ErrorCodeSecretKeyRequired` | | **Masalah** | Anda melakukan panggilan API dengan parameter yang salah, dalam status yang salah, atau dengan cara yang tidak valid. | | **Solusi** | Dalam sebagian besar kasus, masalahnya ada pada permintaannya itu sendiri. Parameternya tidak valid atau tidak dapat dijalankan dalam status integrasi Anda saat ini. - Baca [dokumentasi kode kesalahan](https://docs.stripe.com/error-codes.md) untuk mendapatkan detail tentang masalah. - Demi kenyamanan, Anda dapat mengikuti tautan di `stripeErr.DocURL` untuk dokumentasi tentang kode kesalahan. - Jika kesalahan melibatkan parameter tertentu, gunakan `stripeErr.Param` untuk menentukan yang mana. | ## Kesalahan API | | | | | **Tipe** | `stripe.ErrorTypeAPI` | | **Masalah** | Terjadi kesalahan di pihak Stripe. (Hal ini jarang terjadi.) | | **Solusi** | Perlakukan hasil panggilan API sebagai tidak tentu. Artinya, jangan beranggapan apakah telah berhasil atau gagal. Andalkan *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) untuk informasi tentang hasilnya. Bila memungkinkan, Stripe mengaktifkan webhook untuk objek baru yang kami buat ketika memecahkan masalah. Untuk menyiapkan integrasi Anda demi ketahanan maksimum dalam situasi yang tidak biasa, lihat [diskusi lanjutan tentang kesalahan server ini.](https://docs.stripe.com/error-low-level.md#server-errors) | ## Kesalahan idempotensi | | | | | **Tipe** | `stripe.ErrorTypeIdempotency` | | **Masalah** | Anda menggunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md) untuk suatu hal yang tak terduga, seperti memutar ulang permintaan, tetapi meneruskan parameter yang berbeda. | | **Solusi** | - Setelah Anda menggunakan kunci idempotensi, hanya gunakan kembali untuk panggilan API yang sama persis. - Gunakan kunci idempotensi di bawah batas 255 karakter. | Di pustaka Stripe .NET, setiap objek kesalahan memiliki atribut `type`. Gunakan dokumentasi untuk setiap jenis saran tentang cara merespons. | Nama | Tipe | Keterangan | | --------------------------------- | ------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Kesalahan pembayaran | [card_error](https://docs.stripe.com/error-handling.md#payment-errors) | Terjadi kesalahan selama pembayaran, yang melibatkan salah satu situasi berikut: - [Pembayaran yang diblokir karena dugaan penipuan](https://docs.stripe.com/error-handling.md#payment-blocked) - [Pembayaran yang ditolak oleh penerbit](https://docs.stripe.com/error-handling.md#payment-declined). - [Kesalahan pembayaran lainnya](https://docs.stripe.com/error-handling.md#other-payment-errors). | | Kesalahan permintaan tidak valid | [invalid_request_error](https://docs.stripe.com/error-handling.md#invalid-request-errors) | Anda melakukan panggilan API dengan parameter yang salah, dalam status yang salah, atau dengan cara yang tidak valid. | | Kesalahan koneksi | [api_connection_error](https://docs.stripe.com/error-handling.md#connection-errors) | Ada masalah jaringan antara server Anda dan Stripe. | | Kesalahan API | [api_error](https://docs.stripe.com/error-handling.md#api-errors) | Terjadi kesalahan di pihak Stripe. (Hal ini jarang terjadi.) | | Kesalahan autentikasi | [authentication_error](https://docs.stripe.com/error-handling.md#authentication-errors) | Stripe tidak dapat mengautentikasi Anda dengan informasi yang diberikan. | | Kesalahan idempotensi | [idempotency_error](https://docs.stripe.com/error-handling.md#idempotency-errors) | Anda menggunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md) untuk suatu hal yang tak terduga, seperti memutar ulang permintaan, tetapi meneruskan parameter yang berbeda. | | Kesalahan izin | [permission_error](https://docs.stripe.com/error-handling.md#permission-errors) | Kunci API yang digunakan untuk permintaan ini tidak memiliki izin yang diperlukan. | | Kesalahan batas tingkat | [rate_limit_error](https://docs.stripe.com/error-handling.md#rate-limit-errors) | Anda melakukan panggilan API terlalu banyak dalam waktu terlalu singkat. | | Kesalahan verifikasi tanda tangan | [signature_verification_error](https://docs.stripe.com/error-handling.md#signature-verification-errors) | Anda menggunakan [verifikasi tanda tangan](https://docs.stripe.com/webhooks.md#verify-events) *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) dan tidak dapat memverifikasi jika kejadian webhook bersifat autentik. | ## Kesalahan pembayaran Segala sesuatu di bagian ini juga berlaku untuk pembayaran nonkartu. Karena alasan historis, kesalahan pembayaran memiliki tipe [card_error](https://docs.stripe.com/error-handling.md#card-error). Namun pada kenyataannya, tipe tersebut dapat mewakili masalah pada pembayaran, apa pun metode pembayarannya. Kesalahan pembayaran—terkadang disebut sebagai “kesalahan kartu” karena alasan historis—mencakup beragam masalah umum. Kesalahan itu terbagi dalam tiga kategori: - [Pembayaran yang diblokir karena dugaan penipuan](https://docs.stripe.com/error-handling.md#payment-blocked) - [Pembayaran yang ditolak oleh penerbit](https://docs.stripe.com/error-handling.md#payment-declined) - [Kesalahan pembayaran lainnya](https://docs.stripe.com/error-handling.md#other-payment-errors) Untuk membedakan kategori ini atau mendapatkan informasi selengkapnya tentang cara merespons, periksa [kode kesalahan](https://docs.stripe.com/error-codes.md), [kode penolakan](https://docs.stripe.com/declines/codes.md), dan [hasil charge](https://docs.stripe.com/api/charges/object.md#charge_object-outcome). (Untuk menemukan hasil charge dari objek kesalahan, dapatkan terlebih dahulu [Payment Intent yang terlibat](https://docs.stripe.com/api/errors.md#errors-payment_intent) dan [Charge terbaru yang dibuatnya](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-latest_charge). Lihat contoh di bawah untuk demonstrasi.) #### PHP ```php >'); function example_function($args) { try { $stripe->paymentIntents->create($args); } catch(\Stripe\Exception\CardException $e) { $charge = $stripe->charge->retrieve($e->getError()->payment_intent->latest_charge); if ($charge->outcome->type == 'blocked') { error_log('Blocked for suspected fraud.'); } elseif ($e->getError()->code == 'expired_card') { error_log('Card expired.'); } elseif ($e->getError()->code == 'card_declined') { error_log('Declined by the issuer.'); } else { error_log('Other card error.'); } } } ``` Pengguna pada versi API [2022-08-01](https://docs.stripe.com/upgrades.md#2022-08-01) atau lebih lama: (Untuk menemukan hasil charge dari objek kesalahan, dapatkan terlebih dahulu [Payment Intent yang terlibat](https://docs.stripe.com/api/errors.md#errors-payment_intent) dan [Charge terbaru yang dibuatnya](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-charges-data). Lihat contoh di bawah untuk demonstrasi.) #### PHP ```php >'); function example_function($args) { try { $stripe->paymentIntents->create($args); } catch(\Stripe\Exception\CardException $e) { if ($e->getError()->payment_intent->charges->data[0]->outcome->type == 'blocked') { error_log('Blocked for suspected fraud.'); } elseif ($e->getError()->code == 'expired_card') { error_log('Card expired.'); } elseif ($e->getError()->code == 'card_declined') { error_log('Declined by the issuer.'); } else { error_log('Other card error.'); } } } ``` Anda dapat memicu beberapa jenis kesalahan pembayaran yang umum dengan kartu percobaan. Lihat daftar ini untuk mengetahui opsinya: - [Menyimulasikan pembayaran yang diblokir karena risiko penipuan](https://docs.stripe.com/testing.md#fraud-prevention) - [Menyimulasikan pembayaran yang ditolak dan kesalahan kartu lainnya](https://docs.stripe.com/testing.md#declined-payments) Kode percobaan di bawah ini memperagakan beberapa kemungkinan. #### Kesalahan untuk memicu - Diblokir karena dugaan penipuan #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_radarBlock', // Ini adalah kartu percobaan yang selalu diblokir karena dugaan penipuan bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Payment blocked for suspected fraud. ``` #### Kesalahan untuk memicu - Ditolak oleh penerbit #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_visa_chargeDeclined', // Ini adalah kartu percobaan yang selalu ditolak oleh penerbit bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Payment declined by the issuer ``` #### Kesalahan untuk memicu - Kartu kedaluwarsa #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_chargeDeclinedExpiredCard', // Ini adalah kartu percobaan yang selalu gagal karena kedaluwarsa bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Card expired. ``` #### Kesalahan untuk memicu - Kesalahan kartu lainnya #### PHP ```php example_function([ 'currency' => 'usd', 'amount' => 2000, 'confirm' => True, 'payment_method' => 'pm_card_chargeDeclinedProcessingError', // Ini adalah kartu percobaan yang selalu gagal karena kesalahan pemrosesan bila Anda menggunakannya di sandbox. Gunakan kartu ini dan kartu percobaan lainnya untuk mencoba penanganan kesalahan dalam integrasi Anda. Dalam kode produksi, Anda akan menggunakan metode pembayaran yang sesungguhnya di sini. ]); ``` ``` Other payment error. ``` ### Pembayaran yang diblokir karena dugaan penipuan | | | | | **Tipe** | `card_error` | | **Kode** | ```dotnet var chargeService = new ChargeService(); var options = new ChargeGetOptions(); var charge = chargeService.Get(e.StripeError.PaymentIntent.LatestChargeId, options); charge.Outcome.Type == "blocked" ``` Users on API version [2022-08-01](https://docs.stripe.com/upgrades.md#2022-08-01) or older: | **Kode** | `e.StripeError.PaymentIntent.Charges.Data[0].Outcome.Type == "blocked"` | | **Masalah** | | Sistem pencegahan penipuan Stripe, *Radar* (Radar for Fraud Teams helps you fine-tune how Radar operates, get fraud insights on suspicious charges, and assess your fraud management performance from a unified dashboard), memblokir pembayaran | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Tangkap kesalahan dan minta agar pelanggan menggunakan metode pembayaran berbeda. Untuk meminimalkan pemblokiran pembayaran yang sah, cobalah ini: - [Optimalkan integrasi Radar Anda](https://docs.stripe.com/radar/optimize-fraud-signals.md) untuk mengumpulkan informasi yang lebih mendetail. - Gunakan [Payment Links](https://docs.stripe.com/payment-links.md), [Checkout](https://docs.stripe.com/payments/checkout.md), atau [Stripe Elements](https://docs.stripe.com/payments/elements.md) untuk elemen formulir siap-rakit yang dioptimalkan. Pelanggan *Radar for Fraud Teams* (Radar for Fraud Teams helps you fine-tune how Radar operates, get fraud insights on suspicious charges, and assess your fraud management performance from a unified dashboard) memiliki opsi tambahan berikut: - Untuk membebaskan pembayaran tertentu, tambahkan ke daftar izin Anda. (Radar for Fraud Teams) - Untuk mengubah toleransi risiko, sesuaikan [pengaturan risiko](https://docs.stripe.com/radar/risk-settings.md) Anda. (Radar for Fraud Teams) - Untuk mengubah kriteria pemblokiran pembayaran, gunakan [aturan custom](https://docs.stripe.com/radar/rules.md). (Radar for Fraud Teams) Anda dapat mencoba pengaturan integrasi dengan [kartu percobaan yang menyimulasikan penipuan](https://docs.stripe.com/radar/testing.md). Jika Anda memiliki aturan Radar custom, ikuti saran percobaan dalam [dokumentasi Radar](https://docs.stripe.com/radar/testing.md). | ### Pembayaran yang ditolak oleh penerbit | | | | | **Tipe** | `card_error` | | **Kode** | `e.StripeError.Code == "card_declined"` | | **Masalah** | Penerbit kartu menolak pembayaran. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Ini mencerminkan suatu tindakan oleh penerbit, dan tindakan itu mungkin sah. Gunakan kode penolakan untuk menentukan langkah berikutnya yang sesuai. Lihat [dokumentasi tentang kode penolakan](https://docs.stripe.com/declines/codes.md) untuk respons yang sesuai terhadap setiap kode. Anda juga dapat: - [Ikuti rekomendasi untuk mengurangi penolakan penerbit](https://docs.stripe.com/declines/card.md#reducing-bank-declines). - Gunakan [Payment Links](https://docs.stripe.com/payment-links.md), [Checkout](https://docs.stripe.com/payments/checkout.md), atau [Stripe Elements](https://docs.stripe.com/payments/elements.md) untuk elemen formulir siap-rakit yang mengimplementasikan rekomendasi tersebut. Coba cara integrasi Anda menangani penolakan dengan [kartu percobaan yang menyimulasikan pembayaran yang berhasil dan ditolak](https://docs.stripe.com/radar/testing.md). | ### Kesalahan pembayaran lainnya | | | | | **Tipe** | `card_error` | | **Masalah** | Terjadi kesalahan pembayaran lain. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Gunakan kode kesalahan untuk menentukan langkah selanjutnya yang sesuai. Lihat [dokumentasi tentang kode kesalahan](https://docs.stripe.com/error-codes.md) untuk respons yang sesuai terhadap setiap kode. | ## Kesalahan permintaan tidak valid | | | | | **Tipe** | `invalid_request_error` | | **Masalah** | Anda melakukan panggilan API dengan parameter yang salah, dalam status yang salah, atau dengan cara yang tidak valid. | | **Solusi** | Dalam sebagian besar kasus, masalahnya ada pada permintaannya itu sendiri. Parameternya tidak valid atau tidak dapat dijalankan dalam status integrasi Anda saat ini. - Baca [dokumentasi kode kesalahan](https://docs.stripe.com/error-codes.md) untuk mendapatkan detail tentang masalah. - Demi kenyamanan, Anda dapat mengikuti tautan di untuk dokumentasi tentang kode kesalahan. - Jika kesalahan melibatkan parameter tertentu, gunakan untuk menentukan yang mana. | ## Kesalahan koneksi | | | | | **Tipe** | `api_connection_error` | | **Masalah** | Ada masalah jaringan antara server Anda dan Stripe. | | **Solusi** | Perlakukan hasil panggilan API sebagai tidak tentu. Artinya, jangan menganggapnya berhasil atau gagal. Untuk mengetahui apakah berhasil, Anda dapat: - Ambil objek yang relevan dari Stripe dan periksa statusnya. - Dengarkan notifikasi webhook apakah operasi telah berhasil atau gagal. Untuk membantu memulihkan dari kesalahan koneksi, Anda dapat: - Saat membuat atau memperbarui objek, gunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md). Kemudian, jika terjadi kesalahan koneksi, Anda dapat mengulangi permintaan dengan aman tanpa risiko membuat objek kedua atau melakukan pembaruan dua kali. Ulangi permintaan dengan kunci idempotensi yang sama sampai Anda menerima keberhasilan atau kegagalan yang jelas. Untuk saran lanjutan tentang strategi ini, lihat [Penanganan kesalahan tingkat rendah](https://docs.stripe.com/error-low-level.md#idempotency). - Aktifkan [pengulangan otomatis](https://github.com/stripe/stripe-java?tab=readme-ov-file#configuring-automatic-retries). Setelah itu, Stripe akan menghasilkan idempotency key untuk Anda, dan mengulangi permintaan saat dianggap aman untuk dilakukan. Kesalahan ini dapat menutupi yang lainnya. Bisa jadi bila kesalahan koneksi teratasi, beberapa kesalahan lain menjadi tampak. Periksa kesalahan dalam semua solusi ini sebagaimana yang Anda lakukan di permintaan semula. | ## Kesalahan API | | | | | **Tipe** | `api_error` | | **Masalah** | Terjadi kesalahan di pihak Stripe. (Hal ini jarang terjadi.) | | **Solusi** | Perlakukan hasil panggilan API sebagai tidak tentu. Artinya, jangan beranggapan apakah telah berhasil atau gagal. Andalkan *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) untuk informasi tentang hasilnya. Bila memungkinkan, Stripe mengaktifkan webhook untuk objek baru yang kami buat ketika memecahkan masalah. Untuk menyiapkan integrasi Anda demi ketahanan maksimum dalam situasi yang tidak biasa, lihat [diskusi lanjutan tentang kesalahan server ini.](https://docs.stripe.com/error-low-level.md#server-errors) | ## Kesalahan autentikasi | | | | | **Tipe** | `authentication_error` | | **Masalah** | Stripe tidak dapat mengautentikasi Anda dengan informasi yang diberikan. | | **Solusi** | - Gunakan [kunci API](https://docs.stripe.com/keys.md) yang benar. - Pastikan Anda tidak menggunakan kunci yang Anda [“rotasikan” atau cabut](https://docs.stripe.com/keys.md#rolling-keys). | ## Kesalahan idempotensi | | | | | **Tipe** | `idempotency_error` | | **Masalah** | Anda menggunakan [kunci idempotensi](https://docs.stripe.com/api/idempotent_requests.md) untuk suatu hal yang tak terduga, seperti memutar ulang permintaan, tetapi meneruskan parameter yang berbeda. | | **Solusi** | - Setelah Anda menggunakan kunci idempotensi, hanya gunakan kembali untuk panggilan API yang sama persis. - Gunakan kunci idempotensi di bawah batas 255 karakter. | ## Kesalahan izin | | | | | **Tipe** | `permission_error` | | **Masalah** | Kunci API yang digunakan untuk permintaan ini tidak memiliki izin yang diperlukan. | | **Solusi** | - Pastikan Anda tidak menggunakan [kunci API yang dibatasi](https://docs.stripe.com/keys-best-practices.md#limit-access) untuk layanan yang aksesnya tidak dimilikinya. - Jangan melakukan tindakan di Dashboard saat masuk sebagai [peran pengguna](https://docs.stripe.com/get-started/account/teams/roles.md) yang tidak memiliki izin. | ## Kesalahan batas tingkat | | | | | **Tipe** | `rate_limit_error` | | **Masalah** | Anda melakukan panggilan API terlalu banyak dalam waktu terlalu singkat. | | **Solusi** | - Jika satu panggilan API memicu kesalahan ini, tunggu dan coba lagi. - Untuk menangani pembatasan rasio secara otomatis, coba ulang panggilan API setelah penundaan, dan tingkatkan penundaan secara eksponensial jika kesalahan berlanjut. Lihat dokumentasi tentang [batas rasio](https://docs.stripe.com/rate-limits.md) untuk saran lebih lanjut. - Jika Anda mengantisipasi peningkatan lalu lintas yang besar dan ingin meminta peningkatan batas tingkat, [hubungi Tim CS](https://support.stripe.com/) terlebih dahulu. | ## Kesalahan verifikasi tanda tangan | | | | | **Tipe** | `signature_verification_error` | | **Masalah** | Anda menggunakan [verifikasi tanda tangan](https://docs.stripe.com/webhooks.md#verify-events) *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) dan tidak dapat memverifikasi jika kejadian webhook bersifat autentik. | | **Solusi** | Kesalahan ini dapat terjadi bila integrasi Anda berfungsi dengan benar. Jika Anda menggunakan verifikasi tanda tangan webhook dan pihak ketiga mencoba mengirimi Anda webhook palsu atau jahat, maka verifikasi akan gagal dan menghasilkan kesalahan ini. Tangkap dan respons dengan kode status `400 Bad Request`. Jika Anda menerima kesalahan ini, padahal seharusnya tidak—misalnya, dengan webhook yang Anda ketahui berasal dari Stripe—maka lihat dokumentasi di [memeriksa tanda tangan webhook](https://docs.stripe.com/webhooks.md#verify-events) untuk saran lebih lanjut. Secara khusus, pastikan Anda menggunakan rahasia endpoint yang benar. Ini berbeda dengan kunci API Anda. |