From cf03781b4cc7521ad7278f45b7502b9b7589e1f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAudrey?= <“auva@odoo.com”> Date: Fri, 2 Feb 2024 10:37:29 +0000 Subject: [PATCH] [IMP] payment_providers/stripe: improve structure and add Enable Apple Pay button task-3697828 closes odoo/documentation#7687 X-original-commit: d4d62b69675f7c95d46d968c70a812920cbeb556 Signed-off-by: Audrey Vandromme (auva) --- .../finance/payment_providers/stripe.rst | 125 ++++++++++-------- .../stripe/payments-config.png | Bin 11221 -> 0 bytes 2 files changed, 69 insertions(+), 56 deletions(-) delete mode 100644 content/applications/finance/payment_providers/stripe/payments-config.png diff --git a/content/applications/finance/payment_providers/stripe.rst b/content/applications/finance/payment_providers/stripe.rst index c31c0984d..140c8494f 100644 --- a/content/applications/finance/payment_providers/stripe.rst +++ b/content/applications/finance/payment_providers/stripe.rst @@ -2,101 +2,114 @@ Stripe ====== -`Stripe `_ is a United States-based online payment solution provider, allowing +`Stripe `_ is a United States-based online payment solution provider allowing businesses to accept **credit cards** and other payment methods. -Link your Stripe Account with Odoo -================================== - -.. seealso:: - - :ref:`payment_providers/add_new` +Create your Stripe account with Odoo +==================================== The method to acquire your credentials depends on your hosting type: .. tabs:: .. group-tab:: Odoo Online - #. Go to the **eCommerce** or the **Sales** app and click on the *Activate Stripe* or the *Set - payments* button on the onboarding banner. - #. Fill in the requested information and submit the form. - #. Confirm your email address when Stripe sends you a confirmation email. - #. At the end of the process, you are redirected to Odoo. If you submitted all the requested - information, you are all set and your payment provider is enabled. - - .. tip:: - To use your own API keys, :ref:`activate the Developer mode ` and - :ref:`enable Stripe manually `. You can then :ref:`Fill in your - credentials `, :ref:`generate a webhook ` and enable the - payment provider. + #. :ref:`Navigate to the payment provider Stripe ` and + click :guilabel:`Connect Stripe`. + #. Go through the setup process and confirm your email address when Stripe sends you a + confirmation email. + #. At the end of the process, click :guilabel:`Agree and submit`. If all requested information + has been submitted, you are then redirected to Odoo, and your payment provider is enabled. .. group-tab:: Odoo.sh or On-premise - #. Go to the **eCommerce** or the **Sales** app and click on the *Activate Stripe* or the *Set - payments* button on the onboarding banner. - #. Fill in the requested information and submit the form. - #. Confirm your email address when Stripe sends you a confirmation email. - #. At the end of the process, you are redirected to the payment provider **Stripe** on Odoo. + #. :ref:`Navigate to the payment provider Stripe ` and + click :guilabel:`Connect Stripe`. + #. Go through the setup process and confirm your email address when Stripe sends you a + confirmation email. + #. At the end of the process, click :guilabel:`Agree and submit`; you are then redirected to + the payment provider **Stripe** in Odoo. #. :ref:`Fill in your credentials `. #. :ref:`Generate a webhook `. - #. Enable the payment provider. + #. Set the :guilabel:`State` field to :guilabel:`Enabled`. .. tip:: - To connect your Stripe account after the onboarding is already completed, go to - :menuselection:`Accounting --> Configuration --> Payment Providers --> Stripe` and click on the - *Connect Stripe* button. - -.. important:: - If you are testing Stripe (in **test mode**), change the **State** to *Test Mode*. We recommend - doing this on a test Odoo database rather than on your main database. + - To use an existing Stripe account, :ref:`activate the Developer mode ` and + :ref:`enable Stripe manually `. You can then :ref:`Fill in your + credentials `, :ref:`generate a webhook `, and enable the + payment provider. + - You can also test Stripe using the :ref:`payment_providers/test-mode`. To do so, first, + `log into your Stripe dashboard `_ and switch to the + **Test mode**. Then, in Odoo, :ref:`activate the Developer mode `, + :ref:`navigate to the payment provider Stripe `, + :ref:`fill in your API credentials ` with the test keys, and set the + :guilabel:`State` field to :guilabel:`Test Mode`. .. _stripe/api_keys: Fill in your credentials ------------------------ -In case your **API Credentials** are required to connect with your Stripe account, these are the -credentials that must be completed: +If your **API credentials** are required to connect with your Stripe account, proceed as follows: -- :ref:`Publishable Key `: The key solely used to identify the account with Stripe. -- :ref:`Secret Key `: The key to sign the merchant account with Stripe. -- :ref:`Webhook Signing Secret `: When you enable your webhook on your Stripe - account, this signing secret must be set to authenticate the messages sent from Stripe to Odoo. - -To retrieve the publishable and secret keys, follow this `link to your API keys -`_, or log into your Stripe dashboard and go to -:menuselection:`Developers --> API Keys --> Standard Keys`. +#. Go to `the API keys page on Stripe `_, or log into + your Stripe dashboard and go to :menuselection:`Developers --> API Keys`. +#. In the :guilabel:`Standard keys` section, copy the :guilabel:`Publishable key` and the + :guilabel:`Secret key` and save them for later. +#. In Odoo, :ref:`navigate to the payment provider Stripe `. +#. In the :guilabel:`Credentials` tab, fill in the :guilabel:`Publishable Key` and + :guilabel:`Secret Key` fields with the values you previously saved. .. _stripe/webhook: Generate a webhook ------------------ -In case your **Webhook Signing Secret** is required to connect with your Stripe account, you can -create a webhook either automatically or manually. +If your **Webhook Signing Secret** is required to connect with your Stripe account, you can create a +webhook automatically or manually. .. tabs:: .. tab:: Create the webhook automatically Make sure your :ref:`Publishable and Secret keys ` are filled in, then click - on the *Generate your Webhook* button. + :guilabel:`Generate your webhook`. .. tab:: Create the webhook manually - Visit the `webhooks page on Stripe `_, or log into your - Stripe dashboard and go to :menuselection:`Developers --> Webhooks`. Then, click on **Add - endpoint** in your **Hosted endpoints** and insert the following data into the pop-up form: + #. Go to the `Webhooks page on Stripe `_, or log into + your Stripe dashboard and go to :menuselection:`Developers --> Webhooks`. + #. In the :guilabel:`Hosted endpoints` section, click :guilabel:`Add endpoint`. Then, in the + :guilabel:`Endpoint URL` field, enter your Odoo database's URL, followed by + `/payment/stripe/webhook`, e.g., `https://yourcompany.odoo.com/payment/stripe/webhook`. + #. Click :guilabel:`Select events` at the bottom of the form, then select the following + events: - - | In the **Endpoint URL**, enter your Odoo database's URL followed by - | `/payment/stripe/webhook`. - | For example: `https://yourcompany.odoo.com/payment/stripe/webhook` - - At the end of the form, you can **Select events** to listen to. Click on it and, in the - **Checkout** section, select **checkout.session.completed**. + - in the :guilabel:`Charge` section: :guilabel:`charge.refunded` and + :guilabel:`charge.refund.updated`; + - in the :guilabel:`Payment intent` section: + :guilabel:`payment_intent.amount_capturable_updated`, + :guilabel:`payment_intent.payment_failed`, :guilabel:`payment_intent.processing`, and + :guilabel:`payment_intent.succeeded`; + - in the :guilabel:`Setup intent` section: :guilabel:`setup_intent.succeeded`. - .. note:: - It is possible to select other events, but they are currently not processed by Odoo. + #. Click :guilabel:`Add events`. + #. Click :guilabel:`Add endpoint`, then click :guilabel:`Reveal` and save your + :guilabel:`Signing secret` for later. + #. In Odoo, :ref:`navigate to the payment provider Stripe + `. + #. In the :guilabel:`Credentials` tab, fill the :guilabel:`Webhook Signing Secret` field with + the value you previously saved. - When you click on **Add endpoint**, your Webhook is configured. You can then click on - **reveal** to display your signing secret. + .. note:: + You can select other events, but they are currently not processed by Odoo. + +Enable Apple Pay +================ + +To allow customers to use the Apple Pay button to pay their eCommerce orders, go to the +:guilabel:`Configuration` tab, enable :guilabel:`Allow Express Checkout`, and click +:guilabel:`Enable Apple Pay`. .. seealso:: + - :ref:`Express checkout and Google Pay ` - :doc:`../payment_providers` + - :doc:`Use Stripe as a payment terminal in Point of Sale <../../sales/point_of_sale/payment_methods/terminals/stripe>` diff --git a/content/applications/finance/payment_providers/stripe/payments-config.png b/content/applications/finance/payment_providers/stripe/payments-config.png deleted file mode 100644 index 7afa7209d2c9ca437eecbd84a3c11c932ba2c304..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11221 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 Avj6}9