# Accepter un paiement par GrabPay

Découvrez comment accepter les paiements effectués à l'aide de GrabPay, un moyen de paiement très répandu en Asie du Sud-Est.

> À l’heure actuelle, les *abonnements* (A Subscription represents the product details associated with the plan that your customer subscribes to. Allows you to charge the customer on a recurring basis) et l’utilisation de GrabPay pour les paiements ultérieurs ne sont pas pris en charge. Contactez le [service Support de Stripe](https://support.stripe.com/contact) pour toute demande d’assistance portant sur ces fonctionnalités.

# API Direct


GrabPay est un moyen de paiement [à usage unique](https://docs.stripe.com/payments/payment-methods.md#usage). Dans le cadre d’un paiement avec GrabPay, le client est redirigé depuis votre application vers GrabPay, il autorise le paiement, puis il revient sur votre application. Vous recevez alors une [notification immédiate](https://docs.stripe.com/payments/payment-methods.md#payment-notification) vous indiquant si le paiement a abouti ou échoué.

> En savoir plus sur l’[activation de GrabPay dans le Dashboard](https://support.stripe.com/questions/grabpay-availability-and-getting-started).

## Configurer Stripe [Côté serveur]

Pour commencer, vous devez créer un compte Stripe. [Inscrivez-vous maintenant](https://dashboard.stripe.com/register).

Utilisez nos bibliothèques officielles pour accéder à l’API Stripe depuis votre application&nbsp;:

#### Ruby

```bash
# Available as a gem
sudo gem install stripe
```

```ruby
# If you use bundler, you can add this line to your Gemfile
gem 'stripe'
```

## Créer un PaymentIntent [Côté serveur]

Un [PaymentIntent](https://docs.stripe.com/api/payment_intents/object.md) représente votre intention d’encaisser un paiement auprès d’un client et suit le cycle de vie du processus de paiement.

Créez un `PaymentIntent` sur votre serveur et spécifiez la valeur `amount` à collecter et `sgd` ou `myr` comme devise. GrabPay n’a pas de montant de paiement minimum, le montant du paiement peut donc descendre jusqu’à&nbsp;1. [Activez GrabPay](https://dashboard.stripe.com/settings/payment_methods) dans votre Dashboard. Stripe gère l’affichage des moyens de paiement éligibles à l’aide des [moyens de paiement dynamiques](https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods.md).

```curl
curl https://api.stripe.com/v1/payment_intents \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount=1099 \
  -d currency=sgd \
  -d "automatic_payment_methods[enabled]=true"
```

### Récupérer la clé secrète du client

Le PaymentIntent inclut une *clé secrète du client* (The client secret is a unique key returned from Stripe as part of a PaymentIntent. This key lets the client access important fields from the PaymentIntent (status, amount, currency) while hiding sensitive ones (metadata, customer)) que le côté client utilise pour finaliser en toute sécurité le processus de paiement. Vous pouvez utiliser différentes approches pour transmettre la clé secrète du client au côté client.

#### Application monopage

Récupérez la clé secrète du client à partir d’un endpoint de votre serveur, à l’aide de la fonction `fetch` du navigateur. Cette approche est particulièrement adaptée si votre côté client est une application monopage, notamment si elle repose sur un framework front-end moderne comme React. Créez l’endpoint de votre serveur qui renvoie la clé secrète du client&nbsp;:

#### Ruby

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

Récupérez ensuite la clé secrète du client à l’aide JavaScript côté client&nbsp;:

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

#### Rendu côté serveur

Transmettez la clé secrète à votre client depuis votre serveur. Cette approche fonctionne mieux si votre application génère du contenu statique sur le serveur avant de l’envoyer sur le navigateur.

Ajoutez le [client_secret](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-client_secret) à votre formulaire de paiement. Dans votre code côté serveur, récupérez la clé secrète du client à partir du PaymentIntent&nbsp;:

#### Ruby

```erb
<form id="payment-form" data-secret="<%= @intent.client_secret %>">
  <button id="submit">Submit</button>
</form>
```

```ruby
get '/checkout' do
  @intent = # ... Fetch or create the PaymentIntent
  erb :checkout
end
```

## Soumettre le paiement à Stripe [Côté client]

Lorsqu’un client clique pour payer avec GrabPay, utilisez Stripe.js pour soumettre le paiement à Stripe. [Stripe.js](https://docs.stripe.com/payments/elements.md) est la bibliothèque JavaScript de base pour créer les tunnels de paiement&nbsp;: elle gère automatiquement les opérations complexes telles que la redirection décrite ci-dessous, et facilite l’extension de votre intégration à d’autres moyens de paiement. Incluez le script Stripe.js sur votre page de paiement en l’ajoutant à la section `head` de votre fichier HTML.

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

Créez une instance de Stripe.js avec le code JavaScript suivant sur votre page de paiement.

```javascript
// Set your publishable key. Remember to change this to your live publishable key in production!
// See your keys here: https://dashboard.stripe.com/apikeys
const stripe = Stripe('<<YOUR_PUBLISHABLE_KEY>>');
```

Pour créer un paiement côté client, ajoutez un [bouton de paiement avec GrabPay](https://docs.stripe.com/payments/grabpay.md#branding-guidelines) et utilisez `stripe.confirmGrabPayPayment` pour gérer la redirection depuis votre page et permettre le paiement.

```html
<button type="button" id="grabpay-button">Pay with GrabPay</button>
<div id="error-message"></div>
```

```javascript
const button = document.getElementById('grabpay-button');

button.addEventListener('click', async function() {
  // By this point, the PaymentIntent should have already been created
  // Pass the clientSecret of the PaymentIntent to confirmGrabPayPayment

  stripe.confirmGrabPayPayment(clientSecret, {
    // Return URL where the customer should be redirected after the authorization
    return_url: 'https://example.com/checkout/complete',
  });
});
```

Transmettez la [clé secrète du client](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-client_secret) de l’objet `PaymentIntent` que vous avez créé à l’étape&nbsp;2 par `stripe.confirmGrabPayPayment`.

Ajoutez également une URL `return_url` à cette fonction pour indiquer à Stripe vers quelle page rediriger l’utilisateur une fois son paiement effectué sur le site Web de Grab.

Lorsque votre client effectue un paiement, Stripe le redirige vers l’URL `return_url` et inclut les paramètres de requête d’URL suivants. La page de redirection peut utiliser ces paramètres pour récupérer l’état du PaymentIntent et ainsi afficher l’état du paiement pour le client.

Lorsque vous spécifiez une URL `return_url`, vous pouvez également ajouter vos propres paramètres de requête à utiliser sur la page de redirection.

| Paramètre                      | Description                                                                                                                                                                                                                                                                                                                                                     |
| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `payment_intent`               | Identifiant unique du `PaymentIntent`.                                                                                                                                                                                                                                                                                                                          |
| `payment_intent_client_secret` | La [clé secrète du client](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-client_secret) de l’objet `PaymentIntent`. Pour les intégrations d’abonnements, ce client_secret est également exposé sur l’objet `Invoice` via [confirmation_secret](https://docs.stripe.com/api/invoices/object.md#invoice_object-confirmation_secret) |

Lorsque le client est redirigé vers votre site, vous pouvez utiliser le `payment_intent_client_secret` pour interroger le PaymentIntent et communiquer l’état de la transaction à votre client.

```html
<h2>Payment result</h2>
<div class="payment-result">
</div>

<script>
  // Check if we're returning from a redirect.
  const url = new URL(window.location.href);
  const paymentIntentClientSecret = url.searchParams.get(
    "paymentIntentClientSecret"
  );
  if (paymentIntentClientSecret) {
    stripe.retrievePaymentIntent(paymentIntentClientSecret).then(function(result) {
      const paymentIntent = result.paymentIntent;
      document.querySelector(".payment-result").textContent = paymentIntent.status;
    });
  }
</script>
```

## Tester votre intégration

Lors du test, la redirection côté client vous dirige vers une page de paiement de test GrabPay hébergée par Stripe, où vous pouvez autoriser ou refuser le paiement test.

## Optional: Gérer les événements post-paiement

Stripe envoie un événement [payment_intent.succeeded](https://docs.stripe.com/api/events/types.md#event_types-payment_intent.succeeded) à l’issue du paiement. Utilisez le Dashboard, un *webhook* (A configurable endpoint that executes when it receives certain event notifications from an event destination) personnalisé ou une solution partenaire pour recevoir ces événements et exécuter des actions, comme envoyer une confirmation de commande par e-mail à votre client, enregistrer la vente dans une base de données ou lancer un workflow de livraison.

Plutôt que d’attendre un rappel de votre client, écoutez ces événements. En effet, côté client, l’acheteur pourrait fermer la fenêtre de son navigateur ou quitter l’application avant l’exécution du rappel. Des personnes malveillantes peuvent en profiter pour manipuler la réponse. Si vous configurez votre intégration de manière à écouter les événements asynchrones, cela vous permettra également d’accepter de nouveaux moyens de paiement plus facilement à l’avenir. Apprenez-en davantage sur les [différences entre les différents moyens de paiement pris en charge](https://stripe.com/payments/payment-methods-guide).

### Recevoir des événements et exécuter des actions métier

Plusieurs options s’offrent à vous pour recevoir et exécuter des actions métier.

#### Manuellement

Utilisez le Dashboard pour consulter tous vos paiements Stripe, envoyer des reçus par e-mail, gérer les virements et relancer les paiements ayant échoué.

- [Afficher vos paiements tests dans le Dashboard](https://dashboard.stripe.com/test/payments)

#### Code personnalisé

Créez un gestionnaire de webhooks pour écouter des événements et créer des tunnels de paiement asynchrones personnalisés. Testez et déboguez votre intégration de webhooks en local, grâce à la CLI Stripe.

- [Créer un webhook personnalisé](https://docs.stripe.com/events/set-up-events.md#create-event-handler)

#### Applications préconfigurées

Intégrez une application partenaire pour gérer les événements métier courants, comme l’[automatisation](https://stripe.partners/?f_category=automation), le [marketing ou les ventes](https://stripe.partners/?f_category=marketing-and-sales).

## Optional: Gérer la redirection GrabPay manuellement

Nous vous recommandons de recourir à Stripe.js pour gérer les redirections et paiements GrabPay avec `confirmGrabPayPayment`. Toutefois, vous pouvez également rediriger vos clients manuellement&nbsp;:

1. En indiquant l’URL vers laquelle vos clients seront redirigés une fois leur paiement effectué.

```curl
curl https://api.stripe.com/v1/payment_intents/{{PAYMENT_INTENT_ID}}/confirm \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "return_url=https://example.com/checkout/complete" \
  -d "payment_method_data[type]=grabpay"
```

1. En vérifiant que l’état du `PaymentIntent` est bien `requires_action` et que le type de `next_action` est `redirect_to_url`.

#### Json

```json
{
  "next_action": {
    "type": "redirect_to_url",
    "redirect_to_url": {
      "url": "https://hooks.stripe.com/...",
      "return_url": "https://example.com/checkout/complete"
    }
  },
  "payment_method_types": [
    "grabpay"
  ],
  "id": "pi_1G1sgdKi6xqXeNtkldRRE6HT",
  "object": "payment_intent",
  "amount": 1099,
  "confirmation_method": "automatic",
  "created": 1579259303,
  "currency": "sgd",
  "livemode": true
}
```

1. En redirigeant le client vers l’URL indiquée dans la propriété `next_action`.

```javascript
const action = intent.next_action;
if (action && action.type === 'redirect_to_url') {
  window.location = action.redirect_to_url.url;
}
```

À l’issue du processus de paiement, le client est redirigé vers la destination `return_url`. Les paramètres de requête `payment_intent` et `payment_intent_client_secret` de l’URL sont inclus et vous pouvez par ailleurs transmettre vos propres paramètres de requête, comme indiqué plus haut.

## Devises prises en charge

Les utilisateurs de Stripe en Malaisie et à Singapour peuvent accepter les paiements GrabPay de leurs clients en Malaisie et à Singapour respectivement. Les devises prises en charge et les limites applicables aux transactions GrabPay sont précisées ci-dessous&nbsp;:

| Pays           | Pays du client                                 | Devise prise en charge | Limites de transaction                                                                                                     |
| -------------- | ---------------------------------------------- | ---------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| Singapour (SG) | [Singapour (SG)](https://www.grab.com/sg/pay/) | SGD                    | [GrabPay SG](https://help.grab.com/passenger/en-sg/360023805451)                                                           |
| Malaisie (MY)  | [Malaisie (MY)](https://www.grab.com/my/pay/)  | MYR                    | [GrabPay MY](https://help.grab.com/passenger/en-my/360023805451-What-are-my-GrabPay-Wallet-balance-and-transaction-limits) |

