diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index d5789429c8..176f907d89 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,9 +1,3 @@ ## Description -Describe what your Pull Request is about, including important information about what was done. - - - -### Issue involved - -Fixes # +Describe what your Pull Request is about, including important information about what was done. \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8aa61a3dba..90fa5f6c05 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,6 +3,6 @@ repos: rev: v1.1.0 hooks: - id: pre_commit_hook - stages: [commit] + stages: [pre-commit] - id: post_commit_hook stages: [post-commit] diff --git a/README.md b/README.md index e07e82fff9..7943b518c0 100644 --- a/README.md +++ b/README.md @@ -30,9 +30,8 @@ Pagina Principal Jerarquía Identificador Idioma For 4. Crear un `pull Request` al `branch` `development`, de preferencia proveer contenido traducido en los lenguajes soportados esto permitirá que tu contribución pueda verse reflejada en el sitio en menor tiempo. 5. El contenido será revisado y comentado por nuestro equipo, puede que te solicitemos algunas correcciones antes de aprobar la contribución. - - ## ¿En qué puedo contribuir? ## + - **Traducciones**, Los issues pendientes de traduccion serán marcados con el Tag (Missing Translation) para su fácil identificacion. - **Corrección de estilo**, Si identificas algun error gramatical o el contenido se muestra poco claro y crees que puede ser mejorado, tu ayuda será bien recibida. - **Corrección de Snippets**, Si identificas algun snippet de código que no está funcionando adecuadamente o no retorna los resultados que se indican en la documentación los ajustes o correcciones son bienvenidos. @@ -40,4 +39,4 @@ Pagina Principal Jerarquía Identificador Idioma For ## Tengo una idea o sugerencia ## -Crea un issue y usa el Tag (idea) para que pueda ser asignado y atendido. +Crea un issue y usa el Tag (idea) para que pueda ser asignado y atendido. \ No newline at end of file diff --git a/guides/checkout-api-v2/how-to-integrate-3ds-bigmerchants.en.md b/guides/checkout-api-v2/how-to-integrate-3ds-bigmerchants.en.md new file mode 100644 index 0000000000..a4894c3fa8 --- /dev/null +++ b/guides/checkout-api-v2/how-to-integrate-3ds-bigmerchants.en.md @@ -0,0 +1,660 @@ +# How to integrate 3DS with ----[mlb]---- Checkout Transparente------------ ----[mla, mlm, mlu, mco, mlc, mpe]---- Checkout API ------------ + +In this documentation you will find all the necessary information to carry out the integration with 3DS with ----[mlb]---- Checkout Transparente. ------------ ----[mla, mlm, mlu, mco, mlc, mpe]---- Checkout API. ------------ For more information on how this type of authentication works, see [3DS 2.0](/developers/en/docs/checkout-api/how-tos/improve-payment-approval/3ds). + +> WARNING +> +> Important +> +> To integrate with 3DS, certain requirements must be met. Before moving on to the next steps, review the [Prerequisites](/developers/en/docs/checkout-api/prerequisites) section and make sure that all are met. + +## Integrate with 3DS + +3DS authentication can be done through two different flows: **with or without Challenge**, which are additional steps that the buyer must complete to ensure their identity. The decision to include or exclude the Challenge depends on the card issuer and the risk profile of the transaction being performed. + +> Also learn about the integrations via [Checkout Bricks,](/developers/en/docs/checkout-bricks/how-tos/integrate-3ds) a modular, secure and customizable payment method that automates several of the processes described below. + +For **low-risk transactions**, the information sent at checkout is sufficient and the additional Challenge steps are not necessary. However, **for cases of high fraud risk**, the Challenge is necessary to **verify the buyer's identity**, which increases card transaction conversion. + +Below are the steps to integrate with 3DS. + +1. Use the Mercado Pago [SDK JS](https://www.mercadopago.com.br/developers/en/docs/sdks-library/client-side/mp-js-v2) at checkout to generate the [credit card token](/developers/en/docs/checkout-api/integration-configuration/card/integrate-via-cardform). +2. Next, send the **checkout data** along with the **card token** to the backend. +3. After that, make a request to create a new payment with the received data. The `three_d_secure_mode` attribute needs to be sent with one of the following values: + 1. `not_supported`: 3DS must not be used (this is the default value). + 2. `optional`: 3DS may or may not be required, depending on the risk profile of the transaction. + 3. `mandatory`: 3DS will be required mandatorily. + +> WARNING +> +> Important +> +> We recommend using the `optional` value in the implementation of 3DS, as it balances security and transaction approval. The `mandatory`should be used only for integrations that require all approved transactions to go through 3DS. +>

+> The payment capture must be automatic (`capture=true`), and the transaction should be created with binary mode deactivated (`binary mode=false`), as it might remain pending while waiting for the buyer to complete the Challenge. + +[[[ +```php +setCustomHeaders(["X-Idempotency-Key: "]); + + $payment = $client->create([ + "transaction_amount" => , + "token" => "CARD_TOKEN", + "description" => "", + "installments" => , + "payment_method_id" => "", + "issuer_id" => "", + "payer" => [ + "email" => $_POST['email'] + ], + "three_d_secure_mode" => "optional" + ], $request_options); + echo implode($payment); +?> +``` +```java +MercadoPagoConfig.setAccessToken(""); + PaymentClient client = new PaymentClient(); + PaymentCreateRequest createRequest = + PaymentCreateRequest.builder() + .transactionAmount(new BigDecimal()) + .token("") + .description("") + .installments() + .paymentMethodId("") + .payer( + PaymentPayerRequest.builder() + .email("") + .build() + ) + .threeDSecureMode("optional") + .build(); + client.create(createRequest); +``` +```csharp +using MercadoPago.Config; +using MercadoPago.Client.Payment; +using MercadoPago.Resource.Payment; +MercadoPagoConfig.AccessToken = ""; +var request = new PaymentCreateRequest +{ + TransactionAmount = , + Token = "", + Description = "", + Installments = , + Payer = new PaymentPayerRequest + { + Email = "", + }, + ThreeDSecureMode = "optional", +}; +var client = new PaymentClient(); +Payment payment = await client.CreateAsync(request); +``` +```node +import { MercadoPagoConfig, Payment } from 'mercadopago'; + +const client = new MercadoPagoConfig({ accessToken: '' }); +const payment = new Payment(client); + +const body = { + transaction_amount: , + token: '', + description: '', + installments: , + payment_method_id: '', + issuer_id: '', + payer: { + email: '', + }, + three_d_secure_mode: 'optional' +} +payment.create({ body: body, requestOptions: { idempotencyKey: '' } }).then(console.log).catch(console.log); +``` +```ruby + +require 'mercadopago' +sdk = Mercadopago::SDK.new('') +payment_request = { + token: '', + installments: , + transaction_amount: , + description: '', + payer: { + email: '', + }, + three_d_secure_mode: 'optional' +} +payment_response = sdk.payment.create(payment_request) +payment = payment_response[:response] +``` +```python +import mercadopago +sdk = mercadopago.SDK("") +payment_data = { + "transaction_amount": , + "token": "", + "description": "", + "installments": , + "payer": { + "email": "", + }, + "three_d_secure_mode": "optional" +} +payment_response = sdk.payment().create(payment_data) +payment = payment_response["response"] +``` +```go +package main + +import ( + "context" + "fmt" + + "github.com/mercadopago/sdk-go/pkg/config" + "github.com/mercadopago/sdk-go/pkg/payment" +) + +func main() { + accessToken := "" + + cfg, err := config.New(accessToken) + if err != nil { + fmt.Println(err) + return + } + + client := payment.NewClient(cfg) + + request := payment.Request{ + TransactionAmount:, + Payer: &payment.PayerRequest{ + Email: "", + }, + Token: "", + Installments: , + Description: "", + ThreeDSecureMode: "optional", + } + + resource, err := client.Create(context.Background(), request) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println(resource) +} +``` +```curl + +curl --location --request POST 'https://api.mercadopago.com/v1/payments' \ +--header 'Authorization: ' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "payer": { + "email": "" + }, + "additional_info": { + "items": [ + { + "quantity": , + "category_id": , + "title": , + "unit_price": + } + ] + }, + "payment_method_id": , + "marketplace": "NONE", + "installments": , + "transaction_amount": , + "description": "", + "token": "CARD_TOKEN", + "three_d_secure_mode": "optional", + "capture": true, + "binary_mode": false +}' +``` +]]] + +If the Challenge flow is not required, the payment `status` field will have a value of `approved` and it will not be necessary to display it, so it is possible to proceed with the application flow. + +For cases where the Challenge is necessary, the status will show the value `pending`, and the `status_detail` will be `pending_challenge`. + +> WARNING +> +> Important +> +> In the latter case, the response will show a payment attribute called `three_ds_info` with the fields `external_resource_url`, which contains the Challenge URL, and `creq`, a Challenge request identifier. It will be necessary to display the Challenge and treat its result with the following steps. + +### Response overview (information omitted) + +When the Challenge is initiated, the user has about 5 minutes to complete it. If it is not completed, the bank will decline the transaction and Mercado Pago will consider the payment cancelled. While the user doesn't complete the Challenge, the payment will remain as `pending_challenge`. + +[[[ +```Json + +{ + "id": 52044997115, + ... + "status": "pending", + "status_detail": "pending_challenge", + ... + "three_ds_info": + { + "external_resource_url": "https://acs-public.tp.mastercard.com/api/v1/browser_Challenges", + "creq": "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImJmYTVhZjI0LTliMzAtNGY1Yi05MzQwLWJkZTc1ZjExMGM1MCIsImFjc1RyYW5zSUQiOiI3MDAwYTI2YS1jYWQ1LTQ2NjQtOTM0OC01YmRlZjUwM2JlOWYiLCJjaGFsbGVuZ2VXaW5kb3dTaXplIjoiMDQiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIn0" + }, + "owner": null +} + +``` +]]] + +4. For a better view of the 3DS Challenge in a responsive way, you should add the CSS below. + +```css + #myframe{ + width: 500px; + height: 600px; + border: none; + } + @media only screen and (width <= 980px) { + #myframe{ + width: 100%; + height: 440px; + } + } +``` + +5. To **display the Challenge**, you need to generate an iframe containing a form with `method post`, `action` containing the URL obtained in the field `external_resource_url`, and a hidden input with the value returned in `creq`. Then, you must post the form below to start the Challenge. + +[[[ +```javascript + +function doChallenge(payment) { + try { + const { + status, + status_detail, + three_ds_info: { creq, external_resource_url }, + } = payment; + if (status === "pending" && status_detail === "pending_challenge") { + var iframe = document.createElement("iframe"); + iframe.name = "myframe"; + iframe.id = "myframe"; + document.body.appendChild(iframe); + + var idocument = iframe.contentWindow.document; + + var myform = idocument.createElement("form"); + myform.name = "myform"; + myform.setAttribute("target", "myframe"); + myform.setAttribute("method", "post"); + myform.setAttribute("action", external_resource_url); + + var hiddenField = idocument.createElement("input"); + hiddenField.setAttribute("type", "hidden"); + hiddenField.setAttribute("name", "creq"); + hiddenField.setAttribute("value", creq); + myform.appendChild(hiddenField); + iframe.appendChild(myform); + + myform.submit(); + } + } catch (error) { + console.log(error); + alert("Error doing challenge, try again later."); + } +} + +``` +]]] + +When the Challenge is completed, the payment status will be updated to `approved` if the authentication is successful, and `rejected` if it is not. In situations where authentication is not performed, the payment remains `pending`. This update is not immediate and may take a few moments. + +See the section below for more details on how to check the status of each transaction. + +## Check the status of the transaction + +To find out the result of each transaction, there are three options: + +* **Notifications**: A notification of the payment status change will be received through Webhooks and the buyer must be redirected to a screen indicating that the transaction was successful. Check the [Webhooks](/developers/en/docs/checkout-api/additional-content/your-integrations/notifications/webhooks) section and learn how to set it up. +* **Payments API**: It will be necessary to make a [Payments](developers/en/reference/payments/_payments/post) pooling and if the status changes, redirect the buyer to a confirmation screen. +* **Treat the iframe event (recommended)**: Keep in mind that the event only indicates that the Challenge has ended and not that the payment has reached a final status, as the update is not immediate and may take a few moments. Make a request to [Payments](/developers/en/reference/payments/_payments/post) and if the status changes, redirect the buyer to a screen indicating that the transaction was successful. + +To **treat the iframe event**, follow the steps below. + +### Perform implementation + +Use the following JavaScript code to implement and request the event that indicates that the Challenge has ended, so it is possible to redirect the client to the confirmation screen. + +[[[ +```javascript + +window.addEventListener("message", (e) => { + if (e.data.status === "COMPLETE") { + window.open("congrats.html"); + } +}); + +``` +]]] + +### Search payment status + +The following Javascript indicates how to search for the updated payment status and display it on the confirmation screen. + +[[[ +```javascript + +document.addEventListener("DOMContentLoaded", async function (e) { + heat(); +}); + +async function init() { + const id = localStorage.getItem("paymentId"); + + try { + const response = await fetch("/get_payment/" + id, { + method: "GET", + }); + const result = await response.json(); + if (result.status != 200) throw new Error("error getting payment"); + document.getElementById("congrats-div").innerHTML = + "Pagamento " + result.data.id + " -> Status: " + result.data.status; + } catch (error) { + alert("Unexpected error\n" + JSON.stringify(error)); + } +} + +``` +]]] + +> WARNING +> +> Important +> +> If the payment is still `pending` after the Challenge timeout, it will be necessary to redirect the buyer to a screen informing that the payment has expired and that a new one needs to be created (the update is not immediate, it may take some moments). + +After following these steps, your integration is ready to authenticate transactions with 3DS. + +## Possible payment statuses + +A transaction with 3DS can return different statuses depending on the type of authentication performed (with or without Challenge). In a payment **without Challenge**, the transaction status will be directly `approved` or `rejected`. + +In a payment **with Challenge**, the transaction will have a `pending` status and the authentication process with the bank will be initiated. Only after this step, the final status will be displayed. + +See below the table with the possible statuses and their respective descriptions. + +| Status | Status_detail | Description | +|------------|-------------------------------|------------------------------------------------------------------| +| "approved" | "accredited" | Transaction approved without authentication. | +| "rejected" | - | Transaction rejected without authentication. To check the reasons, please refer to the standard [list of status details](https://mercadopago.com.br/developers/en/docs/checkout-api/response-handling/collection-results). | +| "pending" | "pending_challenge" | Transaction pending authentication or Challenge timeout. | +| "rejected" | "cc_rejected_3ds_challenge" | Transaction rejected due to Challenge failure. | +| "rejected" | "cc_rejected_3ds_mandatory" | Transaction rejected for not complying with 3DS validation when it is mandatory. | +| "cancelled" | "expired" | Transaction with Challenge canceled after 24 hours in pending status. | + +## Integration test + +To facilitate the validation of 3DS payments, we have created a sandbox testing environment. This environment returns fictional results that are only used for simulating and validating the implementation. + +> WARNING +> +> Important +> +> To test the integration, it is necessary to use your test credentials. Also, make sure to include the `three_d_secure_mode` attribute, setting it as `optional` or `mandatory`, to ensure the correct implementation of the 3DS payment. + +To test payments in a sandbox environment, specific cards should be used to test the implementation of the Challenge with both success and failure flows, as shown in the table below: + +| Card | Flow | Number | Security Code | Expiration Date | +|-------------|-------------------------|---------------------|----------------|-----------------| +| Mastercard | Successful Challenge | 5483 9281 6457 4623 | 123 | 11/25 | +| Mastercard | Unauthorized Challenge | 5361 9568 0611 7557 | 123 | 11/25 | +| Matercard | 3ds mandatory | 5031 7557 3453 0604 | 123 | 11/25 | + +The steps to create the payment remain the same. If you have any doubts about how to create card payments, please refer to the [documentation on Cards](https://www.mercadopago.com.br/developers/en/docs/checkout-api/integration-configuration/card/integrate-via-cardform). + +[[[ +```php +setCustomHeaders(["X-Idempotency-Key: "]); + + $payment = $client->create([ + "transaction_amount" => (float) $_POST['transactionAmount'], + "token" => $_POST['token'], + "description" => $_POST['description'], + "installments" => $_POST['installments'], + "payment_method_id" => $_POST['paymentMethodId'], + "issuer_id" => $_POST['issuer'], + "payer" => [ + "email" => $_POST['email'], + "identification" => [ + "type" => $_POST['identificationType'], + "number" => $_POST['number'] + ] + ], + "three_d_secure_mode" => "optional" + ], $request_options); + echo implode($payment); +?> +``` +```node +import { MercadoPagoConfig, Payment } from 'mercadopago'; + +const client = new MercadoPagoConfig({ accessToken: 'YOUR_ACCESS_TOKEN' }); +const payment = new Payment(client); + +const body = { +transaction_amount: req.transaction_amount, + token: req.token, + description: req.description, + installments: req.installments, + payment_method_id: req.paymentMethodId, + issuer_id: req.issuer, + payer: { + email: req.email, + identification: { + type: req.identificationType, + number: req.number + } + }, + three_d_secure_mode: 'optional' +}; + +payment.create({ body: body, requestOptions: { idempotencyKey: '' } }).then(console.log).catch(console.log); +``` +```java +PaymentClient client = new PaymentClient(); + +PaymentCreateRequest paymentCreateRequest = + PaymentCreateRequest.builder() + .transactionAmount(request.getTransactionAmount()) + .token(request.getToken()) + .description(request.getDescription()) + .installments(request.getInstallments()) + .paymentMethodId(request.getPaymentMethodId()) + .payer( + PaymentPayerRequest.builder() + .email(request.getPayer().getEmail()) + .firstName(request.getPayer().getFirstName()) + .identification( + IdentificationRequest.builder() + .type(request.getPayer().getIdentification().getType()) + .number(request.getPayer().getIdentification().getNumber()) + .build()) + .build()) + .threeDSecureMode("optional") + .build(); + +client.create(paymentCreateRequest); +``` +```ruby +require 'mercadopago' +sdk = Mercadopago::SDK.new('YOUR_ACCESS_TOKEN') + +payment_data = { + transaction_amount: params[:transactionAmount].to_f, + token: params[:token], + description: params[:description], + installments: params[:installments].to_i, + payment_method_id: params[:paymentMethodId], + payer: { + email: params[:email], + identification: { + type: params[:identificationType], + number: params[:identificationNumber] + } + three_d_secure_mode: "optional", + } +} + +payment_response = sdk.payment.create(payment_data) +payment = payment_response[:response] + +puts payment +``` +```csharp +using System; +using MercadoPago.Client.Common; +using MercadoPago.Client.Payment; +using MercadoPago.Config; +using MercadoPago.Resource.Payment; + +MercadoPagoConfig.AccessToken = "YOUR_ACCESS_TOKEN"; + +var paymentRequest = new PaymentCreateRequest +{ + TransactionAmount = decimal.Parse(Request["transactionAmount"]), + Token = Request["token"], + Description = Request["description"], + Installments = int.Parse(Request["installments"]), + PaymentMethodId = Request["paymentMethodId"], + Payer = new PaymentPayerRequest + { + Email = Request["email"], + Identification = new IdentificationRequest + { + Type = Request["identificationType"], + Number = Request["identificationNumber"], + }, + }, +ThreeDSecureMode = "optional", +}; + +var client = new PaymentClient(); +Payment payment = await client.CreateAsync(paymentRequest); + +Console.WriteLine(payment.Status); +``` +```python +import mercadopago +sdk = mercadopago.SDK("ACCESS_TOKEN") + +payment_data = { + "transaction_amount": float(request.POST.get("transaction_amount")), + "token": request.POST.get("token"), + "description": request.POST.get("description"), + "installments": int(request.POST.get("installments")), + "payment_method_id": request.POST.get("payment_method_id"), + "payer": { + "email": request.POST.get("email"), + "identification": { + "type": request.POST.get("type"), + "number": request.POST.get("number") + } + } + "three_d_secure_mode": "optional" +} + +payment_response = sdk.payment().create(payment_data) +payment = payment_response["response"] + +print(payment) +``` +```go +package main + +import ( + "context" + "fmt" + + "github.com/mercadopago/sdk-go/pkg/config" + "github.com/mercadopago/sdk-go/pkg/payment" +) + +func processPayment(r *http.Request) { + accessToken := "{{ACCESS_TOKEN}}" + + cfg, err := config.New(accessToken) + if err != nil { + fmt.Println(err) + return + } + + client := payment.NewClient(cfg) + + request := payment.Request{ + TransactionAmount: r.FormValue("transactionAmount"), + Token: r.FormValue("token"), + Description: r.FormValue("description"), + PaymentMethodID: r.FormValue("paymentMethodId"), + Payer: &payment.PayerRequest{ + Email: r.FormValue("email"), + Identification: &payment.IdentificationRequest{ + Type: r.FormValue("type"), + Number: r.FormValue("number"), + }, + }, + } + + resource, err := client.Create(context.Background(), request) + if err != nil { + fmt.Println(err) + } + + fmt.Println(resource) +} +``` +```curl +curl -X POST \ + -H 'accept: application/json' \ + -H 'content-type: application/json' \ + -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ + 'https://api.mercadopago.com/v1/payments' \ + -d '{ + "transaction_amount": 100, + "token": "CARD_TOKEN", + "description": "Blue shirt", + "installments": 1, + "payment_method_id": "master", + "issuer_id": 310, + "payer": { + "email": "PAYER_EMAIL" + }, + "three_d_secure_mode": "optional" + }' +``` +]]] + +### Challenge + +In both the success and failure flows, the Challenge, which is a screen similar to the one shown below, should be displayed within the iframe: + +![Challenge](/images/api/sandbox-v1-en.png) + +The provided verification code is for illustrative purposes only. To complete the test flow, simply click the **Confirm** button. After completing this action, follow the detailed instructions in the [Check the status of the transaction](/developers/en/docs/checkout-api/how-tos/integrate-3ds#bookmark_check_transaction_status) section to determine when the Challenge has been completed and how to check for payment updates. \ No newline at end of file diff --git a/guides/checkout-api-v2/how-to-integrate-3ds-bigmerchants.es.md b/guides/checkout-api-v2/how-to-integrate-3ds-bigmerchants.es.md new file mode 100644 index 0000000000..7391d6a936 --- /dev/null +++ b/guides/checkout-api-v2/how-to-integrate-3ds-bigmerchants.es.md @@ -0,0 +1,661 @@ +# Cómo integrar 3DS con ----[mlb]---- Checkout Transparente------------ ----[mla, mlm, mlu, mco, mlc, mpe]---- Checkout API ------------ + +En esta documentación encontrarás toda la información necesaria para realizar la integración con 3DS con ----[mlb]---- Checkout Transparente. ------------ ----[mla, mlm, mlu, mco, mlc, mpe]---- Checkout API. ------------ Para obtener más información sobre cómo funciona este tipo de autenticación, consulte [3DS 2.0](/developers/es/docs/checkout-api/how-tos/improve-payment-approval/3ds). + +> WARNING +> +> Importante +> +> Para integrarse con 3DS, se deben cumplir ciertos requisitos. Antes de continuar con los siguientes pasos, revise la sección [Requisitos previos](/developers/es/docs/checkout-api/prerequisites) y asegúrese de que se cumplan todos. + +## Integrar con 3DS + +La autenticación 3DS se puede realizar a través de dos flujos distintos: **con o sin _Challenge_**, que son pasos adicionales que el comprador debe completar para garantizar su identidad. La decisión de incluir o no el _Challenge_ depende del emisor de la tarjeta y del perfil de riesgo de la transacción que se realiza. + +> Obtenga también información sobre las integraciones a través de [Checkout Bricks,](/developers/es/docs/checkout-bricks/how-tos/integrate-3ds) un método de pago modular, seguro y personalizable que automatiza varios de los procesos que se describen a continuación. + +Para **transacciones de bajo riesgo**, la información enviada en el momento del pago es suficiente y los pasos adicionales de _Challenge_ **no son necesarios**. Sin embargo, **para casos donde existe un alto riesgo de fraude**, _Challenge_ es requerido para **verificar la identidad del comprador**, lo que aumenta la conversión de las transacciones con tarjeta. + +A continuación se presentan los pasos para realizar una integración con 3DS. + +1. Debes usar el [SDK JS](/developers/es/docs/sdks-library/client-side/mp-js-v2) de Mercado Pago en el checkout para generar el [token de la tarjeta de crédito](/developers/es/docs/checkout-api/integration-configuration/card/integrate-via-cardform). +2. Después, postea los **datos del checkout** junto con el **token de la tarjeta** para su backend. +3. Allí, haz una llamada para crear un nuevo pago con los datos recibidos. Es necesario que sea enviado el atributo `three_d_secure_mode` con uno de los siguientes valores: + 1. `not_supported`: no se debe usar 3DS (es el valor por default). + 2. `optional`: se puede requerir 3DS o no, dependiendo del perfil de riesgo de la transacción. + 3. `mandatory`: 3DS será requerido obligatoriamente. + +> WARNING +> +> Importante +> +> Recomendamos usar el valor `optional` en la implementación del 3DS, ya que equilibra la seguridad y la aprobación de transacciones. El uso de `mandatory` debe limitarse a integraciones que requieran que todas las transacciones aprobadas pasen por 3DS. +>

+> Además, la captura del pago debe ser automática (`capture=true`) y la transacción debe crearse con el modo binario desactivado (`binary mode=false`), ya que podría quedar pendiente esperando que el comprador complete el _Challenge_. + +[[[ +```php +setCustomHeaders(["X-Idempotency-Key: "]); + + $payment = $client->create([ + "transaction_amount" => , + "token" => "CARD_TOKEN", + "description" => "", + "installments" => , + "payment_method_id" => "", + "issuer_id" => "", + "payer" => [ + "email" => $_POST['email'] + ], + "three_d_secure_mode" => "optional" + ], $request_options); + echo implode($payment); +?> +``` +```java +MercadoPagoConfig.setAccessToken(""); + PaymentClient client = new PaymentClient(); + PaymentCreateRequest createRequest = + PaymentCreateRequest.builder() + .transactionAmount(new BigDecimal()) + .token("") + .description("") + .installments() + .paymentMethodId("") + .payer( + PaymentPayerRequest.builder() + .email("") + .build() + ) + .threeDSecureMode("optional") + .build(); + client.create(createRequest); +``` +```csharp +using MercadoPago.Config; +using MercadoPago.Client.Payment; +using MercadoPago.Resource.Payment; +MercadoPagoConfig.AccessToken = ""; +var request = new PaymentCreateRequest +{ + TransactionAmount = , + Token = "", + Description = "", + Installments = , + Payer = new PaymentPayerRequest + { + Email = "", + }, + ThreeDSecureMode = "optional", +}; +var client = new PaymentClient(); +Payment payment = await client.CreateAsync(request); +``` +```node +import { MercadoPagoConfig, Payment } from 'mercadopago'; + +const client = new MercadoPagoConfig({ accessToken: '' }); +const payment = new Payment(client); + +const body = { + transaction_amount: , + token: '', + description: '', + installments: , + payment_method_id: '', + issuer_id: '', + payer: { + email: '', + }, + three_d_secure_mode: 'optional' +} +payment.create({ body: body, requestOptions: { idempotencyKey: '' } }).then(console.log).catch(console.log); +``` +```ruby + +require 'mercadopago' +sdk = Mercadopago::SDK.new('') +payment_request = { + token: '', + installments: , + transaction_amount: , + description: '', + payer: { + email: '', + }, + three_d_secure_mode: 'optional' +} +payment_response = sdk.payment.create(payment_request) +payment = payment_response[:response] +``` +```python +import mercadopago +sdk = mercadopago.SDK("") +payment_data = { + "transaction_amount": , + "token": "", + "description": "", + "installments": , + "payer": { + "email": "", + }, + "three_d_secure_mode": "optional" +} +payment_response = sdk.payment().create(payment_data) +payment = payment_response["response"] +``` +```go +package main + +import ( + "context" + "fmt" + + "github.com/mercadopago/sdk-go/pkg/config" + "github.com/mercadopago/sdk-go/pkg/payment" +) + +func main() { + accessToken := "" + + cfg, err := config.New(accessToken) + if err != nil { + fmt.Println(err) + return + } + + client := payment.NewClient(cfg) + + request := payment.Request{ + TransactionAmount:, + Payer: &payment.PayerRequest{ + Email: "", + }, + Token: "", + Installments: , + Description: "", + ThreeDSecureMode: "optional", + } + + resource, err := client.Create(context.Background(), request) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println(resource) +} +``` +```curl + +curl --location --request POST 'https://api.mercadopago.com/v1/payments' \ +--header 'Authorization: ' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "payer": { + "email": "" + }, + "additional_info": { + "items": [ + { + "quantity": , + "category_id": , + "title": , + "unit_price": + } + ] + }, + "payment_method_id": , + "marketplace": "NONE", + "installments": , + "transaction_amount": , + "description": "", + "token": "CARD_TOKEN", + "three_d_secure_mode": "optional", + "capture": true, + "binary_mode": false +}' +``` +]]] + +En caso de que no sea necesario utilizar el flujo de _Challenge_, el campo del _status_ del pago tendrá valor `approved` y no será necesario mostrarlo, por lo que puedes seguir con el flujo de tu aplicación. + +Para casos en que el _Challenge_ es necesario, el _status_ mostrará el valor `pending`, y el `status_detail` será `pending_challenge`. + +> WARNING +> +> Importante +> +> En este último caso, la respuesta mostrará un atributo del pago llamado `three_ds_info` con los campos `external_resource_url`, que contiene la URL del _Challenge_, y `creq`, un identificador del _Challenge_ request. Será necesario mostrar el _Challenge_ y tratar su resultado con los pasos siguientes. + +### Overview del response (se omitió información) + +Cuando se inicia el Challenge, el usuario tiene aproximadamente 5 minutos para completarlo. Si no se completa, el banco rechazará la transacción y Mercado Pago considerará el pago cancelado. Mientras el usuario no complete el Challenge, el estado del pago permanecerá como `pending_challenge`. + +[[[ +```Json + +{ + "id": 52044997115, + ... + "status": "pending", + "status_detail": "pending_challenge", + ... + "three_ds_info": + { + "external_resource_url": "https://acs-public.tp.mastercard.com/api/v1/browser_Challenges", + "creq": "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImJmYTVhZjI0LTliMzAtNGY1Yi05MzQwLWJkZTc1ZjExMGM1MCIsImFjc1RyYW5zSUQiOiI3MDAwYTI2YS1jYWQ1LTQ2NjQtOTM0OC01YmRlZjUwM2JlOWYiLCJjaGFsbGVuZ2VXaW5kb3dTaXplIjoiMDQiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIn0" + }, + "owner": null +} + +``` +]]] + +4. Para una mejor visualización del _Challenge_ del 3DS de forma responsiva, debes agregar el CSS que se muestra a continuación. + +```css + #myframe{ + width: 500px; + height: 600px; + border: none; + } + @media only screen and (width <= 980px) { + #myframe{ + width: 100%; + height: 440px; + } + } +``` + +5. Para **mostrar el _Challenge_**, es necesario que generes un _iframe_ que contenga un formulario con `method post`, `action` que contenga la URL obtenida en el campo `external_resource_url`, y un input oculto con el valor obtenido en `creq`. Después, debes hacer el post del form a continuación para empezar el _challenge_. + +[[[ +```javascript + +function doChallenge(payment) { + try { + const { + status, + status_detail, + _three_ds_info: { creq, external_resource_url }, + } = payment; + if (status === "pending" && status_detail === "pending_challenge") { + var iframe = document.createElement("iframe"); + iframe.name = "myframe"; + iframe.id = "myframe"; + document.body.appendChild(iframe); + + var idocument = iframe.contentWindow.document; + + var myform = idocument.createElement("form"); + myform.name = "myform"; + myform.setAttribute("target", "myframe"); + myform.setAttribute("method", "post"); + myform.setAttribute("action", external_resource_url); + + var hiddenField = idocument.createElement("input"); + hiddenField.setAttribute("type", "hidden"); + hiddenField.setAttribute("name", "creq"); + hiddenField.setAttribute("value", creq); + myform.appendChild(hiddenField); + iframe.appendChild(myform); + + myform.submit(); + } + } catch (error) { + console.log(error); + alert("Error doing challenge, try again later."); + } +} + +``` +]]] + +Cuando el _Challenge_ es finalizado, el _status_ del pago será actualizado. Será `approved` si la autenticación fue exitosa, `rejected` si no lo fue y, en caso de que la autenticación no fuera hecha, el pago permanecerá `pending`. Esta actualización no es inmediata, puede tardar unos instantes. + +Mira la sección a continuación para más detalles sobre cómo consultar el _status_ de cada transacción. + +## Consultar status de la transacción + +Para saber cuál es el resultado de la transacción, hay tres opciones: + +* **Notificaciones**: Recibirás la notificación del cambio del _status_ del pago usando Webhooks y deberás redireccionar el buyer para una pantalla que indica que la transacción fue exitosa. Consulta la sección de [Webhooks](/developers/es/docs/checkout-api/additional-content/your-integrations/notifications/webhooks) y aprende cómo configurarlos. +* **API de Payments**: Deberás hacer un pooling en [Payments](/developers/es/reference/payments/_payments/post) y, si el _status_ cambia, redireccionar el buyer para una pantalla de confirmación. +* **Tratar el evento del iframe (recomendado)**: debes recordar que el evento solo indica que finalizó el _Challenge_ y no que el pago pasó a un _status_ final, dado que la actualización no es inmediata y puede tardar unos instantes. Deberás hacer una consulta en [Payments](/developers/es/reference/payments/_payments/post) y, si el _status_ cambia, redireccionar al buyer para una pantalla que indica que la transacción fue exitosa. + +Para **tratar el evento del iframe**, sigue los pasos a continuación. + +### Realizar implementación + +Utilice el código JavaScript a continuación para implementar y escuchar el evento que indica que el _Challenge_ ha finalizado, de esta manera es posible redirigir al cliente a la pantalla de confirmación. + +[[[ +```javascript + +window.addEventListener("message", (e) => { + if (e.data.status === "COMPLETE") { + window.open("congrats.html"); + } +}); + +``` +]]] + +### Buscar status del pago + +El siguiente Javascript indica cómo se puede realizar la búsqueda del _status_ de pago actualizado y mostrarlo en la pantalla de confirmación. + +[[[ +```javascript + +document.addEventListener("DOMContentLoaded", async function (e) { + init(); +}); + +async function init() { + const id = localStorage.getItem("paymentId"); + + try { + const response = await fetch("/get_payment/" + id, { + method: "GET", + }); + const result = await response.json(); + if (result.status != 200) throw new Error("error getting payment"); + document.getElementById("congrats-div").innerHTML = + "Pagamento " + result.data.id + " -> Status: " + result.data.status; + } catch (error) { + alert("Unexpected error\n" + JSON.stringify(error)); + } +} + +``` +]]] + +> WARNING +> +> Importante +> +> Si el pago continúa `pending` después del timeout del _Challenge_, entonces deberás redireccionar al buyer para una pantalla que informe que el pago expiró y que es necesario crear uno nuevo (la actualización no es inmediata, puede tardar unos instantes). + +Después de seguir estos pasos, tu integración está lista para autenticar transacciones con 3DS. + +## Posibles status del pago + +Una transacción con 3DS puede devolver diferentes _status_ según el tipo de autenticación realizada (con o sin _Challenge_). En un pago sin _Challenge_, el _status_ de la transacción será directamente `approved` o `rejected`. + +En un pago con _Challenge_, la transacción estará en _status_ `pending` y se iniciará el proceso de autenticación con el banco. Solo después de esta etapa se mostrará el _status_ final. + +A continuación se muestra una tabla con los posibles _status_ y sus descripciones correspondientes. + +| Status | Status_detail | Descripción | +|-----------|-----------------------------|------------------------------------------------------------------| +| "approved" | "accredited" | Transacción aprobada sin autenticación. | +| "rejected" | - | Transacción denegada sin autenticación. Para verificar los motivos, consulta la [lista estándar de status detail](https://mercadopago.com.br/developers/es/docs/checkout-api/response-handling/collection-results). | +| "pending" | "pending_challenge" | Transacción pendiente de autenticación o _timeout_ del _Challenge_. | +| "rejected" | "cc_rejected_3ds_challenge" | Transacción denegada debido a falla en el _Challenge_. | +| "rejected"| "cc_rejected_3ds_mandatory" | Transacción rechazada por no cumplir validación de 3DS cuando esta es mandatory. | +| "cancelled" | "expired" | Transacción con _Challenge_ cancelada después de 24 horas en estado pendiente. | + +## Prueba de integración + +Para facilitar la validación de pagos con 3DS, hemos creado un entorno de pruebas tipo *sandbox*. Este entorno devuelve resultados ficticios que sólo se utilizan para simular y validar la implementación. + +> WARNING +> +> Importante +> +> Para probar la integración, es necesario utilizar sus **credenciales de prueba**. Asegúrese también de incluir el atributo `three_d_secure_mode`, definiéndolo como `optional` o `mandatory`, para garantizar la correcta implementación del pago 3DS. + +Para probar pagos en un entorno *sandbox*, se deben usar tarjetas específicas que permitan probar la implementación del desafío con flujos de éxito y fallo, según la tabla a continuación: + +| Tarjeta | Flujo | Número | Código de Seguridad | Fecha de Vencimiento | +|-------------|-------------------------|--------------------|---------------------|----------------------| +| Mastercard | Challenge exitoso | 5483 9281 6457 4623 | 123 | 11/25 | +| Mastercard | Challenge no autorizado | 5361 9568 0611 7557 | 123 | 11/25 | +| Mastercard | 3ds mandatory | 5031 7557 3453 0604 | 123 | 11/25 | + +Los pasos para crear el pago son los mismos. En caso de duda sobre cómo crear pagos con tarjeta, consulta la [documentación sobre Tarjetas](https://www.mercadopago.com.br/developers/es/docs/checkout-api/integration-configuration/card/integrate-via-cardform). + +[[[ +```php +setCustomHeaders(["X-Idempotency-Key: "]); + + $payment = $client->create([ + "transaction_amount" => (float) $_POST['transactionAmount'], + "token" => $_POST['token'], + "description" => $_POST['description'], + "installments" => $_POST['installments'], + "payment_method_id" => $_POST['paymentMethodId'], + "issuer_id" => $_POST['issuer'], + "payer" => [ + "email" => $_POST['email'], + "identification" => [ + "type" => $_POST['identificationType'], + "number" => $_POST['number'] + ] + ], + "three_d_secure_mode" => "optional" + ], $request_options); + echo implode($payment); +?> +``` +```node +import { MercadoPagoConfig, Payment } from 'mercadopago'; + +const client = new MercadoPagoConfig({ accessToken: 'YOUR_ACCESS_TOKEN' }); +const payment = new Payment(client); + +const body = { +transaction_amount: req.transaction_amount, + token: req.token, + description: req.description, + installments: req.installments, + payment_method_id: req.paymentMethodId, + issuer_id: req.issuer, + payer: { + email: req.email, + identification: { + type: req.identificationType, + number: req.number + } + }, + three_d_secure_mode: 'optional' +}; + +payment.create({ body: body, requestOptions: { idempotencyKey: '' } }).then(console.log).catch(console.log); +``` +```java +PaymentClient client = new PaymentClient(); + +PaymentCreateRequest paymentCreateRequest = + PaymentCreateRequest.builder() + .transactionAmount(request.getTransactionAmount()) + .token(request.getToken()) + .description(request.getDescription()) + .installments(request.getInstallments()) + .paymentMethodId(request.getPaymentMethodId()) + .payer( + PaymentPayerRequest.builder() + .email(request.getPayer().getEmail()) + .firstName(request.getPayer().getFirstName()) + .identification( + IdentificationRequest.builder() + .type(request.getPayer().getIdentification().getType()) + .number(request.getPayer().getIdentification().getNumber()) + .build()) + .build()) + .threeDSecureMode("optional") + .build(); + +client.create(paymentCreateRequest); +``` +```ruby +require 'mercadopago' +sdk = Mercadopago::SDK.new('YOUR_ACCESS_TOKEN') + +payment_data = { + transaction_amount: params[:transactionAmount].to_f, + token: params[:token], + description: params[:description], + installments: params[:installments].to_i, + payment_method_id: params[:paymentMethodId], + payer: { + email: params[:email], + identification: { + type: params[:identificationType], + number: params[:identificationNumber] + } + three_d_secure_mode: "optional", + } +} + +payment_response = sdk.payment.create(payment_data) +payment = payment_response[:response] + +puts payment +``` +```csharp +using System; +using MercadoPago.Client.Common; +using MercadoPago.Client.Payment; +using MercadoPago.Config; +using MercadoPago.Resource.Payment; + +MercadoPagoConfig.AccessToken = "YOUR_ACCESS_TOKEN"; + +var paymentRequest = new PaymentCreateRequest +{ + TransactionAmount = decimal.Parse(Request["transactionAmount"]), + Token = Request["token"], + Description = Request["description"], + Installments = int.Parse(Request["installments"]), + PaymentMethodId = Request["paymentMethodId"], + Payer = new PaymentPayerRequest + { + Email = Request["email"], + Identification = new IdentificationRequest + { + Type = Request["identificationType"], + Number = Request["identificationNumber"], + }, + }, +ThreeDSecureMode = "optional", +}; + +var client = new PaymentClient(); +Payment payment = await client.CreateAsync(paymentRequest); + +Console.WriteLine(payment.Status); +``` +```python +import mercadopago +sdk = mercadopago.SDK("ACCESS_TOKEN") + +payment_data = { + "transaction_amount": float(request.POST.get("transaction_amount")), + "token": request.POST.get("token"), + "description": request.POST.get("description"), + "installments": int(request.POST.get("installments")), + "payment_method_id": request.POST.get("payment_method_id"), + "payer": { + "email": request.POST.get("email"), + "identification": { + "type": request.POST.get("type"), + "number": request.POST.get("number") + } + } + "three_d_secure_mode": "optional" +} + +payment_response = sdk.payment().create(payment_data) +payment = payment_response["response"] + +print(payment) +``` +```go +package main + +import ( + "context" + "fmt" + + "github.com/mercadopago/sdk-go/pkg/config" + "github.com/mercadopago/sdk-go/pkg/payment" +) + +func processPayment(r *http.Request) { + accessToken := "{{ACCESS_TOKEN}}" + + cfg, err := config.New(accessToken) + if err != nil { + fmt.Println(err) + return + } + + client := payment.NewClient(cfg) + + request := payment.Request{ + TransactionAmount: r.FormValue("transactionAmount"), + Token: r.FormValue("token"), + Description: r.FormValue("description"), + PaymentMethodID: r.FormValue("paymentMethodId"), + Payer: &payment.PayerRequest{ + Email: r.FormValue("email"), + Identification: &payment.IdentificationRequest{ + Type: r.FormValue("type"), + Number: r.FormValue("number"), + }, + }, + } + + resource, err := client.Create(context.Background(), request) + if err != nil { + fmt.Println(err) + } + + fmt.Println(resource) +} +``` +```curl +curl -X POST \ + -H 'accept: application/json' \ + -H 'content-type: application/json' \ + -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ + 'https://api.mercadopago.com/v1/payments' \ + -d '{ + "transaction_amount": 100, + "token": "CARD_TOKEN", + "description": "Blue shirt", + "installments": 1, + "payment_method_id": "master", + "issuer_id": 310, + "payer": { + "email": "PAYER_EMAIL" + }, + "three_d_secure_mode": "optional" + }' +``` +]]] + +### Challenge + +En ambos flujos (éxito y falla), el _Challenge_, que es una pantalla similar a la presentada a continuación, se mostrará dentro del *iframe*: + +![Challenge](/images/api/sandbox-v1-es.png) + +El código de verificación proporcionado es meramente ilustrativo. Para completar el flujo de prueba, simplemente haz clic en el botón **Confirmar**. +Una vez que hayas completado esta acción, sigue las instrucciones detalladas en la sección [Consultar status de la transacción](/developers/es/docs/checkout-api/how-tos/integrate-3ds#bookmark_consultar_status_de_la_transacción) para determinar cuándo se ha finalizado el _Challenge_ y cómo verificar la actualización del pago. \ No newline at end of file diff --git a/guides/checkout-api-v2/how-to-integrate-3ds-bigmerchants.pt.md b/guides/checkout-api-v2/how-to-integrate-3ds-bigmerchants.pt.md new file mode 100644 index 0000000000..55a3c9008a --- /dev/null +++ b/guides/checkout-api-v2/how-to-integrate-3ds-bigmerchants.pt.md @@ -0,0 +1,661 @@ +# Como integrar 3DS com ----[mlb]---- Checkout Transparente------------ ----[mla, mlm, mlu, mco, mlc, mpe]---- Checkout API ------------ + +Nesta documentação você encontrará toda a informação necessária para realizar a integração com 3DS com ----[mlb]---- Checkout Transparente. ------------ ----[mla, mlm, mlu, mco, mlc, mpe]---- Checkout API. ------------ Para mais informações sobre como esse tipo de autenticação funciona, veja [3DS 2.0](/developers/pt/docs/checkout-api/how-tos/improve-payment-approval/3ds). + +> WARNING +> +> Importante +> +> Para realizar a integração com 3DS, é preciso atender a determinados requisitos. Antes de avançar para os próximos passos, revise a seção [Pré-requisitos](/developers/pt/docs/checkout-api/prerequisites) e certifique-se de que todos sejam cumpridos. + +## Integrar com 3DS + +A autenticação 3DS pode ser feita através de dois fluxos diferentes: **com e sem _Challenge_**, sendo estas etapas adicionais que o comprador deve cumprir para garantir sua identidade. A decisão de incluir ou não o _Challenge_ depende do emissor do cartão e do perfil de risco da transação que está sendo realizada. + +> Conheça também as integrações via [Checkout Bricks,](/developers/pt/docs/checkout-bricks/how-tos/integrate-3ds) uma forma de pagamento modular, segura e personalizável, que automatiza vários dos processos descritos a seguir. + +Para **transações de baixo risco**, as informações enviadas na finalização da compra são suficientes e as etapas adicionais do _Challenge_ **não são necessárias**. Porém, **para casos de alto risco de fraude**, o _Challenge_ é necessário para **verificar a identidade do comprador**, o que aumenta a aprovação das transações com cartão. + +Abaixo estão as etapas para realizar uma integração com 3DS. + +1. Utilize o Mercado Pago [SDK JS](/developers/pt/docs/sdks-library/client-side/mp-js-v2) no checkout para gerar o [token do cartão de crédito](/developers/pt/docs/checkout-api/integration-configuration/card/integrate-via-cardform). +2. Em seguida, envie os **dados do checkout** junto com o **token do cartão** para o backend. +3. Feito isso, faça uma chamada para criar um novo pagamento com os dados recebidos. O atributo `three_d_secure_mode` precisa ser enviado com um dos seguintes valores: + 1. `not_supported`: 3DS não deve ser usado (é o valor padrão). + 2. `optional`: 3DS pode ou não ser exigido, dependendo do perfil de risco da operação. + 3. `mandatory`: 3DS será requerido obrigatoriamente. + +> WARNING +> +> Importante +> +> Recomendamos utilizar o valor `optional` na implementação do 3DS, por equilibrar segurança e a aprovação de transações. O `mandatory` deve ser utilizado apenas para integrações que exijam que todas as transações aprovadas passem por 3DS. +>

+> Além disso, a captura do pagamento deve ser automática (`capture=true`) e a transação deve ser criada com o modo binário desativado (`binary mode= false`), visto que a transação poderá ficar pendente aguardando que o comprador complete o _Challenge_. + +[[[ +```php +setCustomHeaders(["X-Idempotency-Key: "]); + + $payment = $client->create([ + "transaction_amount" => , + "token" => "CARD_TOKEN", + "description" => "", + "installments" => , + "payment_method_id" => "", + "issuer_id" => "", + "payer" => [ + "email" => $_POST['email'] + ], + "three_d_secure_mode" => "optional" + ], $request_options); + echo implode($payment); +?> +``` +```java +MercadoPagoConfig.setAccessToken(""); + PaymentClient client = new PaymentClient(); + PaymentCreateRequest createRequest = + PaymentCreateRequest.builder() + .transactionAmount(new BigDecimal()) + .token("") + .description("") + .installments() + .paymentMethodId("") + .payer( + PaymentPayerRequest.builder() + .email("") + .build() + ) + .threeDSecureMode("optional") + .build(); + client.create(createRequest); +``` +```csharp +using MercadoPago.Config; +using MercadoPago.Client.Payment; +using MercadoPago.Resource.Payment; +MercadoPagoConfig.AccessToken = ""; +var request = new PaymentCreateRequest +{ + TransactionAmount = , + Token = "", + Description = "", + Installments = , + Payer = new PaymentPayerRequest + { + Email = "", + }, + ThreeDSecureMode = "optional", +}; +var client = new PaymentClient(); +Payment payment = await client.CreateAsync(request); +``` +```node +import { MercadoPagoConfig, Payment } from 'mercadopago'; + +const client = new MercadoPagoConfig({ accessToken: '' }); +const payment = new Payment(client); + +const body = { + transaction_amount: , + token: '', + description: '', + installments: , + payment_method_id: '', + issuer_id: '', + payer: { + email: '', + }, + three_d_secure_mode: 'optional' +} +payment.create({ body: body, requestOptions: { idempotencyKey: '' } }).then(console.log).catch(console.log); +``` +```ruby + +require 'mercadopago' +sdk = Mercadopago::SDK.new('') +payment_request = { + token: '', + installments: , + transaction_amount: , + description: '', + payer: { + email: '', + }, + three_d_secure_mode: 'optional' +} +payment_response = sdk.payment.create(payment_request) +payment = payment_response[:response] +``` +```python +import mercadopago +sdk = mercadopago.SDK("") +payment_data = { + "transaction_amount": , + "token": "", + "description": "", + "installments": , + "payer": { + "email": "", + }, + "three_d_secure_mode": "optional" +} +payment_response = sdk.payment().create(payment_data) +payment = payment_response["response"] +``` +```go +package main + +import ( + "context" + "fmt" + + "github.com/mercadopago/sdk-go/pkg/config" + "github.com/mercadopago/sdk-go/pkg/payment" +) + +func main() { + accessToken := "" + + cfg, err := config.New(accessToken) + if err != nil { + fmt.Println(err) + return + } + + client := payment.NewClient(cfg) + + request := payment.Request{ + TransactionAmount:, + Payer: &payment.PayerRequest{ + Email: "", + }, + Token: "", + Installments: , + Description: "", + ThreeDSecureMode: "optional", + } + + resource, err := client.Create(context.Background(), request) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println(resource) +} +``` +```curl + +curl --location --request POST 'https://api.mercadopago.com/v1/payments' \ +--header 'Authorization: ' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "payer": { + "email": "" + }, + "additional_info": { + "items": [ + { + "quantity": , + "category_id": , + "title": , + "unit_price": + } + ] + }, + "payment_method_id": , + "marketplace": "NONE", + "installments": , + "transaction_amount": , + "description": "", + "token": "CARD_TOKEN", + "three_d_secure_mode": "optional", + "capture": true, + "binary_mode": false +}' +``` +]]] + +Caso não seja necessário utilizar o fluxo do _Challenge_, o campo de _status_ do pagamento terá valor `approved` e não será necessário exibi-lo, dessa forma, siga normalmente com o fluxo de sua aplicação. + +Para os casos em que o _Challenge_ é necessário, o _status_ mostrará o valor `pending`, e o `status_detail` será `pending_challenge`. + +> WARNING +> +> Importante +> +> Neste último caso, a resposta mostrará um atributo de pagamento chamado `three_ds_info` com os campos `external_resource_url`, que contém a URL do _Challenge_, e `creq`, um identificador da solicitação do _Challenge_. Para exibi-lo e tratar seu resultado siga os passos abaixo. + +### Visão geral da resposta (informação omitida) + +Quando o _Challenge_ é iniciado, o usuário tem cerca de 5 minutos para completá-lo. Se não for concluído, o banco recusará a transação e o Mercado Pago considerará o pagamento cancelado. Enquanto o usuário não completar o _Challenge_, o pagamento ficará como `pending_challenge`. + +[[[ +```Json + +{ + "id": 52044997115, + ... + "status": "pending", + "status_detail": "pending_challenge", + ... + "three_ds_info": + { + "external_resource_url": "https://acs-public.tp.mastercard.com/api/v1/browser_Challenges", + "creq": "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImJmYTVhZjI0LTliMzAtNGY1Yi05MzQwLWJkZTc1ZjExMGM1MCIsImFjc1RyYW5zSUQiOiI3MDAwYTI2YS1jYWQ1LTQ2NjQtOTM0OC01YmRlZjUwM2JlOWYiLCJjaGFsbGVuZ2VXaW5kb3dTaXplIjoiMDQiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIn0" + }, + "owner": null +} + +``` +]]] + +4. Para uma melhor visualização do _Challenge_ do 3DS de forma responsiva, você deve adicionar o CSS abaixo. + +```css + #myframe{ + width: 500px; + height: 600px; + border: none; + } + @media only screen and (width <= 980px) { + #myframe{ + width: 100%; + height: 440px; + } + } +``` + +5. Para **exibir o _Challenge_**, é necessário gerar um _iframe_ que contenha um formulário com `method post`, `action` contendo a URL obtida no campo `external_resource_url`, e um input oculto com o valor obtido em `creq`. Em seguida, faça o post do formulário abaixo para iniciar o _Challenge_. + +[[[ +```javascript + +function doChallenge(payment) { + try { + const { + status, + status_detail, + three_ds_info: { creq, external_resource_url }, + } = payment; + if (status === "pending" && status_detail === "pending_challenge") { + var iframe = document.createElement("iframe"); + iframe.name = "myframe"; + iframe.id = "myframe"; + document.body.appendChild(iframe); + + var idocument = iframe.contentWindow.document; + + var myform = idocument.createElement("form"); + myform.name = "myform"; + myform.setAttribute("target", "myframe"); + myform.setAttribute("method", "post"); + myform.setAttribute("action", external_resource_url); + + var hiddenField = idocument.createElement("input"); + hiddenField.setAttribute("type", "hidden"); + hiddenField.setAttribute("name", "creq"); + hiddenField.setAttribute("value", creq); + myform.appendChild(hiddenField); + iframe.appendChild(myform); + + myform.submit(); + } + } catch (error) { + console.log(error); + alert("Error doing Challenge, try again later."); + } +} + +``` +]]] + +Quando o _Challenge_ for concluído, o _status_ do pagamento será atualizado para `approved` se a autenticação for bem-sucedida, e `rejected` se não for. Em situações nas quais a autenticação não é realizada, o pagamento permanece `pending`. Esta atualização não é imediata e pode levar alguns instantes. + +Consulte a seção abaixo para obter mais detalhes sobre como verificar o _status_ de cada transação. + +## Verificar status da transação + +Para saber qual é o resultado de cada transação, existem três opções: + +* **Notificações**: Uma notificação da alteração do _status_ do pagamento será recebida por meio de Webhooks e o comprador deverá ser redirecionado para uma tela indicando que a transação foi bem-sucedida. Consulte a seção [Webhooks](/developers/es/docs/checkout-api/additional-content/your-integrations/notifications/webhooks) e saiba como realizar sua configuração.. +* **API de pagamentos**: Será necessário fazer um _pooling_ em [Payments](/developers/pt/reference/payments/_payments/post) e, se o _status_ mudar, redirecionar o comprador para uma tela de confirmação. +* **Tratar o evento iframe (recomendado)**: Tenha em mente que o evento apenas indica que o _Challenge_ terminou e não que o pagamento chegou a um _status_ final, pois a atualização não é imediata e pode demorar alguns instantes. Faça uma consulta em [Payments](/developers/pt/reference/payments/_payments/post) e, caso o _status_ mude, redirecione o comprador para uma tela indicando que a transação foi realizada com sucesso. + +Para **tratar o evento iframe**, siga as etapas abaixo. + +### Realizar implantação + +Utilize o código Javascript a seguir para implementar e escutar o evento que indica que o _Challenge_ foi encerrado, assim é possível redirecionar o cliente para a tela de confirmação. + +[[[ +```javascript + +window.addEventListener("message", (e) => { + if (e.data.status === "COMPLETE") { + window.open("congrats.html"); + } +}); + +``` +]]] + +### Buscar status de pagamento + +O Javascript a seguir indica como buscar o _status_ do pagamento atualizado e exibi-lo na tela de confirmação. + +[[[ +```javascript + +document.addEventListener("DOMContentLoaded", async function (e) { + init(); +}); + +async function init() { + const id = localStorage.getItem("paymentId"); + + try { + const response = await fetch("/get_payment/" + id, { + method: "GET", + }); + const result = await response.json(); + if (result.status != 200) throw new Error("error getting payment"); + document.getElementById("congrats-div").innerHTML = + "Pagamento " + result.data.id + " -> Status: " + result.data.status; + } catch (error) { + alert("Unexpected error\n" + JSON.stringify(error)); + } +} + +``` +]]] + +> WARNING +> +> Importante +> +> Caso o pagamento ainda esteja `pending` após o timeout do _Challenge_, será necessário redirecionar o comprador para uma tela informando que o pagamento expirou e que é necessário criar um novo (a atualização não é imediata, pode demorar alguns momentos). + +Após seguir estes passos, sua integração está pronta para autenticar transações com 3DS. + +## Possíveis status de pagamento + +Uma transação com 3DS pode retornar diferentes _status_ dependendo do tipo de autenticação realizada (com ou sem _Challenge_). + +Em um pagamento **sem _Challenge_**, o _status_ da transação será diretamente `approved` ou `rejected`. Enquanto que em um pagamento **com _Challenge_**, a transação ficará com _status_ `pending` e o processo de autenticação junto ao banco será iniciado. Somente após esta etapa o _status_ final será exibido. + +Veja abaixo a tabela com os possíveis _status_ e suas respectivas descrições. + +| Status | Status_detail | Descrição | +|------------|-------------------------------|-------------------------------------------------------------------| +| "approved" | "accredited" | Transação aprovada sem autenticação. | +| "rejected" | - | Transação rejeitada sem autenticação. Para conferir os motivos, consulte a [lista padrão de status detail](https://mercadopago.com.br/developers/pt/docs/checkout-api/response-handling/collection-results). | +| "pending" | "pending_challenge" | Transação pendente de autenticação ou _timeout_ do _Challenge_. | +| "rejected" | "cc_rejected_3ds_challenge" | Transação rejeitada devido a falha no _Challenge_. | +| "rejected" | "cc_rejected_3ds_mandatory" | Transação rejeitada por não cumprir a validação de 3DS quando esta é obrigatória. | +| "cancelled" | "expired" | Transação com _Challenge_ cancelada após 24h no _status_ `pending`. | + +## Teste de integração + +Para que seja possível validar pagamentos com 3DS, disponibilizamos um ambiente de testes do tipo *sandbox* que retorna resultados falsos apenas para simulação e validação da implementação. + +> WARNING +> +> Importante +> +> Para testar a integração é necessário utilizar suas **credenciais de teste**. Certifique-se também de incluir o atributo `three_d_secure_mode`, definindo-o como `optional` ou `mandatory`, para garantir a correta implementação do pagamento 3DS. + +Para realizar testes de pagamento em um ambiente *sandbox*, é necessário utilizar cartões específicos que permitem testar a implementação do _Challenge_ com os fluxos de sucesso e falha. A tabela a seguir apresenta os detalhes desses cartões: + +| Cartão | Fluxo | Número | Código de segurança | Data de vencimento | +|-----------|--------------------------|--------------------|---------------------|--------------------| +| Mastercard | Challenge com sucesso | 5483 9281 6457 4623 | 123 | 11/25 | +| Mastercard | Challenge não autorizado | 5361 9568 0611 7557 | 123 | 11/25 | +| Mastercard | 3ds mandatory | 5031 7557 3453 0604 | 123 | 11/25 | + +Os passos para criar o pagamento são os mesmos. Em caso de dúvida sobre como criar pagamentos com cartão, consulte a [documentação sobre Cartões](https://www.mercadopago.com.br/developers/pt/docs/checkout-api/integration-configuration/card/integrate-via-cardform). + + +[[[ +```php +setCustomHeaders(["X-Idempotency-Key: "]); + + $payment = $client->create([ + "transaction_amount" => (float) $_POST['transactionAmount'], + "token" => $_POST['token'], + "description" => $_POST['description'], + "installments" => $_POST['installments'], + "payment_method_id" => $_POST['paymentMethodId'], + "issuer_id" => $_POST['issuer'], + "payer" => [ + "email" => $_POST['email'], + "identification" => [ + "type" => $_POST['identificationType'], + "number" => $_POST['number'] + ] + ], + "three_d_secure_mode" => "optional" + ], $request_options); + echo implode($payment); +?> +``` +```node +import { MercadoPagoConfig, Payment } from 'mercadopago'; + +const client = new MercadoPagoConfig({ accessToken: 'YOUR_ACCESS_TOKEN' }); +const payment = new Payment(client); + +const body = { +transaction_amount: req.transaction_amount, + token: req.token, + description: req.description, + installments: req.installments, + payment_method_id: req.paymentMethodId, + issuer_id: req.issuer, + payer: { + email: req.email, + identification: { + type: req.identificationType, + number: req.number + } + }, + three_d_secure_mode: 'optional' +}; + +payment.create({ body: body, requestOptions: { idempotencyKey: '' } }).then(console.log).catch(console.log); +``` +```java +PaymentClient client = new PaymentClient(); + +PaymentCreateRequest paymentCreateRequest = + PaymentCreateRequest.builder() + .transactionAmount(request.getTransactionAmount()) + .token(request.getToken()) + .description(request.getDescription()) + .installments(request.getInstallments()) + .paymentMethodId(request.getPaymentMethodId()) + .payer( + PaymentPayerRequest.builder() + .email(request.getPayer().getEmail()) + .firstName(request.getPayer().getFirstName()) + .identification( + IdentificationRequest.builder() + .type(request.getPayer().getIdentification().getType()) + .number(request.getPayer().getIdentification().getNumber()) + .build()) + .build()) + .threeDSecureMode("optional") + .build(); + +client.create(paymentCreateRequest); +``` +```ruby +require 'mercadopago' +sdk = Mercadopago::SDK.new('YOUR_ACCESS_TOKEN') + +payment_data = { + transaction_amount: params[:transactionAmount].to_f, + token: params[:token], + description: params[:description], + installments: params[:installments].to_i, + payment_method_id: params[:paymentMethodId], + payer: { + email: params[:email], + identification: { + type: params[:identificationType], + number: params[:identificationNumber] + } + three_d_secure_mode: "optional", + } +} + +payment_response = sdk.payment.create(payment_data) +payment = payment_response[:response] + +puts payment +``` +```csharp +using System; +using MercadoPago.Client.Common; +using MercadoPago.Client.Payment; +using MercadoPago.Config; +using MercadoPago.Resource.Payment; + +MercadoPagoConfig.AccessToken = "YOUR_ACCESS_TOKEN"; + +var paymentRequest = new PaymentCreateRequest +{ + TransactionAmount = decimal.Parse(Request["transactionAmount"]), + Token = Request["token"], + Description = Request["description"], + Installments = int.Parse(Request["installments"]), + PaymentMethodId = Request["paymentMethodId"], + Payer = new PaymentPayerRequest + { + Email = Request["email"], + Identification = new IdentificationRequest + { + Type = Request["identificationType"], + Number = Request["identificationNumber"], + }, + }, +ThreeDSecureMode = "optional", +}; + +var client = new PaymentClient(); +Payment payment = await client.CreateAsync(paymentRequest); + +Console.WriteLine(payment.Status); +``` +```python +import mercadopago +sdk = mercadopago.SDK("ACCESS_TOKEN") + +payment_data = { + "transaction_amount": float(request.POST.get("transaction_amount")), + "token": request.POST.get("token"), + "description": request.POST.get("description"), + "installments": int(request.POST.get("installments")), + "payment_method_id": request.POST.get("payment_method_id"), + "payer": { + "email": request.POST.get("email"), + "identification": { + "type": request.POST.get("type"), + "number": request.POST.get("number") + } + } + "three_d_secure_mode": "optional" +} + +payment_response = sdk.payment().create(payment_data) +payment = payment_response["response"] + +print(payment) +``` +```go +package main + +import ( + "context" + "fmt" + + "github.com/mercadopago/sdk-go/pkg/config" + "github.com/mercadopago/sdk-go/pkg/payment" +) + +func processPayment(r *http.Request) { + accessToken := "{{ACCESS_TOKEN}}" + + cfg, err := config.New(accessToken) + if err != nil { + fmt.Println(err) + return + } + + client := payment.NewClient(cfg) + + request := payment.Request{ + TransactionAmount: r.FormValue("transactionAmount"), + Token: r.FormValue("token"), + Description: r.FormValue("description"), + PaymentMethodID: r.FormValue("paymentMethodId"), + Payer: &payment.PayerRequest{ + Email: r.FormValue("email"), + Identification: &payment.IdentificationRequest{ + Type: r.FormValue("type"), + Number: r.FormValue("number"), + }, + }, + } + + resource, err := client.Create(context.Background(), request) + if err != nil { + fmt.Println(err) + } + + fmt.Println(resource) +} +``` +```curl +curl -X POST \ + -H 'accept: application/json' \ + -H 'content-type: application/json' \ + -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ + 'https://api.mercadopago.com/v1/payments' \ + -d '{ + "transaction_amount": 100, + "token": "CARD_TOKEN", + "description": "Blue shirt", + "installments": 1, + "payment_method_id": "master", + "issuer_id": 310, + "payer": { + "email": "PAYER_EMAIL" + }, + "three_d_secure_mode": "optional" + }' +``` +]]] + +### Challenge + +Em ambos os fluxos (sucesso e falha), o _Challenge_, que é uma tela semelhante à mostrada abaixo, deve ser exibido dentro do *iframe*: + +![Challenge](/images/api/sandbox-v1-pt.png) + +O código de verificação fornecido é apenas ilustrativo. Para concluir o fluxo de teste, basta clicar no botão **Confirmar**. Após concluir essa ação, siga as instruções detalhadas na seção [Verificar status da transação](/developers/pt/docs/checkout-api/how-tos/integrate-3ds#bookmark_verificar_status_da_transação) para identificar quando o _Challenge_ foi concluído e como verificar a atualização do pagamento. \ No newline at end of file diff --git a/guides/checkout-api-v2/how-to-integrate-3ds.en.md b/guides/checkout-api-v2/how-to-integrate-3ds.en.md index a4894c3fa8..63001a1427 100644 --- a/guides/checkout-api-v2/how-to-integrate-3ds.en.md +++ b/guides/checkout-api-v2/how-to-integrate-3ds.en.md @@ -23,13 +23,12 @@ Below are the steps to integrate with 3DS. 3. After that, make a request to create a new payment with the received data. The `three_d_secure_mode` attribute needs to be sent with one of the following values: 1. `not_supported`: 3DS must not be used (this is the default value). 2. `optional`: 3DS may or may not be required, depending on the risk profile of the transaction. - 3. `mandatory`: 3DS will be required mandatorily. > WARNING > > Important > -> We recommend using the `optional` value in the implementation of 3DS, as it balances security and transaction approval. The `mandatory`should be used only for integrations that require all approved transactions to go through 3DS. +> We recommend using the `optional` value in the implementation of 3DS, as it balances security and transaction approval. >

> The payment capture must be automatic (`capture=true`), and the transaction should be created with binary mode deactivated (`binary mode=false`), as it might remain pending while waiting for the buyer to complete the Challenge. @@ -400,7 +399,6 @@ See below the table with the possible statuses and their respective descriptions | "rejected" | - | Transaction rejected without authentication. To check the reasons, please refer to the standard [list of status details](https://mercadopago.com.br/developers/en/docs/checkout-api/response-handling/collection-results). | | "pending" | "pending_challenge" | Transaction pending authentication or Challenge timeout. | | "rejected" | "cc_rejected_3ds_challenge" | Transaction rejected due to Challenge failure. | -| "rejected" | "cc_rejected_3ds_mandatory" | Transaction rejected for not complying with 3DS validation when it is mandatory. | | "cancelled" | "expired" | Transaction with Challenge canceled after 24 hours in pending status. | ## Integration test @@ -411,7 +409,7 @@ To facilitate the validation of 3DS payments, we have created a sandbox testing > > Important > -> To test the integration, it is necessary to use your test credentials. Also, make sure to include the `three_d_secure_mode` attribute, setting it as `optional` or `mandatory`, to ensure the correct implementation of the 3DS payment. +> To test the integration, it is necessary to use your test credentials. Also, make sure to include the `three_d_secure_mode` attribute, setting it as `optional` to ensure the correct implementation of the 3DS payment. To test payments in a sandbox environment, specific cards should be used to test the implementation of the Challenge with both success and failure flows, as shown in the table below: @@ -419,7 +417,6 @@ To test payments in a sandbox environment, specific cards should be used to test |-------------|-------------------------|---------------------|----------------|-----------------| | Mastercard | Successful Challenge | 5483 9281 6457 4623 | 123 | 11/25 | | Mastercard | Unauthorized Challenge | 5361 9568 0611 7557 | 123 | 11/25 | -| Matercard | 3ds mandatory | 5031 7557 3453 0604 | 123 | 11/25 | The steps to create the payment remain the same. If you have any doubts about how to create card payments, please refer to the [documentation on Cards](https://www.mercadopago.com.br/developers/en/docs/checkout-api/integration-configuration/card/integrate-via-cardform). diff --git a/guides/checkout-api-v2/how-to-integrate-3ds.es.md b/guides/checkout-api-v2/how-to-integrate-3ds.es.md index 7391d6a936..c9dcd8b3e0 100644 --- a/guides/checkout-api-v2/how-to-integrate-3ds.es.md +++ b/guides/checkout-api-v2/how-to-integrate-3ds.es.md @@ -23,13 +23,12 @@ A continuación se presentan los pasos para realizar una integración con 3DS. 3. Allí, haz una llamada para crear un nuevo pago con los datos recibidos. Es necesario que sea enviado el atributo `three_d_secure_mode` con uno de los siguientes valores: 1. `not_supported`: no se debe usar 3DS (es el valor por default). 2. `optional`: se puede requerir 3DS o no, dependiendo del perfil de riesgo de la transacción. - 3. `mandatory`: 3DS será requerido obligatoriamente. > WARNING > > Importante > -> Recomendamos usar el valor `optional` en la implementación del 3DS, ya que equilibra la seguridad y la aprobación de transacciones. El uso de `mandatory` debe limitarse a integraciones que requieran que todas las transacciones aprobadas pasen por 3DS. +> Recomendamos usar el valor `optional` en la implementación del 3DS, ya que equilibra la seguridad y la aprobación de transacciones. >

> Además, la captura del pago debe ser automática (`capture=true`) y la transacción debe crearse con el modo binario desactivado (`binary mode=false`), ya que podría quedar pendiente esperando que el comprador complete el _Challenge_. @@ -400,7 +399,6 @@ A continuación se muestra una tabla con los posibles _status_ y sus descripcion | "rejected" | - | Transacción denegada sin autenticación. Para verificar los motivos, consulta la [lista estándar de status detail](https://mercadopago.com.br/developers/es/docs/checkout-api/response-handling/collection-results). | | "pending" | "pending_challenge" | Transacción pendiente de autenticación o _timeout_ del _Challenge_. | | "rejected" | "cc_rejected_3ds_challenge" | Transacción denegada debido a falla en el _Challenge_. | -| "rejected"| "cc_rejected_3ds_mandatory" | Transacción rechazada por no cumplir validación de 3DS cuando esta es mandatory. | | "cancelled" | "expired" | Transacción con _Challenge_ cancelada después de 24 horas en estado pendiente. | ## Prueba de integración @@ -411,7 +409,7 @@ Para facilitar la validación de pagos con 3DS, hemos creado un entorno de prueb > > Importante > -> Para probar la integración, es necesario utilizar sus **credenciales de prueba**. Asegúrese también de incluir el atributo `three_d_secure_mode`, definiéndolo como `optional` o `mandatory`, para garantizar la correcta implementación del pago 3DS. +> Para probar la integración, es necesario utilizar sus **credenciales de prueba**. Asegúrese también de incluir el atributo `three_d_secure_mode`, definiéndolo como `optional` para garantizar la correcta implementación del pago 3DS. Para probar pagos en un entorno *sandbox*, se deben usar tarjetas específicas que permitan probar la implementación del desafío con flujos de éxito y fallo, según la tabla a continuación: @@ -419,7 +417,6 @@ Para probar pagos en un entorno *sandbox*, se deben usar tarjetas específicas q |-------------|-------------------------|--------------------|---------------------|----------------------| | Mastercard | Challenge exitoso | 5483 9281 6457 4623 | 123 | 11/25 | | Mastercard | Challenge no autorizado | 5361 9568 0611 7557 | 123 | 11/25 | -| Mastercard | 3ds mandatory | 5031 7557 3453 0604 | 123 | 11/25 | Los pasos para crear el pago son los mismos. En caso de duda sobre cómo crear pagos con tarjeta, consulta la [documentación sobre Tarjetas](https://www.mercadopago.com.br/developers/es/docs/checkout-api/integration-configuration/card/integrate-via-cardform). diff --git a/guides/checkout-api-v2/how-to-integrate-3ds.pt.md b/guides/checkout-api-v2/how-to-integrate-3ds.pt.md index 55a3c9008a..5f0f38fa26 100644 --- a/guides/checkout-api-v2/how-to-integrate-3ds.pt.md +++ b/guides/checkout-api-v2/how-to-integrate-3ds.pt.md @@ -23,13 +23,12 @@ Abaixo estão as etapas para realizar uma integração com 3DS. 3. Feito isso, faça uma chamada para criar um novo pagamento com os dados recebidos. O atributo `three_d_secure_mode` precisa ser enviado com um dos seguintes valores: 1. `not_supported`: 3DS não deve ser usado (é o valor padrão). 2. `optional`: 3DS pode ou não ser exigido, dependendo do perfil de risco da operação. - 3. `mandatory`: 3DS será requerido obrigatoriamente. > WARNING > > Importante > -> Recomendamos utilizar o valor `optional` na implementação do 3DS, por equilibrar segurança e a aprovação de transações. O `mandatory` deve ser utilizado apenas para integrações que exijam que todas as transações aprovadas passem por 3DS. +> Recomendamos utilizar o valor `optional` na implementação do 3DS, por equilibrar segurança e a aprovação de transações. >

> Além disso, a captura do pagamento deve ser automática (`capture=true`) e a transação deve ser criada com o modo binário desativado (`binary mode= false`), visto que a transação poderá ficar pendente aguardando que o comprador complete o _Challenge_. @@ -400,7 +399,6 @@ Veja abaixo a tabela com os possíveis _status_ e suas respectivas descrições. | "rejected" | - | Transação rejeitada sem autenticação. Para conferir os motivos, consulte a [lista padrão de status detail](https://mercadopago.com.br/developers/pt/docs/checkout-api/response-handling/collection-results). | | "pending" | "pending_challenge" | Transação pendente de autenticação ou _timeout_ do _Challenge_. | | "rejected" | "cc_rejected_3ds_challenge" | Transação rejeitada devido a falha no _Challenge_. | -| "rejected" | "cc_rejected_3ds_mandatory" | Transação rejeitada por não cumprir a validação de 3DS quando esta é obrigatória. | | "cancelled" | "expired" | Transação com _Challenge_ cancelada após 24h no _status_ `pending`. | ## Teste de integração @@ -411,7 +409,7 @@ Para que seja possível validar pagamentos com 3DS, disponibilizamos um ambiente > > Importante > -> Para testar a integração é necessário utilizar suas **credenciais de teste**. Certifique-se também de incluir o atributo `three_d_secure_mode`, definindo-o como `optional` ou `mandatory`, para garantir a correta implementação do pagamento 3DS. +> Para testar a integração é necessário utilizar suas **credenciais de teste**. Certifique-se também de incluir o atributo `three_d_secure_mode`, definindo-o como `optional` para garantir a correta implementação do pagamento 3DS. Para realizar testes de pagamento em um ambiente *sandbox*, é necessário utilizar cartões específicos que permitem testar a implementação do _Challenge_ com os fluxos de sucesso e falha. A tabela a seguir apresenta os detalhes desses cartões: @@ -419,7 +417,6 @@ Para realizar testes de pagamento em um ambiente *sandbox*, é necessário utili |-----------|--------------------------|--------------------|---------------------|--------------------| | Mastercard | Challenge com sucesso | 5483 9281 6457 4623 | 123 | 11/25 | | Mastercard | Challenge não autorizado | 5361 9568 0611 7557 | 123 | 11/25 | -| Mastercard | 3ds mandatory | 5031 7557 3453 0604 | 123 | 11/25 | Os passos para criar o pagamento são os mesmos. Em caso de dúvida sobre como criar pagamentos com cartão, consulte a [documentação sobre Cartões](https://www.mercadopago.com.br/developers/pt/docs/checkout-api/integration-configuration/card/integrate-via-cardform). diff --git a/guides/checkout-pro/redirection.en.md b/guides/checkout-pro/redirection.en.md index d80a14fb16..53fa8219db 100644 --- a/guides/checkout-pro/redirection.en.md +++ b/guides/checkout-pro/redirection.en.md @@ -1,18 +1,20 @@ # Back URLs -At the end of the payment process, it is possible to redirect the buyer back to your website via the `back_urls` attribute. This attribute allows you to define the URLs where the buyer should be redirected according to the payment status. +At the end of the **payment process with credit card**, it is possible to redirect the buyer back to your website via the `back_urls` attribute. This attribute allows you to define the URLs to which the buyer will be redirected, either automatically (`auto_return`) or through the "Return to site" button, depending on the payment status. > NOTE > > Automatic redirection > -> If you want the redirection for approved payments to be automatic, you must also add the `auto_return` attribute with the value `approved`. By default, a "Return to site" button will also be displayed. **The redirect time will be 5 seconds**. +> If you want the redirection for approved payments to be automatic, you must also add the `auto_return` attribute with the value `approved`. By default, a "Return to site" button will also be displayed. **The redirection time will be up to 40 seconds.** +>

+> **Payments with other payment methods do not have automatic redirection for approved payments**, but the `back_urls` attribute can be configured and used through the "Return to site" button. In the following tables you will find the details of each of the possible request and response parameters. | Attribute | Description | | ------------ | -------- | -| `auto_return` | Buyers are automatically redirected to site when payment is approved. The default value is `approved`. The redirect time is 40 seconds and this cannot be customized. | +| `auto_return` | Buyers are automatically redirected to site when payment is **approved**. The default value is `approved`. **The redirection time will be up to 40 seconds and cannot be customized.** | | `back_urls` | Return URL to the site. Possible scenarios are:

`success`: Return URL when payment is approved.

`pending`: Return URL when payment is pending.

`failure`: Return URL when payment is rejected. > WARNING diff --git a/guides/checkout-pro/redirection.es.md b/guides/checkout-pro/redirection.es.md index 9bbe119f52..fc812c3fff 100644 --- a/guides/checkout-pro/redirection.es.md +++ b/guides/checkout-pro/redirection.es.md @@ -1,18 +1,20 @@ # URLs de retorno -Al final del proceso de pago, es posible redirigir al comprador a otro entorno del sitio a través del atributo `back_urls`. Este atributo te permite definir las URL a las que se debe redirigir el comprador al completar el pago. +Al final del **proceso de pago con tarjeta de crédito**, es posible redirigir al comprador a otro entorno del sitio a través del atributo `back_urls`. Este atributo permite definir las URLs a las que el comprador será redirigido, ya sea automáticamente (`auto_return`) o a través del botón "Volver al sitio", según el estado del pago. > NOTE > > Redirección automática > -> Si deseas que la redirección para los pagos aprobados sea automática, debes agregar también el atributo `auto_return` con el valor `approved`. Por defecto, también se mostrará un botón de "Volver al sitio". **El tiempo de redireccionamiento será de 5 segundos**. +> Si deseas que la redirección para los pagos aprobados con tarjeta de crédito sea automática, debes agregar también el atributo `auto_return` con el valor `approved`. Por defecto, también se mostrará un botón de "Volver al sitio". **El tiempo de redireccionamiento será de hasta 40 segundos.** +>

+> **Los pagos con otros métodos de pago no tienen redirección automática para pagos aprobados**, pero el atributo `back_urls` se podrá configurar y utilizar a través del botón de "Volver al sitio". -En las siguientes tablas encontrarás el detalle de cada uno de los posibles parámetros de request y respuesta. +E la siguiente tabla encontrarás el detalle de cada uno de los posibles parámetros de request y respuesta. | Atributo | Descripción | | ------------ | -------- | -| `auto_return` | Los compradores son redirigidos automáticamente al _site_ cuando se aprueba el pago. El valor predeterminado es `approved`. El tiempo de redireccionamiento es de 40 segundos y esto no puede ser personalizado. | +| `auto_return` | Los compradores son redirigidos automáticamente al _site_ cuando se **aprueba** el pago. El valor predeterminado es `approved`. **El tiempo de redireccionamiento será de hasta 40 segundos y no podrá ser personalizado.** | | `back_urls` | URL de retorno al sitio. Los escenarios posibles son:

`success`: URL de retorno cuando se aprueba el pago.

`pending`: URL de retorno cuando el pago está pendiente.

`failure`: URL de retorno cuando se rechaza el pago. > WARNING diff --git a/guides/checkout-pro/redirection.pt.md b/guides/checkout-pro/redirection.pt.md index f3f9cb1ad0..ba997bd05f 100644 --- a/guides/checkout-pro/redirection.pt.md +++ b/guides/checkout-pro/redirection.pt.md @@ -1,18 +1,20 @@ # URLs de retorno -Ao final do processo de pagamento, é possível redirecionar o comprador novamente para o seu site através do atributo `back_urls`. Este atributo permite definir as URLs para onde o comprador deverá ser redirecionado segundo o status do pagamento. +Ao final do processo de pagamento, é possível redirecionar o comprador novamente para o seu site através do atributo `back_urls`. Este atributo permite definir as URLs para onde o comprador deverá ser redirecionado, automaticamente (`auto_return`) ou através do botão "Voltar ao site", segundo o status do pagamento. > NOTE > > Redirecionamento automático > -> Caso queira que o redirecionamento para os pagamentos aprovados seja automático, é preciso adicionar também o atributo `auto_return` com valor `approved`. Por padrão, também será exibido um botão de "Voltar ao site". **O tempo de redirecionamento será de 5 segundos**. +> Caso queira que o redirecionamento para os pagamentos aprovados com cartão de crédito seja automático, é preciso adicionar também o atributo `auto_return` com valor `approved`. Por padrão, também será exibido um botão de "Voltar ao site". **O tempo de redirecionamento será de até 40 segundos.**. +>

+> **Pagamentos com outros meios de pagamento não possuem o redirecionamento automático para pagamentos aprovados**, mas o atributo `back_urls` poderá ser configurado e utilizado a partir do botão de "Voltar ao site". -Nas tabelas a seguir você encontra o detalhe de cada um dos possíveis parâmetros de requisição e de resposta. +Na tabela a seguir você encontra o detalhe de cada um dos possíveis parâmetros de requisição e de resposta. | Atributo | Descrição | | ------------ | -------- | -| `auto_return` | Os compradores são redirecionados automaticamente para o _site_ quando o pagamento é aprovado. O valor padrão é `approved`. O tempo de redirecionamento é de 40 segundos e não pode ser personalizado. | +| `auto_return` | Os compradores são redirecionados automaticamente para o _site_ quando o pagamento com cartão de crédito é **aprovado**. O valor padrão é `approved`. **O tempo de redirecionamento será de até 40 segundos e não poderá ser personalizado.** | | `back_urls` | URL de retorno ao site. Possíveis cenários são:

`success`: URL de retorno perante pagamento aprovado.

`pending`: URL de retorno perante pagamento pendente.

`failure`: URL de retorno perante pagamento rejeitado. > WARNING diff --git a/guides/shopify/how-tos-order-payment-providers.en.md b/guides/shopify/how-tos-order-payment-providers.en.md index 93dae739a4..889544ac37 100644 --- a/guides/shopify/how-tos-order-payment-providers.en.md +++ b/guides/shopify/how-tos-order-payment-providers.en.md @@ -10,7 +10,7 @@ Learn how to use the **Mercado Pago Ordena Checkouts** app to change the display ## Install the app -1. [Click here](https://apps.shopify.com/mercado-pago-ordena-checkouts) to access the **Shopify app store** and install the **Mercado Pago Ordena Checkouts** app. +1. Access the [Shopify app store](https://apps.shopify.com/mercado-pago-ordena-checkouts) to install the **Mercado Pago Ordena Checkouts** app. 2. On the respective screen, click on **Add app**, and when necessary, select the account associated with the store where you want to install the app. 3. Click on **Install app**, and finally, click on **Activate**. @@ -18,12 +18,12 @@ Learn how to use the **Mercado Pago Ordena Checkouts** app to change the display 1. With the **Mercado Pago Ordena Checkouts** app open, use the search bar to locate and add the payment providers, making sure that the **search terms used should be identical to the names of the provider's app installed in your store**. The most commonly used providers in the country will be suggested, and you can also check them by clicking on **Check my selected provider**. 2. The selected providers will be listed according to your choices, and if necessary, they can be deleted. -----[mla, mlb, mpe, mco, mlu, mlc]---- -3. To reorder the position of the providers, **click and hold** the provider's card and drag it (_drag n drop_) to the desired position. The position of Mercado Pago among the providers cannot be changed. +----[mla, mlb, mpe, mco, mlu, mlc, mlb]---- +3. To reorder the position of the providers, **click and hold** the provider's card and drag it (_drag and drop_) to the desired position. The position of Mercado Pago among the providers cannot be changed. ------------ ----[mlm]---- -3. To reorder the position of the providers, **click and hold** the provider's card and drag it (_drag n drop_) to the desired position. Keep in mind that with **Mercado Pago Checkout Pro** in the first position, the store will have higher approval rates for payments with saved cards and will offer a more complete shopping experience to 90 million customers who pay with Mercado Pago. +3. To reorder the position of the providers, **click and hold** the provider's card and drag it (_drag and drop_) to the desired position. Keep in mind that with **Mercado Pago Checkout Pro** in the first position, the store will have higher approval rates for payments with saved cards and will offer a more complete shopping experience to 90 million customers who pay with Mercado Pago. ------------ 4. To confirm the changes, click on **Save display order**. diff --git a/guides/shopify/how-tos-order-payment-providers.es.md b/guides/shopify/how-tos-order-payment-providers.es.md index 5d92cf6c36..38b5fbb1db 100644 --- a/guides/shopify/how-tos-order-payment-providers.es.md +++ b/guides/shopify/how-tos-order-payment-providers.es.md @@ -10,7 +10,7 @@ Aprende cómo utilizar la app **Mercado Pago Ordena Checkouts** para cambiar el ## Instalar la app -1. Haz clic [aquí](https://apps.shopify.com/mercado-pago-ordena-checkouts) para acceder a la **app store de Shopify** e instalar la aplicación **Mercado Pago Ordena Checkouts**. +1. Accede a la [app store de Shopify](https://apps.shopify.com/mercado-pago-ordena-checkouts) para instalar la aplicación **Mercado Pago Ordena Checkouts**. 2. En la pantalla correspondiente, haz clic en **Agregar app** y, cuando te sea solicitado, selecciona la cuenta asociada a la tienda donde se realizará la instalación de la aplicación. 3. Haz clic en **Instalar app** y finalmente en **Activar**. @@ -18,12 +18,12 @@ Aprende cómo utilizar la app **Mercado Pago Ordena Checkouts** para cambiar el 1. Con la app **Mercado Pago Ordena Checkouts** abierta, utiliza la barra de búsqueda para localizar y agregar los proveedores de pago, asegurándote de que los **nombres ingresados para la búsqueda sean idénticos a los nombres de la app del proveedor instalada en tu tienda**. Se sugerirán los proveedores más utilizados en el país, y también podrás consultarlos haciendo clic en **Ver mis proveedores seleccionados**. 2. Los proveedores seleccionados se listarán según tu elección y, si es necesario, podrán ser eliminados. -----[mla, mpe, mco, mlu, mlc]---- -3. Para reordenar la visualización de los proveedores, **haz clic y mantén presionada** la tarjeta del proveedor y arrástrala (_drag n drop_) a la posición deseada. No será posible cambiar la posición de Mercado Pago entre los proveedores. +----[mla, mpe, mco, mlu, mlc, mlb]---- +3. Para reordenar la visualización de los proveedores, **haz clic y mantén presionada** la tarjeta del proveedor y arrástrala (_drag and drop_) a la posición deseada. No será posible cambiar la posición de Mercado Pago entre los proveedores. ------------ ----[mlm]---- -3. Para reordenar la visualización de los proveedores, **haz clic y mantén presionada** la tarjeta del proveedor y arrástrala (_drag n drop_) a la posición deseada. Ten en cuenta que con el **Mercado Pago Checkout Pro** en la primera posición, la tienda tendrá mayores tasas de aprobación para pagos con tarjetas guardadas y ofrecerá una experiencia de compra más completa para los 90 millones de clientes que pagan con Mercado Pago. +3. Para reordenar la visualización de los proveedores, **haz clic y mantén presionada** la tarjeta del proveedor y arrástrala (_drag and drop_) a la posición deseada. Ten en cuenta que con el **Mercado Pago Checkout Pro** en la primera posición, la tienda tendrá mayores tasas de aprobación para pagos con tarjetas guardadas y ofrecerá una experiencia de compra más completa para los 90 millones de clientes que pagan con Mercado Pago. ------------ 4. Para confirmar los cambios, haz clic en **Guardar orden de visualización**. diff --git a/guides/shopify/how-tos-order-payment-providers.pt.md b/guides/shopify/how-tos-order-payment-providers.pt.md index ebe0f3dcf3..0f4c370410 100644 --- a/guides/shopify/how-tos-order-payment-providers.pt.md +++ b/guides/shopify/how-tos-order-payment-providers.pt.md @@ -1,4 +1,4 @@ -# Como alterar a posicão dos provedores de pagamento +# Como alterar a posição dos provedores de pagamento Saiba como utilizar o app **Mercado Pago Ordena Checkouts** para alterar a ordem de exibição dos provadores de pagamentos integrados em sua loja Shopify. @@ -10,19 +10,19 @@ Saiba como utilizar o app **Mercado Pago Ordena Checkouts** para alterar a ordem ## Instale o app -1. [Clique aqui](https://apps.shopify.com/mercado-pago-ordena-checkouts) para acessar a **app store da Shopify** e instalar o app **Mercado Pago Ordena Checkouts**. -2. Na tela em questão, clique em **Adicionar app** e, quando necessário, selecione a conta associada à loja em que será feita a instalação do app. +1. Acesse a [app store da Shopify](https://apps.shopify.com/mercado-pago-ordena-checkouts) para instalar o app **Mercado Pago Ordena Checkouts**. +2. Clique em **Adicionar app** e, quando necessário, selecione a conta associada à loja em que será feita a instalação do app. 3. Clique em **Instalar app** e, por fim, em **Ativar** ## Altere a posição dos provedores -1. Com o app **Mercado Pago Ordena Checkouts** aberto, utilize a barra de busca para localizar e adicionar os provedores de pagamento, sendo que os **nomes inseridos para busca deverão ser idênticos aos nomes do app do provedor instalado na sua loja**. Serão disponibilizados os provedores de maior uso no país como sugestão e também será possível consultá-los clicando em **Conferir meus provedores provedores**. +1. Com o app **Mercado Pago Ordena Checkouts** aberto, utilize a barra de busca para localizar e adicionar os provedores de pagamento, sendo que os **nomes inseridos para busca deverão ser idênticos aos nomes do app do provedor instalado na sua loja**. Serão disponibilizados os provedores de maior uso no país como sugestão e também será possível consultá-los clicando em **Conferir meus provedores**. 2. Os provedores selecionados serão listados de acordo com a sua seleção e, caso necessário, poderão ser deletados. -----[mla, mpe, mco, mlu, mlc]---- -3. Para reordenar a posição dos provedores, **clique e segure** o card do provedor e arraste-o (_drag n drop_) para a posição desejada. Não será possível alterar a posição do Mercado Pago entre os provedores. +----[mla, mpe, mco, mlu, mlc, mlb]---- +3. Para reordenar a posição dos provedores, **clique e segure** o card do provedor e arraste-o (_drag and drop_) para a posição desejada. Não será possível alterar a posição do Mercado Pago entre os provedores. ------------ ----[mlm]---- -3. Para reordenar a posição dos provedores, **clique e segure** o card do provedor e arraste-o (_drag n drop_) para a posição desejada. Lembrando que com o **Mercado Pago Checkout Pro** na primeira posição, a loja terá maiores taxas de aprovação em pagamentos com cartões salvos e oferecerá uma experiência de compra mais completa para 90 milhões de clientes que pagam com o Mercado Pago. +3. Para reordenar a posição dos provedores, **clique e segure** o card do provedor e arraste-o (_drag and drop_) para a posição desejada. Lembrando que com o **Mercado Pago Checkout Pro** na primeira posição, a loja terá maiores taxas de aprovação em pagamentos com cartões salvos e oferecerá uma experiência de compra mais completa para 90 milhões de clientes que pagam com o Mercado Pago. ------------ 4. Para confirmar as alterações, clique em **Salvar ordem de exibição**. diff --git a/reference/api-json/preferences.json b/reference/api-json/preferences.json index 1975b6b697..b8c902aba2 100644 --- a/reference/api-json/preferences.json +++ b/reference/api-json/preferences.json @@ -553,9 +553,9 @@ "back_urls": { "type": "object", "description": { - "en": "URLs to return to the sellers website.", - "pt": "Url de retorno ao site do vendedor.", - "es": "URLs de retorno al sitio del vendedor." + "en": "Return URLs to the seller's site, either automatically (\"auto_return\") or through the 'Return to site' button, depending on the payment status.", + "pt": "URLs de retorno ao site do vendedor, automaticamente (\"auto_return\") ou através do botão 'Voltar ao site', segundo o status do pagamento.", + "es": "URLs de retorno al sitio del vendedor, ya sea automáticamente (\"auto_return\") o a través del botón 'Volver al sitio', según el estado del pago." }, "properties": { "success": { @@ -593,7 +593,7 @@ "description": { "en": "Notifications URL available to receive notifications of events related to Payment. The maximum number of characters allowed for submission in this parameter is 248 characters.", "pt": "URL de notificações disponível para receber notificações de eventos relacionados ao Pagamento. A quantidade máxima de caracteres permitidos para envio neste parâmetro é de 248 caracteres.", - "es": "URL de Notificaciones disponibilizada para recibir las notificaciones de los eventos relacionados al Pago. La cantidad máxima de caracteres permitidos para enviar en este parámetro es de 248 caracteres." + "es": "URL de notificaciones disponibilizada para recibir las notificaciones de los eventos relacionados al Pago. La cantidad máxima de caracteres permitidos para enviar en este parámetro es de 248 caracteres." } }, "statement_descriptor": { @@ -1077,9 +1077,9 @@ "back_urls": { "type": "object", "description": { - "en": "URLs to return to the sellers website.", - "pt": "Url de retorno ao site do vendedor.", - "es": "URLs de retorno al sitio del vendedor." + "en": "Return URLs to the seller's site, either automatically (\"auto_return\") or through the 'Return to site' button, depending on the payment status.", + "pt": "URLs de retorno ao site do vendedor, automaticamente (\"auto_return\") ou através do botão 'Voltar ao site', segundo o status do pagamento.", + "es": "URLs de retorno al sitio del vendedor, ya sea automáticamente (\"auto_return\") o a través del botón 'Volver al sitio', según el estado del pago." }, "properties": { "success": { @@ -2150,9 +2150,9 @@ "back_urls": { "type": "object", "description": { - "en": "URLs to return to the sellers website.", - "pt": "Url de retorno ao site do vendedor.", - "es": "URLs de retorno al sitio del vendedor." + "en": "Return URLs to the seller's site, either automatically (\"auto_return\") or through the 'Return to site' button, depending on the payment status.", + "pt": "URLs de retorno ao site do vendedor, automaticamente (\"auto_return\") ou através do botão 'Voltar ao site', segundo o status do pagamento.", + "es": "URLs de retorno al sitio del vendedor, ya sea automáticamente (\"auto_return\") o a través del botón 'Volver al sitio', según el estado del pago." }, "properties": { "failure": { @@ -3432,9 +3432,9 @@ "back_urls": { "type": "object", "description": { - "en": "URLs to return to the sellers website.", - "pt": "Url de retorno ao site do vendedor.", - "es": "URLs de retorno al sitio del vendedor." + "en": "Return URLs to the seller's site, either automatically (\"auto_return\") or through the 'Return to site' button, depending on the payment status.", + "pt": "URLs de retorno ao site do vendedor, automaticamente (\"auto_return\") ou através do botão 'Voltar ao site', segundo o status do pagamento.", + "es": "URLs de retorno al sitio del vendedor, ya sea automáticamente (\"auto_return\") o a través del botón 'Volver al sitio', según el estado del pago." }, "properties": { "success": { @@ -3601,9 +3601,9 @@ "back_urls": { "type": "object", "description": { - "en": "URLs to return to the sellers website.", - "pt": "Url de retorno ao site do vendedor.", - "es": "URLs de retorno al sitio del vendedor." + "en": "Return URLs to the seller's site, either automatically (\"auto_return\") or through the 'Return to site' button, depending on the payment status.", + "pt": "URLs de retorno ao site do vendedor, automaticamente (\"auto_return\") ou através do botão 'Voltar ao site', segundo o status do pagamento.", + "es": "URLs de retorno al sitio del vendedor, ya sea automáticamente (\"auto_return\") o a través del botón 'Volver al sitio', según el estado del pago." }, "properties": { "failure": { @@ -4170,19 +4170,10 @@ }, "redirect_urls": { "type": "object", - "properties": { - "failure": { - "type": "string", - "example": "" - }, - "pending": { - "type": "string", - "example": "" - }, - "success": { - "type": "string", - "example": "" - } + "description": { + "en": "URL (in https) where you want to receive the authorization code when your integration is set up as a marketplace or performed through the flow Authorization code by OAuth.", + "pt": "URL (em https) na qual você deseja receber o código de autorização quando sua integração for configurada como Marketplace ou realizada por meio do fluxo Authorization code de OAuth. Certifique-se de que seja uma URL estática.", + "es": "URLs (en https) donde deseas recibir el código de autorización cuando tu integración sea configurada como Marketplace o se utilice el flujo Authorization code de OAuth." } }, "sandbox_init_point": { @@ -4592,25 +4583,25 @@ "type": "String", "example": "approved", "description": { - "en": "If specified, your buyers will be redirected back to your site immediately after completing the purchase.", - "pt": "No caso de estar especificado o comprador será redirecionado para o seu site imediatamente após a compra.", - "es": "En el caso de estar especificado tu comprador sera redirigido a tu sitio inmediatamente después de la compra." + "en": "If specified, the buyer will be automatically redirected to the seller's site after the purchase is approved with a credit card.", + "pt": "No caso de estar especificado, o comprador será redirecionado para o site do vendedor automaticamente após a compra aprovada com cartão de crédito.", + "es": "En el caso de estar especificado, el comprador será redirigido automáticamente al sitio del vendedor después de que la compra sea aprobada con tarjeta de crédito." }, "enum": [ { "title": "approved", "description": { - "en": "The redirection takes place only for approved payments.", - "es": "El redireccionamiento solo ocurre para pagos aprobados.", - "pt": "O redirecionamento ocorre apenas para pagamentos aprovados." + "en": "The redirection takes place only for approved payments with a credit card.", + "es": "El redireccionamiento solo ocurre para pagos aprobados con tarjeta de crédito.", + "pt": "O redirecionamento ocorre apenas para pagamentos aprovados com cartão de crédito." } }, { "title": "all", "description": { - "en": "The redirection takes place only for approved payments, forward compatibility only if we change the default behavior.", - "es": "El redireccionamiento se realiza únicamente para pagos aprobados, compatibilidad con versiones posteriores solo si cambiamos el comportamiento predeterminado.", - "pt": "O redirecionamento ocorre apenas para pagamentos aprovados, compatibilidade futura somente se alterarmos o comportamento padrão." + "en": "The redirection takes place only for approved payments with a credit card, forward compatibility only if we change the default behavior.", + "es": "El redireccionamiento se realiza únicamente para pagos aprobados con tarjeta de crédito, compatibilidad con versiones posteriores solo si cambiamos el comportamiento predeterminado.", + "pt": "O redirecionamento ocorre apenas para pagamentos aprovados com cartão de crédito, compatibilidade futura somente se alterarmos o comportamento padrão." } } ]