Tokenización Introducción Comercia 2.0 TPV permite completar el pago con tokens de tarjeta generados a partir de datos físicos de la tarjeta. Para ello, durante una solicitud de venta o pre-autorización realizada con tarjeta física, si la solicitud de Pago así lo especifica, el host generará y devolverá en la respuesta de autorización un Token único asociado a los datos de la tarjeta del cliente. Este token representa los datos de la tarjeta del cliente, y puede usarse en próximas transacciones, reemplazando la necesidad de presentar la tarjeta física. Parámetros En esta tabla tienes los parámetros relacionados con la tokenización. NombreTipoDescripción createTokenBooleano – true – falseSi se establece en true, se solicitará la generación de un token de tarjeta en la solicitud de autorización de transacción actual. Los tipos de transacciones que soportan la operación de tokenización de tarjetas son VENTAS y PREAUTORIZACIONES. A los efectos de estas especificaciones, estas transacciones son: – Tarjeta de pago y tokenización – Tarjeta de preautorización nueva y tokenización. codeOfUseString Máximo 1 caracterEste atributo informa sobre el uso específico del token y debe proporcionarse en la transacción realizada con el Token. Los valores actualmente soportados por Comercia son los siguientes: – «C» Pago único – «R» Pago recurrente – «D» Retrasado – «E» Reenvío – «H» Re-Autorización – «M» Incremental – «N» No se muestra Longitud máxima: 1 customerIdString Máximo 100 caracteresEl ID de Cliente enviado en la solicitud de generación de token (Transacción y Tokenización) está asociado de forma única a los datos del Token generados y devueltos por Comercia. A continuación deberá presentarse junto con los datos de su Token asociado en cada Solicitud de Pago realizada en la app con el Token. tokenString Máximo 64 caracteresEl token de la tarjeta representa los datos de la tarjeta en las solicitudes de pago, reembolso o preautorización con Token. Se genera y devuelve en la respuesta de operaciones y tokenización. Para efectos de estas especificaciones, las transacciones con Token que se podrán realizar en Comercia son: – Pago con Token – Pre autorización – Nuevo con token – Autorización previa completa con token – Reembolso con Token. subscriptionIdString Máximo 15 caracteresID de suscripción asociado a un token específico. Estos datos son devueltos por el Host en las solicitudes de operaciones y tokenización. Está asociado de forma única a los datos del Token devueltos en la misma respuesta y deben presentarse juntos en cada solicitud de pago con Token. tokenizerCodeStringCódigo de resultado para tokenización de tarjetas y transacciones tokenizadas. Valores posibles: – «0» Transacción exitosa – «1» Token no generado – «2» PAN no recuperado POST Payment & Tokenization Card (Tarjeta de pago y tokenización) Esta solicitud inicia una Transacción de Pago y tokenización de la tarjeta. Se envía a: https:// 172.20.10.1:2011/v1/transactions/payment Payload de la petición amount: Número decimal positivo. Contiene la cantidad de la transacción, la parte decimal está separada por un punto ( . ). orderId: Cadena (string). Un número de pedido/factura/referencia es un valor asignado por la aplicación del cliente que está asociado a la transacción pero que no se pasa en la solicitud de transacción al banco (por lo que no está asociado en los registros bancarios con la transacción). En general, se espera que este parámetro sea único. description: Cadena (string). Es un valor asignado por la app cliente que se asocia al concepto de la transacción y se muestra en pantalla junto con la cantidad de la transacción. tokenization: Tokenización. Solicitud de objeto de tokenización. ENCABEZADOS X-SOURCE COMERCIA ID de la aplicación de petición que identifica de forma exclusiva la aplicación que origina la solicitud de API. Body raw (json) { "orderId": "tx-00000002", "amount": 2, "description":"Billete Sencillo", "tokenization": { "createToken": true, "codeOfUse": "C", "customerId": "123456789" } } Estos son ejemplos de petición y respuesta de POST Tarjeta de pago y tokenización. Aquí tienes los ejemplos en algunos lenguajes de programación. JavaScript - Fetch C# - HttpClient cURL - cURL Python - Requests Swift - URLSession Otros lenguajes var myHeaders = new Headers(); myHeaders.append("X-SOURCE", "COMERCIA"); var raw = "{\n \"orderId\": \"tx-00000002\",\n \"amount\": 2,\n \"description\":\"Billete Sencillo\",\n \"tokenization\": {\n \"createToken\": true,\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}"; var requestOptions = { method: 'POST', headers: myHeaders, body: raw, redirect: 'follow' }; fetch("https:// 172.20.10.1:2011/v1/transactions/payment", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error)); var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, "https:// 172.20.10.1:2011/v1/transactions/payment"); request.Headers.Add("X-SOURCE", "COMERCIA"); var content = new StringContent("{\n \"orderId\": \"tx-00000002\",\n \"amount\": 2,\n \"description\":\"Billete Sencillo\",\n \"tokenization\": {\n \"createToken\": true,\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}", null, "text/plain"); request.Content = content; var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync()); curl --location 'https:// 172.20.10.1:2011/v1/transactions/payment' \ --header 'X-SOURCE: COMERCIA' \ --data '{ "orderId": "tx-00000002", "amount": 2, "description":"Billete Sencillo", "tokenization": { "createToken": true, "codeOfUse": "C", "customerId": "123456789" } }' import requests url = "https:// 172.20.10.1:2011/v1/transactions/payment" payload = "{\n \"orderId\": \"tx-00000002\",\n \"amount\": 2,\n \"description\":\"Billete Sencillo\",\n \"tokenization\": {\n \"createToken\": true,\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}" headers = { 'X-SOURCE': 'COMERCIA' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) let parameters = "{\n \"orderId\": \"tx-00000002\",\n \"amount\": 2,\n \"description\":\"Billete Sencillo\",\n \"tokenization\": {\n \"createToken\": true,\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}" let postData = parameters.data(using: .utf8) var request = URLRequest(url: URL(string: "https:// 172.20.10.1:2011/v1/transactions/payment")!,timeoutInterval: Double.infinity) request.addValue("COMERCIA", forHTTPHeaderField: "X-SOURCE") request.httpMethod = "POST" request.httpBody = postData let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data else { print(String(describing: error)) return } print(String(data: data, encoding: .utf8)!) } task.resume() Puedes ver más ejemplos de lenguajes de programación en nuestra colección Postman. Este es el JSON de la respuesta y sus encabezados: Cuerpo Encabezados { "orderId": "tx-00000002", "resultCode": 0, "resultMessage": "ACEPTADA", "ticket": { "AID": "A0000000031010", "ARC": "00", "ATC": "00959", "PSN": "01", "Amount": "200", "Authorization": "43970 ", "CardBank": "Comercia Global Payments", "CardHolder": "", "CardIssuer": "VISA CLASICA", "CardNumber": "************2825", "CardTechnology": 1, "CardType": "", "Currency": "EUR", "Date": "20230202", "Id": "187780", "Language": "es", "Location": "BARCELONA", "MerchantId": "329811087", "MerchantName": "Comercia Global Payments PRUEBAS", "Modifiers": [], "OriginalTransactionDate": "", "OriginalTransactionId": "", "PinIndicator": 1, "SignatureIndicator": 0, "Status": "0", "Templates": [], "TerminalId": "00000021", "Time": "1540", "Type": "Payment" }, "tokenization": { "subscriptionId": "232023033707473", "token": "490727200336944988668125853538957465289310483021", "tokenizerCode": "0" } } Content–Type application/json Date Thu, 2 Feb 2023 14:40:53 GMT Access-Control-Allow-Origin * Access-Control-Allow-Credentials true Connection keep-alive Content-Encoding gzip Transfer-Encoding chunked POST PreAuthorization New & Tokenization Card (Pre-autorizar tarjeta nueva y tokenización) Esta solicitud inicia una autorización previa. Se envía a: https:// 172.20.10.1:2011/v1/transactions/preauth/new Petición Payload amount: Número decimal positivo. Contiene la cantidad de la transacción, la parte decimal está separada por un punto ( . ). orderId (opcional): Cadena. Un número de pedido/factura/referencia es un valor asignado por la aplicación del cliente que está asociado a la transacción pero que no se pasa en la solicitud de transacción al banco (por lo que no está asociado en los registros bancarios con la transacción). En general, se espera que este parámetro sea único. description (opcional): Cadena. Es un valor asignado por la app cliente que se asocia al concepto de la transacción y se muestra en pantalla junto con la cantidad de la transacción. tokenization: Tokenización. Solicitud de objeto de tokenización. ENCABEZADOS X-SOURCE COMERCIA ID de la aplicación de petición que identifica de forma exclusiva la aplicación que origina la solicitud de API. Body raw (json) { "amount": 1, "description": "billete sencillo", "tokenization": { "createToken": true, "codeOfUse": "R", "customerId": "123456789" } } Estos son ejemplos de petición y respuesta de POST Pre-autorizar tarjeta nueva y tokenización. Aquí tienes los ejemplos en algunos lenguajes de programación. JavaScript - Fetch C# - HttpClient cURL - cURL Python - Requests Swift - URLSession Otros lenguajes var myHeaders = new Headers(); myHeaders.append("X-SOURCE", "COMERCIA"); var raw = "{\n \"amount\": 1,\n \"description\": \"billete sencillo\",\n \"tokenization\": {\n \"createToken\": true,\n \"codeOfUse\": \"R\",\n \"customerId\": \"123456789\"\n }\n}"; var requestOptions = { method: 'POST', headers: myHeaders, body: raw, redirect: 'follow' }; fetch("https:// 172.20.10.1:2011/v1/transactions/preauth/new", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error)); var myHeaders = new Headers(); myHeaders.append("X-SOURCE", "COMERCIA"); var raw = "{\n \"amount\": 1,\n \"description\": \"billete sencillo\",\n \"tokenization\": {\n \"createToken\": true,\n \"codeOfUse\": \"R\",\n \"customerId\": \"123456789\"\n }\n}"; var requestOptions = { method: 'POST', headers: myHeaders, body: raw, redirect: 'follow' }; fetch("https:// 172.20.10.1:2011/v1/transactions/preauth/new", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error)); curl --location 'https:// 172.20.10.1:2011/v1/transactions/preauth/new' \ --header 'X-SOURCE: COMERCIA' \ --data '{ "amount": 1, "description": "billete sencillo", "tokenization": { "createToken": true, "codeOfUse": "R", "customerId": "123456789" } }' import requests url = "https:// 172.20.10.1:2011/v1/transactions/preauth/new" payload = "{\n \"amount\": 1,\n \"description\": \"billete sencillo\",\n \"tokenization\": {\n \"createToken\": true,\n \"codeOfUse\": \"R\",\n \"customerId\": \"123456789\"\n }\n}" headers = { 'X-SOURCE': 'COMERCIA' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) let parameters = "{\n \"amount\": 1,\n \"description\": \"billete sencillo\",\n \"tokenization\": {\n \"createToken\": true,\n \"codeOfUse\": \"R\",\n \"customerId\": \"123456789\"\n }\n}" let postData = parameters.data(using: .utf8) var request = URLRequest(url: URL(string: "https:// 172.20.10.1:2011/v1/transactions/preauth/new")!,timeoutInterval: Double.infinity) request.addValue("COMERCIA", forHTTPHeaderField: "X-SOURCE") request.httpMethod = "POST" request.httpBody = postData let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data else { print(String(describing: error)) return } print(String(data: data, encoding: .utf8)!) } task.resume() Puedes ver más ejemplos de lenguajes de programación en nuestra colección Postman. Este es el JSON de la respuesta y sus encabezados: Cuerpo Encabezados { "resultCode": 0, "resultMessage": "ACEPTADA", "ticket": { "AID": "A0000000031010", "ARC": "00", "ATC": "00960", "PSN": "01", "Amount": "100", "Authorization": "238599", "CardBank": "Comercia Global Payments", "CardHolder": "", "CardIssuer": "VISA CLASICA", "CardNumber": "************2825", "CardTechnology": 1, "CardType": "", "Currency": "EUR", "Date": "20230203", "Id": "188272", "Language": "es", "Location": "BARCELONA", "MerchantId": "329811087", "MerchantName": "Comercia Global Payments PRUEBAS", "Modifiers": [], "OriginalTransactionDate": "", "OriginalTransactionId": "", "PinIndicator": 1, "SignatureIndicator": 0, "Status": "0", "Templates": [], "TerminalId": "00000021", "Time": "2304", "Type": "Preauthorization" }, "tokenization": { "subscriptionId": "232023034711367", "token": "490727200336944988668125853538957465289310483021", "tokenizerCode": "0" } } Content–Type application/json Date Fri, 3 Feb 2023 22:04:34 GMT Access-Control-Allow-Origin * Access-Control-Allow-Credentials true Connection keep-alive Content-Encoding gzip Transfer-Encoding chunked POST Payment with Token (Pago con Token) Esta solicitud inicia una transacción de pago. Se envía a: https:// 172.20.10.1:2011/v1/transactions/payment Petición Payload amount: Número decimal positivo. Contiene la cantidad de la transacción, la parte decimal está separada por un punto ( . ). orderId: Cadena. Un número de pedido/factura/referencia es un valor asignado por la aplicación del cliente que está asociado a la transacción pero que no se pasa en la solicitud de transacción al banco (por lo que no está asociado en los registros bancarios con la transacción). En general, se espera que este parámetro sea único. description: Cadena. Es un valor asignado por la app cliente que se asocia al concepto de la transacción y se muestra en pantalla junto con la cantidad de la transacción. tokenization: Tokenización. Solicitud de objeto de tokenización. ENCABEZADOS X-SOURCE COMERCIA ID de la aplicación de petición que identifica de forma exclusiva la aplicación que origina la solicitud de API. Body raw (json) { "orderId": "tx-00000001", "amount": 1, "description": "Billete Sencillo", "tokenization": { "subscriptionId": "232023033707473", "token": "490727200336944988668125853538957465289310483021", "codeOfUse": "C", "customerId": "123456789" } } Estos son ejemplos de petición y respuesta de POST Pago con token. Aquí tienes los ejemplos en algunos lenguajes de programación. JavaScript - Fetch C# - HttpClient cURL - cURL Python - Requests Swift - URLSession Otros lenguajes var myHeaders = new Headers(); myHeaders.append("X-SOURCE", "COMERCIA"); var raw = "{\n \"orderId\": \"tx-00000001\",\n \"amount\": 3,\n \"description\": \"Billete Sencillo\",\n \"tokenization\": {\n \"subscriptionId\": \"232023033707473\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}"; var requestOptions = { method: 'POST', headers: myHeaders, body: raw, redirect: 'follow' }; fetch("https:// 172.20.10.1:2011/v1/transactions/payment", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error)); var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, "https:// 172.20.10.1:2011/v1/transactions/payment"); request.Headers.Add("X-SOURCE", "COMERCIA"); var content = new StringContent("{\n \"orderId\": \"tx-00000001\",\n \"amount\": 3,\n \"description\": \"Billete Sencillo\",\n \"tokenization\": {\n \"subscriptionId\": \"232023033707473\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}", null, "text/plain"); request.Content = content; var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync()); curl --location 'https:// 172.20.10.1:2011/v1/transactions/payment' \ --header 'X-SOURCE: COMERCIA' \ --data '{ "orderId": "tx-00000001", "amount": 3, "description": "Billete Sencillo", "tokenization": { "subscriptionId": "232023033707473", "token": "490727200336944988668125853538957465289310483021", "codeOfUse": "C", "customerId": "123456789" } }' import requests url = "https:// 172.20.10.1:2011/v1/transactions/payment" payload = "{\n \"orderId\": \"tx-00000001\",\n \"amount\": 3,\n \"description\": \"Billete Sencillo\",\n \"tokenization\": {\n \"subscriptionId\": \"232023033707473\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}" headers = { 'X-SOURCE': 'COMERCIA' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) let parameters = "{\n \"orderId\": \"tx-00000001\",\n \"amount\": 3,\n \"description\": \"Billete Sencillo\",\n \"tokenization\": {\n \"subscriptionId\": \"232023033707473\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}" let postData = parameters.data(using: .utf8) var request = URLRequest(url: URL(string: "https:// 172.20.10.1:2011/v1/transactions/payment")!,timeoutInterval: Double.infinity) request.addValue("COMERCIA", forHTTPHeaderField: "X-SOURCE") request.httpMethod = "POST" request.httpBody = postData let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data else { print(String(describing: error)) return } print(String(data: data, encoding: .utf8)!) } task.resume() Puedes ver más ejemplos de lenguajes de programación en nuestra colección Postman. Este es el JSON de la respuesta y sus encabezados: Cuerpo Encabezados { "orderId": "tx-00000001", "resultCode": 0, "resultMessage": "ACEPTADA", "ticket": { "AID": "", "ARC": "00", "ATC": "", "PSN": "", "Amount": "300", "Authorization": "847650", "CardBank": "Comercia Global Payments", "CardHolder": "", "CardIssuer": "VISA VISA CASH-CLASSIC", "CardNumber": "************2825", "CardTechnology": 3, "CardType": "", "Currency": "EUR", "Date": "20230202", "Id": "187782", "Language": "es", "Location": "BARCELONA", "MerchantId": "329811087", "MerchantName": "Comercia Global Payments PRUEBAS", "Modifiers": [], "OriginalTransactionDate": "", "OriginalTransactionId": "", "PinIndicator": 0, "SignatureIndicator": 0, "Status": "0", "Templates": [], "TerminalId": "00000021", "Time": "1541", "Type": "Payment" }, "tokenization": { "tokenizerCode": "0" } } Content–Type application/json Date Thu, 2 Feb 2023 14:41:55 GMT Access-Control-Allow-Origin * Access-Control-Allow-Credentials true Connection keep-alive Content-Encoding gzip Transfer-Encoding chunked POST Refund with Token (Reembolso con Token) Esta solicitud inicia una transacción de reembolso. Se envía a: https:// 172.20.10.1:2011/v1/transactions/refund Petición Payload amount: Número decimal positivo. Contiene la cantidad de la transacción, la parte decimal está separada por un punto ( . ). transactionId: Cadena de dígitos decimales. Identifica el ID de transacción anterior que se desea reembolsar. orderId (opcional): Cadena. Un número de pedido/factura/referencia es un valor asignado por la aplicación del cliente que está asociado a la transacción pero que no se pasa en la solicitud de transacción al banco (por lo que no está asociado en los registros bancarios con la transacción). En general, se espera que este parámetro sea único. description (opcional): Cadena. Es un valor asignado por la app cliente que se asocia al concepto de la transacción y se muestra en pantalla junto con la cantidad de la transacción. tokenization: Tokenización. Solicitud de objeto de tokenización. ENCABEZADOS X-SOURCE COMERCIA ID de la aplicación de petición que identifica de forma exclusiva la aplicación que origina la solicitud de API. Body raw (json) { "transactionId": "187782", "amount": 3, "tokenization": { "subscriptionId": "232023033707473", "token": "490727200336944988668125853538957465289310483021", "codeOfUse": "C", "customerId": "123456789" } } Estos son ejemplos de petición y respuesta de POST Reembolso con token. Aquí tienes los ejemplos en algunos lenguajes de programación. JavaScript - Fetch C# - HttpClient cURL - cURL Python - Requests Swift - URLSession Otros lenguajes var myHeaders = new Headers(); myHeaders.append("X-SOURCE", "COMERCIA"); var raw = "{\n \"transactionId\": \"187782\",\n \"amount\": 3,\n \"tokenization\": {\n \"subscriptionId\": \"232023033707473\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}"; var requestOptions = { method: 'POST', headers: myHeaders, body: raw, redirect: 'follow' }; fetch("https:// 172.20.10.1:2011/v1/transactions/refund", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error)); var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, "https:// 172.20.10.1:2011/v1/transactions/refund"); request.Headers.Add("X-SOURCE", "COMERCIA"); var content = new StringContent("{\n \"transactionId\": \"187782\",\n \"amount\": 3,\n \"tokenization\": {\n \"subscriptionId\": \"232023033707473\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}", null, "text/plain"); request.Content = content; var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync()); curl --location 'https:// 172.20.10.1:2011/v1/transactions/refund' \ --header 'X-SOURCE: COMERCIA' \ --data '{ "transactionId": "187782", "amount": 3, "tokenization": { "subscriptionId": "232023033707473", "token": "490727200336944988668125853538957465289310483021", "codeOfUse": "C", "customerId": "123456789" } }' import requests url = "https:// 172.20.10.1:2011/v1/transactions/refund" payload = "{\n \"transactionId\": \"187782\",\n \"amount\": 3,\n \"tokenization\": {\n \"subscriptionId\": \"232023033707473\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}" headers = { 'X-SOURCE': 'COMERCIA' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) let parameters = "{\n \"transactionId\": \"187782\",\n \"amount\": 3,\n \"tokenization\": {\n \"subscriptionId\": \"232023033707473\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}" let postData = parameters.data(using: .utf8) var request = URLRequest(url: URL(string: "https:// 172.20.10.1:2011/v1/transactions/refund")!,timeoutInterval: Double.infinity) request.addValue("COMERCIA", forHTTPHeaderField: "X-SOURCE") request.httpMethod = "POST" request.httpBody = postData let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data else { print(String(describing: error)) return } print(String(data: data, encoding: .utf8)!) } task.resume() Puedes ver más ejemplos de lenguajes de programación en nuestra colección Postman. Este es el JSON de la respuesta y sus encabezados: Cuerpo Encabezados { "resultCode": 0, "resultMessage": "ACEPTADA", "ticket": { "AID": "", "ARC": "00", "ATC": "", "PSN": "", "Amount": "300", "Authorization": "847650", "CardBank": "Comercia Global Payments", "CardHolder": "", "CardIssuer": "VISA VISA CASH-CLASSIC", "CardNumber": "************2825", "CardTechnology": 3, "CardType": "", "Currency": "EUR", "Date": "20230202", "Id": "187784", "Language": "es", "Location": "BARCELONA", "MerchantId": "329811087", "MerchantName": "Comercia Global Payments PRUEBAS", "Modifiers": [], "OriginalTransactionDate": "20230202", "OriginalTransactionId": "187782", "PinIndicator": 0, "SignatureIndicator": 0, "Status": "0", "Templates": [], "TerminalId": "00000021", "Time": "1543", "Type": "Refund" }, "tokenization": { "tokenizerCode": "0" } } Content–Type application/json Date Thu, 2 Feb 2023 14:43:23 GMT Access-Control-Allow-Origin * Access-Control-Allow-Credentials true Connection keep-alive Content-Encoding gzip Transfer-Encoding chunked POST PreAuthorization New with Token (Preautorización nueva con Token) Esta solicitud inicia una pre-autorización. Se envía a: https:// 172.20.10.1:2011/v1/transactions/preauth/new Petición Payload amount: Número decimal positivo. Contiene la cantidad de la transacción, la parte decimal está separada por un punto ( . ). orderId (opcional): Cadena. Un número de pedido/factura/referencia es un valor asignado por la aplicación del cliente que está asociado a la transacción pero que no se pasa en la solicitud de transacción al banco (por lo que no está asociado en los registros bancarios con la transacción). En general, se espera que este parámetro sea único. description (opcional): Cadena. Es un valor asignado por la app cliente que se asocia al concepto de la transacción y se muestra en pantalla junto con la cantidad de la transacción. tokenization: Tokenización. Solicitud de objeto de tokenización. ENCABEZADOS X-SOURCE COMERCIA ID de la aplicación de petición que identifica de forma exclusiva la aplicación que origina la solicitud de API. Body raw (json) { "amount": 1, "description": "billete sencillo", "tokenization": { "subscriptionId": "232023031702405", "token": "490727200336944988668125853538957465289310483021", "codeOfUse": "C", "customerId": "123456789" } } Estos son ejemplos de petición y respuesta de POST Pre-autorización nueva con token. Aquí tienes los ejemplos en algunos lenguajes de programación. JavaScript - Fetch C# - HttpClient cURL - cURL Python - Requests Swift - URLSession Otros lenguajes var myHeaders = new Headers(); myHeaders.append("X-SOURCE", "COMERCIA"); var raw = "{\n \"amount\": 1,\n \"description\": \"billete sencillo\",\n \"tokenization\": {\n \"subscriptionId\": \"232023031702405\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}"; var requestOptions = { method: 'POST', headers: myHeaders, body: raw, redirect: 'follow' }; fetch("https:// 172.20.10.1:2011/v1/transactions/preauth/new", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error)); var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, "https:// 172.20.10.1:2011/v1/transactions/preauth/new"); request.Headers.Add("X-SOURCE", "COMERCIA"); var content = new StringContent("{\n \"amount\": 1,\n \"description\": \"billete sencillo\",\n \"tokenization\": {\n \"subscriptionId\": \"232023031702405\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}", null, "text/plain"); request.Content = content; var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync()); curl --location 'https:// 172.20.10.1:2011/v1/transactions/preauth/new' \ --header 'X-SOURCE: COMERCIA' \ --data '{ "amount": 1, "description": "billete sencillo", "tokenization": { "subscriptionId": "232023031702405", "token": "490727200336944988668125853538957465289310483021", "codeOfUse": "C", "customerId": "123456789" } }' import requests url = "https:// 172.20.10.1:2011/v1/transactions/preauth/new" payload = "{\n \"amount\": 1,\n \"description\": \"billete sencillo\",\n \"tokenization\": {\n \"subscriptionId\": \"232023031702405\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}" headers = { 'X-SOURCE': 'COMERCIA' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) let parameters = "{\n \"amount\": 1,\n \"description\": \"billete sencillo\",\n \"tokenization\": {\n \"subscriptionId\": \"232023031702405\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}" let postData = parameters.data(using: .utf8) var request = URLRequest(url: URL(string: "https:// 172.20.10.1:2011/v1/transactions/preauth/new")!,timeoutInterval: Double.infinity) request.addValue("COMERCIA", forHTTPHeaderField: "X-SOURCE") request.httpMethod = "POST" request.httpBody = postData let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data else { print(String(describing: error)) return } print(String(data: data, encoding: .utf8)!) } task.resume() Puedes ver más ejemplos de lenguajes de programación en nuestra colección Postman. Este es el JSON de la respuesta y sus encabezados: Cuerpo Encabezados { "orderId": "tx-00000001", "resultCode": 0, "resultMessage": "ACEPTADA", "ticket": { "AID": "", "ARC": "00", "ATC": "", "PSN": "", "Amount": "300", "Authorization": "847650", "CardBank": "Comercia Global Payments", "CardHolder": "", "CardIssuer": "VISA VISA CASH-CLASSIC", "CardNumber": "************2825", "CardTechnology": 3, "CardType": "", "Currency": "EUR", "Date": "20230202", "Id": "187782", "Language": "es", "Location": "BARCELONA", "MerchantId": "329811087", "MerchantName": "Comercia Global Payments PRUEBAS", "Modifiers": [], "OriginalTransactionDate": "", "OriginalTransactionId": "", "PinIndicator": 0, "SignatureIndicator": 0, "Status": "0", "Templates": [], "TerminalId": "00000021", "Time": "1541", "Type": "Payment" }, "tokenization": { "tokenizerCode": "0" } } Content–Type application/json Date Thu, 3 Feb 2023 22:07:12 GMT Access-Control-Allow-Origin * Access-Control-Allow-Credentials true Connection keep-alive Content-Encoding gzip Transfer-Encoding chunked POST PreAuthorization Complete with Token (Pre-autorización completa con Token) Esta solicitud inicia el cierre de una transacción de una pre-autorización anterior. Se envía a: https:// 172.20.10.1:2011/v1/transactions/preauth/complete Petición Payload amount: Número decimal positivo. Contiene la cantidad de la transacción, la parte decimal está separada por un punto ( . ). transactionId: Cadena de dígitos decimales. Identifica el ID de transacción anterior que se desea reembolsar. transactionDate: Cadena. Representa la fecha original de la transacción de autorización previa en el formato: YYYYMMDDHHMM orderId (opcional): Cadena. Un número de pedido/factura/referencia es un valor asignado por la aplicación del cliente que está asociado a la transacción pero que no se pasa en la solicitud de transacción al banco (por lo que no está asociado en los registros bancarios con la transacción). En general, se espera que este parámetro sea único. description (opcional): Cadena. Es un valor asignado por la app cliente que se asocia al concepto de la transacción y se muestra en pantalla junto con la cantidad de la transacción. tokenization: Tokenización. Solicitud de objeto de tokenización. ENCABEZADOS X-SOURCE COMERCIA ID de la aplicación de petición que identifica de forma exclusiva la aplicación que origina la solicitud de API. Body raw (json) { "transactionId": "188273", "transactionDate": "202302032307", "amount": 1, "orderId": "tx-00000001", "description": "billete sencillo", "tokenization": { "subscriptionId": "232023031702405", "token": "490727200336944988668125853538957465289310483021", "codeOfUse": "C", "customerId": "123456789" } } Estos son ejemplos de petición y respuesta de POST Pre-autorización completa con token. Aquí tienes los ejemplos en algunos lenguajes de programación. JavaScript - Fetch C# - HttpClient cURL - cURL Python - Requests Swift - URLSession Otros lenguajes var myHeaders = new Headers(); myHeaders.append("X-SOURCE", "COMERCIA"); var raw = "{\n \"transactionId\": \"188273\",\n \"transactionDate\": \"202302032307\",\n \"amount\": 1,\n \"orderId\": \"tx-00000001\",\n \"description\": \"billete sencillo\",\n \"tokenization\": {\n \"subscriptionId\": \"232023031702405\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}"; var requestOptions = { method: 'POST', headers: myHeaders, body: raw, redirect: 'follow' }; fetch("https:// 172.20.10.1:2011/v1/transactions/preauth/complete", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error)); var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, "https:// 172.20.10.1:2011/v1/transactions/preauth/complete"); request.Headers.Add("X-SOURCE", "COMERCIA"); var content = new StringContent("{\n \"transactionId\": \"188273\",\n \"transactionDate\": \"202302032307\",\n \"amount\": 1,\n \"orderId\": \"tx-00000001\",\n \"description\": \"billete sencillo\",\n \"tokenization\": {\n \"subscriptionId\": \"232023031702405\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}", null, "text/plain"); request.Content = content; var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync()); curl --location 'https:// 172.20.10.1:2011/v1/transactions/preauth/complete' \ --header 'X-SOURCE: COMERCIA' \ --data '{ "transactionId": "188273", "transactionDate": "202302032307", "amount": 1, "orderId": "tx-00000001", "description": "billete sencillo", "tokenization": { "subscriptionId": "232023031702405", "token": "490727200336944988668125853538957465289310483021", "codeOfUse": "C", "customerId": "123456789" } }' import requests url = "https:// 172.20.10.1:2011/v1/transactions/preauth/complete" payload = "{\n \"transactionId\": \"188273\",\n \"transactionDate\": \"202302032307\",\n \"amount\": 1,\n \"orderId\": \"tx-00000001\",\n \"description\": \"billete sencillo\",\n \"tokenization\": {\n \"subscriptionId\": \"232023031702405\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}" headers = { 'X-SOURCE': 'COMERCIA' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) let parameters = "{\n \"transactionId\": \"188273\",\n \"transactionDate\": \"202302032307\",\n \"amount\": 1,\n \"orderId\": \"tx-00000001\",\n \"description\": \"billete sencillo\",\n \"tokenization\": {\n \"subscriptionId\": \"232023031702405\",\n \"token\": \"490727200336944988668125853538957465289310483021\",\n \"codeOfUse\": \"C\",\n \"customerId\": \"123456789\"\n }\n}" let postData = parameters.data(using: .utf8) var request = URLRequest(url: URL(string: "https:// 172.20.10.1:2011/v1/transactions/preauth/complete")!,timeoutInterval: Double.infinity) request.addValue("COMERCIA", forHTTPHeaderField: "X-SOURCE") request.httpMethod = "POST" request.httpBody = postData let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data else { print(String(describing: error)) return } print(String(data: data, encoding: .utf8)!) } task.resume() Puedes ver más ejemplos de lenguajes de programación en nuestra colección Postman. Este es el JSON de la respuesta y sus encabezados: Cuerpo Encabezados { "orderId": "tx-00000001", "resultCode": 0, "resultMessage": "ACEPTADA", "ticket": { "AID": "", "ARC": "00", "ATC": "", "PSN": "", "Amount": "100", "Authorization": "94450 ", "CardBank": "Comercia Global Payments", "CardHolder": "", "CardIssuer": "VISA VISA CASH-CLASSIC", "CardNumber": "************2825", "CardTechnology": 3, "CardType": "", "Currency": "EUR", "Date": "20230203", "Id": "188274", "Language": "es", "Location": "BARCELONA", "MerchantId": "329811087", "MerchantName": "Comercia Global Payments PRUEBAS", "Modifiers": [], "OriginalTransactionDate": "20230203", "OriginalTransactionId": "188273", "PinIndicator": 0, "SignatureIndicator": 0, "Status": "0", "Templates": [], "TerminalId": "00000021", "Time": "2309", "Type": "PreauthorizationConfirmation" }, "tokenization": { "tokenizerCode": "0" } } Content–Type application/json Date Thu, 3 Feb 2023 22:09:51 GMT Access-Control-Allow-Origin * Access-Control-Allow-Credentials true Connection keep-alive Content-Encoding gzip Transfer-Encoding chunked