# Imprimer du contenu sur un lecteur Imprimez du contenu sur l'imprimante intégrée d'un lecteur. Avec Stripe Terminal, vous pouvez imprimer du contenu personnalisé, tel que des reçus, des tickets ou d’autres documents, directement sur l’imprimante intégrée de votre lecteur. Cette fonction n’est disponible que pour le lecteur [Verifone V660p](https://stripe.com/terminal/v660p), qui est équipé d’une imprimante thermique intégrée capable d’imprimer en noir et blanc. ## Génération de contenu imprimé Votre intégration est responsable de la génération de contenu à imprimer en tant que fichier image. Les images sont le seul format que nous prenons en charge pour l’impression. Une fois que vous disposez d’une image, convertissez-la en représentation d’image native pour votre type d’intégration (par exemple un fichier image pour une intégration pilotée par serveur, ou un [Bitmap](https://developer.android.com/reference/kotlin/android/graphics/Bitmap.html) pour Android). ### Instructions relatives au contenu Pour de meilleurs résultats, nous vous recommandons des images : - D’une largeur de 384 pixels maximum - Noir et blanc (pas de couleur) - Conçues de manière à ce que la partie la plus fine d’un caractère ou d’une ligne ait une largeur d’au moins 2 pixels, afin de garantir une impression claire et lisible > Vous êtes légalement responsable de tout contenu soumis à Stripe pour impression à l’aide de lecteurs, et devez vous assurer que vos reçus sont conformes à la loi applicable. Il vous est interdit d’imprimer des reçus contenant des éléments qui (i) enfreignent les droits d’un tiers, (ii) violent la loi applicable ou (iii) contiennent du contenu répréhensible, offensant, trompeur, inexact ou préjudiciable. ## Impression de contenu #### Piloté par le serveur - [print_content](https://docs.stripe.com/api/terminal/readers/print_content.md) Pour imprimer du contenu sur un lecteur, appelez le endpoint [print_content](https://docs.stripe.com/api/terminal/readers/print_contenu.md). Envoyez un corps `multipart/form-data` avec votre fichier image PNG ou JPEG. Le fichier téléchargé ne doit pas dépasser 100 Ko. ```curl curl https://files.stripe.com/v1/terminal/readers/tmr_FDOt2wlRZEdpd7/print_content \ -u "<>:" \ -F type=image \ -F "image=@/path/to/a/image.png" ``` > Cet endpoint se trouve sur le sous-domaine `files.stripe.com`, et non `api.stripe.com`. #### Android - [print (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/print.html) Pour imprimer du contenu à l’aide du SDK Android, transmettez une instance `PrintContent` de la classe [Bitmap](https://developer.android.com/reference/kotlin/android/graphics/Bitmap.html) native à la méthode [print](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/print.html). #### Kotlin ```kotlin val bitmap = createBitmap(384, /* some height */ ) // A width of 384 pixels is recommended // Generate print content here val printContent = PrintContent.Bitmap.create(bitmap) Terminal.getInstance().print( printContent, object : Callback { override fun onSuccess() { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` #### iOS - [print (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)print:completion:) Pour imprimer du contenu avec le SDK iOS, transmettez une instance de la classe native [UIImage](https://developer.apple.com/documentation/uikit/uiimage) à la méthode [impression](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)print:completion:). #### Swift ```swift let image = UIImage(named: "receipt") // Generate print content here let content = try PrintContentBuilder(image: image).build() Terminal.shared.print(content) { (error) in // Check for errors } ``` #### JavaScript - [print (JavaScript)](https://docs.stripe.com/terminal/references/api/js-sdk.md#print) Pour imprimer du contenu avec le SDK JavaScript, transmettez un objet [HTMLCanvasElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement) natif à la méthode [print](https://docs.stripe.com/terminal/references/api/js-sdk.md#print). #### JavaScript ```javascript const canvas = document.createElement('canvas'); canvas.width = 384; canvas.height = /* some height */; // Generate print content here const result = await terminal.print(canvas); if ('error' in result) { // Placeholder for handling exception } else { // Placeholder for handling successful operation } ``` #### React Native - [ imprimer (React Native) ](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#print) Pour imprimer du contenu à l’aide du SDK React Native, transmettez une image encodée sous forme de chaîne base64 ou de `data:` URI au schéma vers la méthode [print ](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#print). #### TypeScript ```typescript const { print } = useStripeTerminal(); // JPEG/PNG image encoded as a base64 string const imageUri = "iVBORw0KGgoAAAANSUhEUgAAAAcAAAAFCAYAAACJmvbYAAAAN0lEQVR4AUyLCQ4AQATExv7/z1YniERd5UnKgriVPpGIS9QAGsll7Rz0YMkV2HRijvns3RY+8wMAAP//S2WPFgAAAAZJREFUAwBWNAoHH+0LdQAAAABJRU5ErkJggg=="; const { error } = await print(imageUri); if (error) { // Placeholder for handling exception } else { // Placeholder for handling successful operation } ``` ## Gérer le résultat d'impression #### Piloté par le serveur Le endpoint [print_content](https://docs.stripe.com/api/terminal/readers/print_content.md) répond avec un objet [Lecteur](https://docs.stripe.com/api/terminal/readers/object.md) mis à jour lorsque la commande impression est envoyée avec succès au lecteur. Voici une exemple de réponse : ```json { "id": "tmr_FDOt2wlRZEdpd7", "object": "terminal.reader", "action": { "failure_code": null, "failure_message": null, "print_content": { "image": { "created_at": 1748971913, "filename": "image.png", "size": 15864, "type": "png" }, "type": "image" }, "status": "in_progress", "type": "print_content" }, "device_sw_version": "2.37.2.0", "device_type": "verifone_v660p", "ip_address": "0.0.0.0", "label": "Blue Rabbit", "last_seen_at": 1695166525506, "livemode": false, "location": "tml_FDOtHwxAAdIJOh", "metadata": {}, "serial_number": "452-406-028", "status": "online" } ``` L’objet `action` montre qu’une action `print_content` est `in_progress`. L’objet `print_content` contient des informations sur l’image en cours d’impression. Le endpoint répond immédiatement à une erreur de validation (par exemple, un fichier trop grand ou un format non pris en charge) avec un code d’état `400` et un corps, tel que le suivant : ```json { "error": { "message": "The file you uploaded was too large. Please upload a file smaller than 100 KB", "param": "image", "request_log_url": "https://dashboard.stripe.com/...", "type": "invalid_request_error" } } ``` #### Événements de webhook Lorsque l’opération d’impression se termine (avec succès ou avec une erreur), Stripe envoie une requête à votre [webhook endpoint](https://docs.stripe.com/webhooks.md). Stripe envoie deux événements webhook pour notifier votre back end du résultat de la commande d’impression : - ``terminal.reader.action_succeeded` : La commande d’impression a réussi. - `terminal.reader.action_failed` : La commande d’impression a échoué. Par exemple, l’imprimante a manqué de papier ou s’est bloquée pendant l’impression. La charge utile de webhook contient un objet [évènement objet](https://docs.stripe.com/api/events/object.md) où `data.object` est un objet [Lecteur](https://docs.stripe.com/api/terminal/readers/object.md) mis à jour. ##### L’événement `terminal.reader.action_succeeded` Pour un événement `terminal.reader.action_succeeded`, l’objet `data` ressemble à ce qui suit : ```json { "object": { "id": "tmr_FDOt2wlRZEdpd7", "object": "terminal.reader", "action": { "failure_code": null, "failure_message": null, "print_content": { "image": { "created_at": 1748971913, "filename": "image.png", "size": 15864, "type": "png" }, "type": "image" }, "status": "succeeded", "type": "print_content" }, "device_deploy_group": "", "device_sw_version": "2.34.0.0", "device_type": "verifone_v660p", "ip_address": "10.244.38.93", "label": "test", "livemode": false, "location": "tml_GEPlmAJnZUoXI6", "metadata": {}, "serial_number": "452-406-028", "software": null, "status": "online" }, "previous_attributes": null } ``` Le `action.status` est défini sur `succeeded`. Le `action.failure_code` et `action.failure_message` sont tous deux `null` dans ce cas. ##### L’événement `terminal.reader.action_failed` Pour un événement `terminal.reader.action_failed`, l’objet `data` ressemble à ce qui suit : ```json { "object": { "id": "tmr_FDOt2wlRZEdpd7", "object": "terminal.reader", "action": { "failure_code": "reason_out_of_paper", "failure_message": "The printer is out of paper.", "print_content": { "image": { "created_at": 1748971913, "filename": "image.png", "size": 15864, "type": "png" }, "type": "image" }, "status": "failed", "type": "print_content" }, "device_deploy_group": "", "device_sw_version": "2.34.0.0", "device_type": "verifone_v660p", "ip_address": "10.244.35.107", "label": "test", "livemode": false, "location": "tml_GEPlmAJnZUoXI6", "metadata": {}, "serial_number": "452-406-028", "software": null, "status": "online" }, "previous_attributes": null } ``` Le champ `action.status` est défini sur `failed`. Le champ `failure_code` contient la raison de l’échec, et le champ `failure_message` contient un message lisible par l’homme décrivant l’échec. Les valeurs possibles pour le champ `failure_code` sont : | Description de l’erreur | Code d’échec | | ------------------------------------------------------------------- | ---------------------- | | L’imprimante est en cours d’impression. | `printer_busy` | | Le rouleau de papier de l’imprimante est coincé. | `printer_paperjam` | | L’imprimante n’a plus de papier. | `printer_out_of_paper` | | Le couvercle ou la tête de l’imprimante est ouvert. | `printer_cover_open` | | Défaut général d’impression (attrape tout pour toute autre erreur). | `printer_failure` | Si le lecteur ne prend pas en charge l’impression, le `failure_code` est défini sur `printer_not_supported` et l’erreur revient immédiatement après l’appel du endpoint [print_content](https://docs.stripe.com/api/terminal/readers/print_content.md). Un évènement `terminal.reader.action_failed` est envoyé. #### Android Une fois la commande d’impression terminée, le SDK Android appelle la fonction `onSuccess` ou `onFailure` de l’objet [`Callback`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-callback/index.html). Dans le cas d’un échec d’impression, la fonction `onFailure` est appelée avec un objet [`TerminalException`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-terminal-exception/index.html) avec l’une des valeurs `TerminalErrorCode` suivantes : - `PRINTER_BUSY` - `PRINTER_PAPERJAM` - `PRINTER_OUT_OF_PAPER` - `PRINTER_COVER_OPEN` - `PRINTER_ABSENT` - `PRINTER_UNAVAILABLE` - `PRINTER_ERROR` Pour en savoir plus sur ces codes d’erreur, consultez la référence [`TerminalErrorCode`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-terminal-error-code/index.html#-556602182%2FClasslikes%2F-1219334616). #### iOS Une fois la commande d’impression terminée, le SDK iOS appelle le bloc `completion` fourni. En cas de succès, le bloc est appelé avec `nil`. En cas d’échec d’impression, le bloc est appelé avec un objet `NSError` avec l’un des codes `SCPError` suivants : | Objective-C | Swift | | -------------------- | -------------------- | | `PrinterBusy` | `printerBusy` | | `PrinterPaperJam` | `printerPaperJam` | | `PrinterOutOfPaper` | `printerOutOfPaper` | | `PrinterCoverOpen` | `printerCoverOpen` | | `PrinterAbsent` | `printerAbsent` | | `PrinterUnavailable` | `printerUnavailable` | | `PrinterError` | `printerError` | Pour en savoir davantage sur ces codes d’erreur, consultez la [documentation `SCPError`](https://stripe.dev/stripe-terminal-ios/docs/Enums/SCPError.html#/c:@E@SCPError@SCPErrorPrinterBusy). #### JavaScript La méthode d’[impression](https://docs.stripe.com/terminal/references/api/js-sdk.md#print) renvoie une `Promise` qui se résout en objet vide si la commande d’impression réussit. Si la commande échoue, la `Promise` se résout en objet contenant un champ `error`. L’objet `error` contient un `code` d’erreur ainsi qu’un `message` lisible par un humain. Les valeurs possibles pour le champ de `code` sont : - `printer_busy` - `printer_paperjam` - `printer_cover_open` - `printer_out_of_paper` - `printer_absent` - `printer_unavailable` - `printer_error` Voir le [Référence des codes d’erreur](https://docs.stripe.com/terminal/references/api/js-sdk.md#error-codes). #### React Native La méthode d’[impression](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#print) renvoie une `Promise` qui se résout en un objet vide si la commande d’impression réussit. Si la commande échoue, la `Promise` se résout en un objet contenant un champ `error`. La valeur de `error` est un objet [StripeError](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeError.html) contenant un [ErrorCode](https://stripe.dev/stripe-terminal-react-native/api-reference/types/ErrorCode.html) spécifique, un `message` lisible par l’utilisateur et des détails supplémentaires tels que `apiError` et `underlyingError`.