dapp
Pagos Moviles

Con la integración de Cash In, tu Medio de Pago adquirirá la capacidad de generar referencias Cash In en forma de Códigos QR o números de referencia que tus usuarios podrán usar para realizar depósitos de efectivo en los puntos de venta de la red Cash In by dapp®.

En esta documentación encontrarás toda la información necesaria para:

  • Generación de referencia
  • Cancelación de referencia
  • Recibir notificación de Cash In

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.

Paso a Paso
Ambientes

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/
Autenticación

dapp® utiliza "Basic Access Authentication" para el REST API, usando el API KEY como usuario y dejando el password vacío.


curl --location --request GET 'https://wallets-sandbox.dapp.mx/v2' \
--header 'Authorization: Basic eW91ci1hcGkta2V5Og=='
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Basic eW91ci1hcGkta2V5Og==");
Request request = new Request.Builder()
  .url("https://wallets-sandbox.dapp.mx/v2")
  .method("GET", null)
  .addHeader("Authorization", "Basic eW91ci1hcGkta2V5Og==")
url = "https://wallets-sandbox.dapp.mx/v2"

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",
  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);
Seguridad

Las llaves públicas que se deben utilizar para validar las firmas de las peticiones de Cash In se pueden obtener en el siguiente enlace:


https://media.dapp.mx/sw/dapp_public_keys.zip
Generación de referencia numérica

Para poder realizar un Cash In, el usuario primero debe haber generado una referencia numérica que presentará en la caja.
Para generar esta referencia, se debe consumir el siguiente endpoint:

/cashin/references/

Url completa en sandbox:
https://wallets-sandbox.dapp.mx/v2/cashin/references/

Método HTTP
POST

Parámetros Aceptados

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

email

Correo electrónico del usuario.

Opcional

phone

Teléfono del usuario.

Opcional

source

Tipo de referencia.

Opcional



Ejemplos de código
curl --location --request POST 'https://wallets-sandbox.dapp.mx/v2/cashin/references/' \
--header 'Authorization: Basic eW91ci1hcGkta2V5Og==' \
--header 'Content-Type: application/json' \
--data-raw '{
    "amount": 150,
    "expiration_minutes": 1440
}'
var client = new RestClient("https://wallets-sandbox.dapp.mx/v2/cashin/references/");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Basic eW91ci1hcGkta2V5Og==");
request.AddHeader("Content-Type", "application/json");
var body = @"{" + "\n" +
@"    ""amount"": 150," + "\n" +
@"    ""expiration_minutes"": 1440" + "\n" +
@"}";
request.AddParameter("application/json", body,  ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n \"amount\": 150,\n    \"expiration_minutes\": 1440\n}");
Request request = new Request.Builder()
  .url("https://wallets-sandbox.dapp.mx/v2/cashin/references/")
  .method("POST", body)
  .addHeader("Authorization", "Basic eW91ci1hcGkta2V5Og==")
  .addHeader("Content-Type", "application/json")
  .build();
Response response = client.newCall(request).execute();

import requests
import json

url = "https://wallets-sandbox.dapp.mx/v2/cashin/references/"

payload = json.dumps({
  "amount": 150,
  "expiration_minutes": 1440
})
headers = {
  'Authorization': 'Basic eW91ci1hcGkta2V5Og==',
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://wallets-sandbox.dapp.mx/v2/cashin/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": 150,
    "expiration_minutes": 1440
  }',
  CURLOPT_HTTPHEADER => array(
    'Authorization: Basic eW91ci1hcGkta2V5Og==',
    'Content-Type: application/json',
  ),
));

$response = curl_exec($curl);

curl_close($curl);
Ejemplo de respuesta:
{ "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ámetros devueltos:

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.


Cancelación de referencia numérica

Para cancelar una referencia numérica se debe usar el siguiente endpoint.

/cashin/references/{reference_number}

Url completa en sandbox:
https://wallets-sandbox.dapp.mx/v2/cashin/references/{reference_number}

Método HTTP
DELETE

Ejemplos de código
curl --location --request DELETE 'https://wallets-sandbox.dapp.mx/v2/cashin/references/{REFERENCE_NUMBER}' \
--header 'Authorization: Basic eW91ci1hcGkta2V5Og=='
var client = new RestClient("https://wallets-sandbox.dapp.mx/v2/cashin/references/{REFERENCE_NUMBER}");
client.Timeout = -1;
var request = new RestRequest(Method.DELETE);
request.AddHeader("Authorization", "Basic eW91ci1hcGkta2V5Og==");
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/cashin/references/{REFERENCE_NUMBER}")
  .method("DELETE", body)
  .addHeader("Authorization", "Basic eW91ci1hcGkta2V5Og==")
  .build();
Response response = client.newCall(request).execute();
import requests

url = "https://wallets-sandbox.dapp.mx/v2/cashin/references/{REFERENCE_NUMBER}"

headers = {
  'Authorization': 'Basic eW91ci1hcGkta2V5Og=='
}

response = requests.request("DELETE", url, headers=headers)
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://wallets-sandbox.dapp.mx/v2/cashin/references/{REFERENCE_NUMBER}",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "DELETE",
  CURLOPT_HTTPHEADER => [
    "Authorization: Basic eW91ci1hcGkta2V5Og=="
  ],
]);

$response = curl_exec($curl);

curl_close($curl);
Respuesta de ejemplo:
{ "rc": 0, "msg": "Ok" }
Recibir notificación de Cash In

El wallet debe exponer un servicio que acepte peticiones donde dapp® le notificará que se ha realizado una transacción de Cash In. Una vez que el cajero haya capturado la referencia presentada por el usuario, dapp enviará esta notificación.

Petición de ejemplo
{ "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, "security":{ "key":"2c2725caeada426ab9288bb851128059", "version":1, "signature":"L1Xb1RFcDjai0QB7ZZT0+iQC4VyIoF861FBFPlU4z2PEhwkUa1YYGIbHqSk5kyXzReimDkwedhbSldBKAJFrUlGb6mhepGszb4hCNLTcPnKwZIT+vQWOQmx6aXjIHE27qQe537NNfODWF26RBgCDonQQjHKfaUrKYWaCy/kT2bWh4uIedaInmEfuEf9/rnPVY8pJXHAkkFSXIwb8f2+PdNyciJACb5TAYiTRortXNKpAteeo9SFiW83o7I4FKlfpaFf+R37piyRrdS6/McnOLOHYx6pQVzuVOeyJZ1ea0m0FD2kRf/wPAGazqT7ix47mO206IEt5+tHIxHPgBKoRbQ==", } }

Parámetros Devueltos

Parámetro

Descripción

reference

Indica el número de referencia.

amount

Indica el monto asociado a la referencia.

fee

Indica el monto de comisión.

total

Especifica el monto total del pago realizado por el usuario.

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 cancelada o no.



El JSON de la petición contiene una firma digital como método de autenticación. 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.

Ejemplo de cadena antes del hash:

2c2725ca-eada-426a-b928-8bb851128059|20004042284511626341|100.0|10.0|MXN|false|2020-11-04T18:13:46.613399-06:00

Una vez que el wallet valide la veracidad de la firma, deberá regresar como respuesta un objeto JSON con los campos rc y msg.

Valores predefinidos

rc

msg

0

Operación exitosa

-10

Referencia inválida

-20

Error de validación

-30

Servicio no disponible

-99

Otro

Reversos

En casos extraordinarios en los que la caja no pueda recibir la autorización del Cash In 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 In. El contenido de la petición será el mismo que el de la operación original referente al Cash In con el campo refunded con un valor True, que servirá para indicar que la operación tuvo que ser cancelada.



Ejemplos de código
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';
    }
}
Obtener ubicación de tiendas

Para obtener la información de las tiendas cercanas a una ubicación se debe consumir el siguiente endpoint:

/stores

Url completa en sandbox:
https://wallets-sandbox.dapp.mx/v2/stores

Método HTTP
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



Ejemplo completo de URL:
https://wallets-sandbox.dapp.mx/v2/stores?latitude=20.6714012&longitude=-100.4379101

Parámetros Aceptados

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



Ejemplos de código
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);
Respuesta de ejemplo:
{ "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" }, "type": 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" }, "type": 0 }, "sample_qr": "https://media.dapp.mx/samples/dappicono.png" }, ] }
Parámetros devueltos:

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.

Category

id

Id de la categoría.

name

Nombre de la categoría.

type

Indica el tipo de comercio. Recibe 1 = Regular, 2 = Gasolinera, 3 = Grandes superficies.


Glosario

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.

Súmate a la revolución.
Intégrate ahora.

Quiero Integrarme
Es la forma de contacto, ingresa un correo correcto
El número debe de ser de al menos 10 dígitos







Olvidé mi contraseña