Con la integración de Cash Out, tu Medio de Pago adquirirá la capacidad de generar referencias Cash Out en forma de referencia numérica que tus usuarios podrán usar para realizar retiros de efectivo en los puntos de venta de la red Cash Out by dapp®.
En esta documentación encontrarás toda la información necesaria para:
Te recomendamos ir a la sección de Glosario antes de continuar para que te familiarices con los términos que usamos en esta documentación.
En caso de tener alguna duda, estaremos felices de ayudarte a través del botón de contacto que se encuentra en cada una de las secciones de esta documentación.
dapp® cuenta con un sandbox para poder realizar pruebas durante el desarrollo.
Las URL base para cada ambiente son las siguientes:
Sandbox:
https://wallets-sandbox.dapp.mx/v2/
Producción:
https://wallets.dapp.mx/v2/
dapp® utiliza "Basic Access Authentication" para el REST API, usando el API KEY como usuario y dejando el password vacío.
También debe incluirse el header “User-Agent” de lo contrario se rechazará la petición con un código 403, se recomienda incluir un nombre distintivo y un número de versión de aplicación, sin embargo cualquier valor será aceptado, ejemplo:
“User-Agent”: “MiIntegracion1.0”
curl --location --request GET 'https://wallets-sandbox.dapp.mx/v2' \ --header 'User-Agent: MiIntegracion1.0' \ --header 'Authorization: Basic eW91ci1hcGkta2V5Og=='
var request = new RestRequest(Method.GET); request.AddHeader("User-Agent", "MiIntegracion1.0"); request.AddHeader("Authorization", "Basic eW91ci1hcGkta2V5Og==");
Request request = new Request.Builder() .url("https://wallets-sandbox.dapp.mx/v2") .method("GET", null) .addHeader("User-Agent", "MiIntegracion1.0") .addHeader("Authorization", "Basic eW91ci1hcGkta2V5Og==")
url = "https://wallets-sandbox.dapp.mx/v2" payload={} headers = { 'Authorization': 'Basic eW91ci1hcGkta2V5Og==', 'User-Agent': 'MiIntegracion1.0', } response = requests.request("GET", url, headers=headers, data=payload)
$curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => "https://wallets-sandbox.dapp.mx/v2", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => [ "Authorization: Basic eW91ci1hcGkta2V5Og==", "User-Agent: MiIntegracion1.0" ], ]); $response = curl_exec($curl); curl_close($curl);
Para generar una referencia numérica con la que el usuario podrá realizar una transacción de Cash In o Cash Out se debe usar el siguiente endpoint.
/cashout/references
https://wallets-sandbox.dapp.mx/v2/cashout/references
POST
Parámetro |
Descripción |
Requerido u opcional |
---|---|---|
amount |
Monto de la referencia. |
Requerido |
expiration_minutes |
Tiempo de expiración de la referencia. Por default toma el valor de un día. |
Opcional |
name |
Nombre del usuario. |
Opcional |
|
Correo electrónico del usuario. |
Opcional |
phone |
Teléfono del usuario. |
Opcional |
custom_data |
Permite añadir un dato propio, como un folio, ID, para facilitar la conciliación de transacciones. |
Opcional |
curl --location 'https://wallets-sandbox.dapp.mx/v2/cashout/references' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic MjY3NDMyMTktOGIxNi00ZWI3LTk4Y2ItMzRkM2I2ZjEzNzlkOg==' \ --data-raw '{ "amount": 100.0, "expiration_minutes": 60, "name": "User name", "email": "user@mail.com", "phone": "1234567890", "custom_data": "Mifolio" }'
var client = new RestClient("https://wallets-sandbox.dapp.mx/v2/cashout/references"); client.Timeout = -1; var request = new RestRequest(Method.POST); request.AddHeader("Content-Type", "application/json"); request.AddHeader("Authorization", "Basic MjY3NDMyMTktOGIxNi00ZWI3LTk4Y2ItMzRkM2I2ZjEzNzlkOg=="); var body = @"{" + "\n" + @" ""amount"": 100.0," + "\n" + @" ""expiration_minutes"": 60," + "\n" + @" ""name"": ""User name""," + "\n" + @" ""email"": ""user@mail.com""," + "\n" + @" ""phone"": ""1234567890""," + "\n" + @" ""custom_data"": ""Mifolio"" + "\n" + @"}"; request.AddStringBody(body, DataFormat.Json); RestResponse response = await client.ExecuteAsync(request);
OkHttpClient client = new OkHttpClient().newBuilder() .build(); MediaType mediaType = MediaType.parse("application/json"); RequestBody body = RequestBody.create(mediaType, "{\n \"amount\": 100.0,\n \"expiration_minutes\": 60,\n \"name\": \"User name\",\n \"email\": \"user@mail.com\",\n \"phone\": \"1234567890\",\n \"custom_data\": \"Mifolio\"\n}"); Request request = new Request.Builder() .url("https://wallets-sandbox.dapp.mx/v2/cashout/references") .method("POST", body) .addHeader("Content-Type", "application/json") .addHeader("Authorization", "Basic MjY3NDMyMTktOGIxNi00ZWI3LTk4Y2ItMzRkM2I2ZjEzNzlkOg==") .build(); Response response = client.newCall(request).execute();
import requests import json url = "https://wallets-sandbox.dapp.mx/v2/cashout/references" payload = json.dumps({ "amount": 100, "expiration_minutes": 60, "name": "User name", "email": "user@mail.com", "phone": "1234567890", "custom_data": "Mifolio" }) headers = { 'Content-Type': 'application/json', 'Authorization': 'Basic MjY3NDMyMTktOGIxNi00ZWI3LTk4Y2ItMzRkM2I2ZjEzNzlkOg==' } response = requests.request("POST", url, headers=headers, data=payload)
$curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://wallets-sandbox.dapp.mx/v2/cashout/references', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS =>'{ "amount": 100.0, "expiration_minutes": 60, "name": "User name", "email": "user@mail.com", "phone": "1234567890", "custom_data": "Mifolio" }', CURLOPT_HTTPHEADER => array( 'Content-Type: application/json', 'Authorization: Basic MjY3NDMyMTktOGIxNi00ZWI3LTk4Y2ItMzRkM2I2ZjEzNzlkOg==' ), )); $response = curl_exec($curl); curl_close($curl);
{
"rc": 0,
"msg": "Ok",
"data": {
"reference": "21004040000000000090",
"creation_date": "2020-11-04T18:13:46.613399-06:00",
"expiration_date": "2020-11-04T19:13:46.613399-06:00",
"amount": 100.0,
"currency": "MXN"
}
}
Parámetro |
Descripción |
---|---|
reference |
Número de referencia que presentará el usuario al cajero para realizar la operación. |
creation_date |
Indica la fecha de creación. |
expiration_date |
Especifica la fecha de vencimiento de la referencia. |
amount |
Indica el monto de la referencia. |
currency |
Especifica la moneda. |
Para cancelar una referencia numérica se debe usar el siguiente endpoint
/cashout/references/{reference_number}
https://wallets-sandbox.dapp.mx/v2/cashout/references/{reference_number}
DELETE
https://wallets-sandbox.dapp.mx/v2/references/xxxxxxxxx
curl --location --request DELETE 'https://wallets-sandbox.dapp.mx/v2/cashout/references/{reference_number}' \ --header 'Authorization: Basic MjY3NDMyMTktOGIxNi00ZWI3LTk4Y2ItMzRkM2I2ZjEzNzlkOg=='
var client = new RestClient("https://wallets-sandbox.dapp.mx/v2/cashout/references/{reference_number}"); client.Timeout = 60; var request = new RestRequest(Method.Delete); request.AddHeader("Authorization", "Basic MjY3NDMyMTktOGIxNi00ZWI3LTk4Y2ItMzRkM2I2ZjEzNzlkOg=="); IRestResponse response = client.Execute(request);
OkHttpClient client = new OkHttpClient().newBuilder() .build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = RequestBody.create(mediaType, ""); Request request = new Request.Builder() .url("https://wallets-sandbox.dapp.mx/v2/cashout/references/{reference_number}") .method("DELETE", body) .addHeader("Authorization", "Basic MjY3NDMyMTktOGIxNi00ZWI3LTk4Y2ItMzRkM2I2ZjEzNzlkOg==") .build(); Response response = client.newCall(request).execute();
import requests url = "https://wallets-sandbox.dapp.mx/v2/cashout/references/{reference_number}" payload = {} headers = { 'Authorization': 'Basic MjY3NDMyMTktOGIxNi00ZWI3LTk4Y2ItMzRkM2I2ZjEzNzlkOg==' } response = requests.request("DELETE", url, headers=headers, data=payload)
$curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://wallets-sandbox.dapp.mx/v2/cashout/references/{reference_number}', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'DELETE', CURLOPT_HTTPHEADER => array( 'Authorization: Basic MjY3NDMyMTktOGIxNi00ZWI3LTk4Y2ItMzRkM2I2ZjEzNzlkOg==' ), )); $response = curl_exec($curl); curl_close($curl);
{
"rc": 0,
"msg": "Ok"
}
El wallet debe exponer un servicio que acepte peticiones donde Dapp le confirmará que se ha realizado una transacción de Cash Out.
{
"id": "2c2725ca-eada-426a-b928-8bb851128059",
"reference": "20004042284511626341",
"amount": 100.0,
"fee": 10.0,
"total": 110.0,
"currency": "MXN",
"merchant": "Farmacias del Ahorro",
"date": "2020-11-04T18:13:46.613399-06:00",
"refunded": false,
"merchant_id": "113a5209-27eb-474b-b08d-62c3819d4350",
"store_id": "dbdcbe47-b07c-4cf0-b125-fd92b5cef570",
"custom_data": "Mifolio",
"security": {
"key": "2c2725caeada426ab9288bb851128059",
"version": 1,
"signature": "L1Xb1RFcDjai0QB7ZZT0+iQC4VyIoF861FBFPlU4z2PEhwkUa1YYGIbHqSk5kyXzReimDkwedhbSldBKAJFrUlGb6mhepGszb4hCNLTcPnKwZIT+vQWOQmx6aXjIHE27qQe537NNfODWF26RBgCDonQQjHKfaUrKYWaCy/kT2bWh4uIedaInmEfuEf9/rnPVY8pJXHAkkFSXIwb8f2+PdNyciJACb5TAYiTRortXNKpAteeo9SFiW83o7I4FKlfpaFf+R37piyRrdS6/McnOLOHYx6pQVzuVOeyJZ1ea0m0FD2kRf/wPAGazqT7ix47mO206IEt5+tHIxHPgBKoRbQ=="
}
}
Parámetro |
Descripción |
---|---|
reference |
Indica el número de referencia. |
amount |
Indica el monto de la referencia. |
fee |
Indica el monto de la comisión. |
total |
Específica el monto total del pago. |
currency |
Especifica la moneda. |
merchant |
Indica el nombre del comercio donde se realizó la operación. |
date |
Indica la fecha de la transacción. |
refunded |
Especifica si la transacción ha sido reembolsada o no. |
merchant_id |
Id del comercio. |
store_id |
Id dapp de la sucursal. |
custom_data |
Dato propio, como un folio, ID, para facilitar la conciliación de transacciones. |
El JSON de la petición contiene una firma digital como método de autenticación. El nombre de la llave utilizada para la firma se envía dentro del campo key con un hash MD5. La firma consiste en una cadena formada por los campos id, reference, amount, fee, currency, refunded, date separados por pipes con una función hash SHA-512.
2c2725ca-eada-426a-b928-8bb851128059|20004042284511626341|100.0|10.0|MXN|false|2020-11-04T18:13:46.613399-06:00
Las llaves públicas que se deben utilizar para validar las firmas de las peticiones de Cash Out se pueden obtener en el siguiente enlace:
https://media.dapp.mx/sw/dapp_public_keys.zip
Una vez que el wallet valide la veracidad de la firma y confirme que el usuario cuenta con los fondos suficientes para realizar la operación, deberá regresar como respuesta un objeto JSON con los campos rc y msg.
rc |
msg |
---|---|
0 |
Operación exitosa |
-10 |
Referencia inválida |
-11 |
Referencia ya utilizada |
-12 |
Referencia cancelada |
-13 |
Monto de referencia no válido |
-20 |
Error de validación |
-21 |
Monto máximo por limite de transacciones |
-22 |
Límite de número de transacciones |
-23 |
Monto límite de la cuenta |
-30 |
Servicio no disponible |
-40 |
Fondos insuficientes |
-50 |
Transacción ya procesada |
-99 |
Otro |
static void Main(string[] args) { var cadena = "3c6f084f-3949-4236-a0bc-d85ff9e05495|MXN|10.0|Pago de prueba QR 5|Prueba 5|2021-06-07T17:04:56.900046+00:00"; var cadenaBytes = Encoding.UTF8.GetBytes(cadena); var firma = "hxkqkKaar5jstZMJeCK3Bv3IByGOZrVyb9t+kt1hEL7pt/FrvxATuc+9b/95lkqkeVSnK98/cD0xSs0p2fdkAhskHZJTHbTWu3bbNHWBpIXmqnRNzuhi7zP+tmwsaGJ830o1BL5Vyq5rvqq4ll/ILkJVCEbru4VwE/+0W7OWiETV4Nqe6M9Yhu09/+GtW0KCAgVaX8Yol3SgGGp8z6+T1WJ6hw6K5EIg34UfBujJzHfr+39LpBJvPO2JykGs1lwNrOaon+FYb8AzmVoRAu49VwJ380Gb3Wv6j1oy+O/8Ry3X0b8NY83JA9mdtz5/M0pIVvgqIcNjKH4KBuambSig1g=="; var firmaBytes = Convert.FromBase64String(firma); var fileStream = File.OpenText("../../../dapp_public_prod.pem"); var pemReader = new PemReader(fileStream); var keyParameter = (AsymmetricKeyParameter)pemReader.ReadObject(); ISigner signer = SignerUtilities.GetSigner("SHA-512withRSA"); signer.Init(false, keyParameter); signer.BlockUpdate(cadenaBytes, 0, cadenaBytes.Length); Console.WriteLine(signer.VerifySignature(firmaBytes)); }
import java.io.IOException; import java.math.BigInteger; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.security.InvalidKeyException; import java.security.KeyFactory; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Signature; import java.security.SignatureException; import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import java.util.List; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; public class dapp { public static String encryptThisString(String input) { try { // getInstance() method is called with algorithm SHA-512 MessageDigest md = MessageDigest.getInstance("SHA-512"); // digest() method is called // to calculate message digest of the input string // returned as array of byte byte[] messageDigest = md.digest(input.getBytes()); // Convert byte array into signum representation BigInteger no = new BigInteger(1, messageDigest); // Convert message digest into hex value String hashtext = no.toString(16); // Add preceding 0s to make it 32 bit while (hashtext.length() < 32) { hashtext = "0" + hashtext; } // return the HashText return hashtext; } // For specifying wrong message digest algorithms catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray(); public static String bytesToHex(byte[] bytes) { char[] hexChars = new char[bytes.length * 2]; for (int j = 0; j < bytes.length; j++) { int v = bytes[j] & 0xFF; hexChars[j * 2] = HEX_ARRAY[v >>> 4]; hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F]; } return new String(hexChars); } // Driver code public static void main(String args[]) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException, InvalidKeyException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException, NoSuchProviderException, SignatureException { String cadena = "3c6f084f-3949-4236-a0bc-d85ff9e05495|MXN|10.0|Pago de prueba QR 5|Prueba 5|2021-06-07T17:04:56.900046+00:00"; String signature = "hxkqkKaar5jstZMJeCK3Bv3IByGOZrVyb9t+kt1hEL7pt/FrvxATuc+9b/95lkqkeVSnK98/cD0xSs0p2fdkAhskHZJTHbTWu3bbNHWBpIXmqnRNzuhi7zP+tmwsaGJ830o1BL5Vyq5rvqq4ll/ILkJVCEbru4VwE/+0W7OWiETV4Nqe6M9Yhu09/+GtW0KCAgVaX8Yol3SgGGp8z6+T1WJ6hw6K5EIg34UfBujJzHfr+39LpBJvPO2JykGs1lwNrOaon+FYb8AzmVoRAu49VwJ380Gb3Wv6j1oy+O/8Ry3X0b8NY83JA9mdtz5/M0pIVvgqIcNjKH4KBuambSig1g=="; String publicKeyContent8 = null; String file8 = "resource/dapp_public_pk8_prod.pem"; Path path8 = Paths.get(file8); List<String> lines8 = Files.readAllLines(path8); publicKeyContent8 = lines8.toString().replaceAll("\\n", "").replace("[-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----]", "").replaceAll(", ", ""); KeyFactory kf8 = KeyFactory.getInstance("RSA"); X509EncodedKeySpec keySpecX5098 = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyContent8)); RSAPublicKey pubKey8 = (RSAPublicKey) kf8.generatePublic(keySpecX5098); final Signature sig = Signature.getInstance( "SHA512withRSA"); sig.initVerify( pubKey8 ); sig.update( cadena.getBytes("utf8") ); final byte[] signatureBytes = Base64.getDecoder().decode(signature); System.out.println("\n*Signature decode Base64*: " + bytesToHex(signatureBytes)); System.out.println("\n*Verificar*: " + sig.verify( signatureBytes )); } }
import base64 import os from Cryptodome.Hash import SHA512 from Cryptodome.PublicKey import RSA from Cryptodome.Signature import pkcs1_15 def test_signature(): cadena = "3c6f084f-3949-4236-a0bc-d85ff9e05495|MXN|10.0|Pago de prueba QR 5|Prueba 5|2021-06-07T17:04:56.900046+00:00" hash_cadena = SHA512.new(cadena.encode("utf-8")) signature = "hxkqkKaar5jstZMJeCK3Bv3IByGOZrVyb9t+kt1hEL7pt/FrvxATuc+9b/95lkqkeVSnK98/cD0xSs0p2fdkAhskHZJTHbTWu3bbNHWBpIXmqnRNzuhi7zP+tmwsaGJ830o1BL5Vyq5rvqq4ll/ILkJVCEbru4VwE/+0W7OWiETV4Nqe6M9Yhu09/+GtW0KCAgVaX8Yol3SgGGp8z6+T1WJ6hw6K5EIg34UfBujJzHfr+39LpBJvPO2JykGs1lwNrOaon+FYb8AzmVoRAu49VwJ380Gb3Wv6j1oy+O/8Ry3X0b8NY83JA9mdtz5/M0pIVvgqIcNjKH4KBuambSig1g==" b64_bytes = signature.encode("utf-8") byte_str = base64.b64decode(b64_bytes) path = os.path.join("MyPath", 'dapp_public_prod.pem') with open(path, 'r') as myfile: key_data = myfile.read() key = RSA.importKey(key_data) pkcs1_15.new(key).verify(hash_cadena, byte_str)
const CERT_FILE = './dapp_public_sb.pem'; $data = [ "id" => "cc6a08a8-af83-43dc-9e87-8eb229613d28", "reference" => "028993358468", "amount" => 15, "fee" => 0, "total" => 15, "currency" => "MXN", "refunded" => false, "date" => "2024-04-08T18:11:11.178713+00:00", "merchant" => "Test", "merchant_id" => "a04c7c5d-5821-4857-a6c6-8f3a62dd878b", "security" => [ "key" => "3d4612aef1abdeebc9947a04d16da838", "version" => 1, "signature" => "kVLfjiyrOvydVJecfUytGERZ9MoB45WORolaHAt+d7Y9splgbCIjPwnLbhqsNEurrtX2IpNAAsHtsyS1p+QHGg/1b72ERYE6AbRLXCb9GccgRe/LyGDF82EX0lw13nxDof9eCceD7CFx7SbIhbXmkpqeitljUMUAT118KUden6+YuSLoTf9kNfkqJeWLW34NcvRf4YMbeKu7jjPESafnRSYlex/h6GnofntqS2+3J+hxDO1AlT3R2wjeMMVHKJXVOSHuJV8kQpA490LBV1WeZMbc9zWGJapvIWToVMIVyPsWQObXJbDmIf466bxuYkB+h/QHxD03kianu17RskpEBQ==" ] ]; $amount = preg_replace('/^(\d+\.\d)0$/', '\1', number_format($data['amount'], 2)); $fee = preg_replace('/^(\d+\.\d)0$/', '\1', number_format($data['fee'], 2)); $refunded = $data['refunded'] ? "true" : "false"; $original_string = $data['id'] . '|' . $data['reference'] . '|' . $amount. '|' . $fee . '|' . $data['currency'] . '|' . $refunded . '|' . $data['date']; if (isset($data['security'])) { $fp = fopen(CERT_FILE, "r"); $public_key_file = fread($fp, 8192); fclose($fp); $pkey_public = openssl_pkey_get_public($public_key_file); $signature_decoded = base64_decode($data['security']['signature']); $ok = openssl_verify($original_string, $signature_decoded, $pkey_public, OPENSSL_ALGO_SHA512); if ($ok == 0) { echo 'Cashout Firma invalida'; } else { echo 'Cashout Firma ok'; } }
En casos extraordinarios en los que la caja no pueda recibir la autorización del Cash Out debido a problemas de
conexión, la cadena enviará un reverso automático de la operación original para asegurarse de que la transacción
sea cancelada en caso de haber sido recibida por parte de dapp® y el Wallet.
En estos casos, dapp® realizará una petición al mismo endpoint al que se envió la notificación de Cash Out. El
contenido de la petición será el mismo que el de la operación original referente al Cash Out con el campo
refunded con un valor True, que servirá para indicar que la operación tuvo que ser
cancelada.
Para obtener la información de las tiendas cercanas a una ubicación se debe consumir el siguiente endpoint:
/stores
https://wallets-sandbox.dapp.mx/v2/stores
GET
No es necesario definir un formato raw-Json para body, hay que asignarle el valor ‘none’. De igual forma hay que especificar los parámetros y sus respectivos valores
|
KEY |
VALUE |
---|---|---|
|
latitude |
20.6714012 |
|
longitude |
-100.4379101 |
https://wallets-sandbox.dapp.mx/v2/stores?latitude=20.6714012&longitude=-100.4379101
Parámetro |
Descripción |
Requerido u opcional |
---|---|---|
latitude |
Latitud. |
Requerido |
longitude |
Longitud. |
Requerido |
radius |
Radio de búsqueda en km. |
Opcional |
product |
ID provisto por dapp. |
Opcional |
curl --location 'https://wallets-sandbox.dapp.mx/v2/stores?latitude=20.5684501&longitude=-103.4579542' \ --header 'Authorization: Basic eW91ci1hcGkta2V5Og=='
var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://wallets-sandbox.dapp.mx/v2/stores?latitude=20.5684501&longitude=-103.4579542"); request.Headers.Add("Authorization", "Basic eW91ci1hcGkta2V5Og=="); var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync());
OkHttpClient client = new OkHttpClient().newBuilder() .build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = RequestBody.create(mediaType, ""); Request request = new Request.Builder() .url("https://wallets-sandbox.dapp.mx/v2/stores?latitude=20.5684501&longitude=-103.4579542") .method("GET", body) .addHeader("Authorization", "Basic eW91ci1hcGkta2V5Og==") .build(); Response response = client.newCall(request).execute();
import requests url = "https://wallets-sandbox.dapp.mx/v2/stores?latitude=20.5684501&longitude=-103.4579542" payload={} headers = { 'Authorization': 'Basic eW91ci1hcGkta2V5Og==' } response = requests.request("GET", url, headers=headers, data=payload)
$curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => "https://wallets-sandbox.dapp.mx/v2/stores?latitude=20.5684501&longitude=-103.4579542", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => [ "Authorization: Basic eW91ci1hcGkta2V5Og==" ], ]); $response = curl_exec($curl); curl_close($curl);
{
"rc": 0,
"msg": "Ok",
"data": [
{
"latitude": 19.39431,
"longitude": -99.13871,
"address": "Alfonso XIII y Xola No. 18 , Álamos, 3400 Benito Juárez, Ciudad de México",
"phone": null,
"name": "Hidrosina IV",
"merchant": {
"id": "19f63cc4-58cc-46ce-9ebb-1aa84b654586",
"name": "Hidrosina IV",
"image": null,
"category": {
"id": 1,
"name": "Gasolineras"
},
"cashin_limit": 3000.0
},
"sample_qr": "https://media.dapp.mx/samples/dappicono.png"
},
{
"latitude": 19.45639,
"longitude": -99.12866,
"address": "Calz. Guadalupe n° 52, Ex Hipodromo de Peralvillo, 6250 Cuauhtémoc, Ciudad de México",
"phone": null,
"name": "Hidrosina XV",
"merchant": {
"id": "c66acfb0-6b76-482b-a411-4aafd6e737fb",
"name": "Hidrosina XV",
"image": null,
"category": {
"id": 1,
"name": "Gasolineras"
},
"cashin_limit": 3000.0
},
"sample_qr": "https://media.dapp.mx/samples/dappicono.png"
}
]
}
Sección |
Parámetro |
Descripción |
---|---|---|
latitude |
Valor de la latitud de la ubicación. |
|
longitude |
Valor de la longitud de la ubicación. |
|
address |
Dirección de la tienda. |
|
phone |
Teléfono de la tienda. |
|
name |
Nombre de la tienda. |
|
Merchant |
id |
Id del comercio. |
name |
Nombre del comercio. |
|
image |
Imagen del comercio. |
|
cashin_limit |
Monto límite de cashin |
|
Category |
id |
Id de la categoría. |
name |
Nombre de la categoría. |
Te dejamos aquí algunos términos relevantes definidos para facilitar la lectura y entendimiento de nuestras documentaciones.
Código de cobro:
Es el identificador único asignado a una transacción de cobro generada
por un comercio y que está asociado a ciertos parámetros específicos como Nombre del Comercio, Monto,
Moneda, Fecha, Lugar y Hora, entre otros. Un código de cobro puede ser representado como un Código QR para
ser escaneado por el cliente, o ser transferido a un dispositivo móvil a través de un deep link o una
notificación push.
Código QR:
Un código de respuesta rápida (o Código QR) es una representación gráfica
bidimensional de una cadena de texto generado por que generalmente se asocia a un código de cobro.
Código QR dinámico:
Es aquél Código QR asociado a un solo código de cobro y a una sola
transacción única y diferenciable. Sus parámetros pueden tomar valores distintos en cada transacción. Cada
Código QR se verá distinto a los demás ya que representará una cadena de texto distinta.
Código QR estático:
Es aquél Código QR que luce permanentemente igual ya que siempre
representa una misma cadena de texto. Este tipo de códigos son útiles cuando los parámetros asociados a los
códigos de cobro son siempre iguales. Dado que la representación gráfica no cambia, estos códigos pueden ser
impresos y usados múltiples veces para pagar un mismo código de cobro.
Referencia Cash in:
Es un código alfanumérico asociado a una transacción de pago en
efectivo, ya sea para realizar un depósito de efectivo, para realizar un pago de servicios, para realizar el
pago en efectivo de una orden de comercio electrónico, o cualquier otra operación equivalente. Las
referencias Cash In están siempre asociadas a parámetros específicos como Monto, Fecha, Hora, entre otros, y
son generadas a petición del usuario cuando este desea realizar una operación de este tipo.
Súmate a la revolución.
Intégrate ahora.