La PWA de MishiPay multiplie ses transactions par 10 et économise 2,5 ans de mise en file d'attente

Découvrez comment MishiPay a aidé son entreprise à passer à PWA.

MishiPay permet aux acheteurs de scanner leurs achats et de les payer avec leur smartphone, plutôt que de temps à faire la file d’attente à la caisse. Avec le service Scanner et Go, les acheteurs peuvent scanner le code-barres d'un article avec leur téléphone et les payer, puis se contenter le magasin. Des études révèlent que la mise en file d'attente en magasin coûte environ 200 milliards de dollars par an au secteur du commerce mondial.

Notre technologie repose sur les capacités matérielles des appareils, comme les capteurs et les appareils photo GPS qui permettent les utilisateurs peuvent localiser les magasins équipés de MishiPay, scanner le code-barres des articles dans le magasin physique, puis payer en utilisant le mode de paiement numérique de son choix. Les versions initiales de notre Technologie Go étaient des applications iOS et Android propres à chaque plate-forme, et les premiers utilisateurs ont adoré cette technologie. Lue pour découvrir comment le passage à une PWA a permis de multiplier par 10 les transactions et d'économiser 2,5 années en file d'attente !

    10×

    Augmentation du nombre de transactions

    2 ans et demi

    Mise en file d'attente enregistrée

Défi

Les utilisateurs trouvent notre technologie extrêmement utile lors de la file d'attente ou de la file d'attente, car elle leur permet d'éviter la file d'attente et de bénéficier d'une expérience fluide en magasin. Mais le téléchargement d'un logiciel Pour Android ou iOS, les utilisateurs n'ont pas choisi notre technologie, malgré son intérêt. C'était un nombre croissant pour MishiPay, il nous fallait augmenter l'adoption par les utilisateurs avec un seuil d'entrée plus bas.

Solution

Nos efforts pour créer et lancer la PWA nous ont permis de simplifier l'installation et encouragé les nouveaux utilisateurs à essayer notre technologie dans un magasin physique, à éviter la file d'attente et à bénéficier une expérience d'achat fluide. Depuis le lancement, nous avons constaté un pic massif d’adoption par les utilisateurs avec par rapport à nos applications spécifiques à la plate-forme.

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph> Comparaison côte à côte du lancement direct de la PWA (vers la gauche, plus rapide) et de l'installation et du lancement de l'application Android (à droite, plus lent).
<ph type="x-smartling-placeholder">
</ph> Transactions par plate-forme ¡OS: 16397 (3,98%). Android: 13769 (3,34%). Web: 382184 (92,68%). <ph type="x-smartling-placeholder">
</ph> La majorité de toutes les transactions sont effectuées sur le Web.

Analyse technique approfondie

Localiser les magasins dans lesquels MishiPay est activé

Pour activer cette fonctionnalité, nous nous appuyons sur getCurrentPosition() et une solution de remplacement basée sur les adresses IP.

const geoOptions = {
  timeout: 10 * 1000,
  enableHighAccuracy: true,
  maximumAge: 0,
};

window.navigator.geolocation.getCurrentPosition(
  (position) => {
    const cords = position.coords;
    console.log(`Latitude :  ${cords.latitude}`);
    console.log(`Longitude :  ${cords.longitude}`);
  },
  (error) => {
    console.debug(`Error: ${error.code}:${error.message}`);
    /**
     * Invoke the IP based location services
     * to fetch the latitude and longitude of the user.
     */
  },
  geoOptions,
);

Cette approche fonctionnait bien dans les versions précédentes de l'application, mais s'est révélée très fastidieuse par la suite. pour les utilisateurs de MishiPay pour les raisons suivantes:

  • Imprécisions de localisation dans les solutions de remplacement basées sur l'adresse IP.
  • De plus en plus de magasins acceptant MishiPay sont proposés dans chaque région, identifier le magasin approprié.
  • Les utilisateurs choisissent parfois par erreur le mauvais magasin, ce qui entraîne l'enregistrement des achats. de manière incorrecte.

Pour résoudre ces problèmes, nous avons intégré un code QR géolocalisé unique sur les présentoirs en magasin pour chaque Google Store. Cela a permis une intégration plus rapide. Les utilisateurs scannent simplement le code QR géolocalisé codes imprimés sur les supports marketing présents dans les magasins pour accéder au Application Web Go. Ainsi, ils n'auront pas à saisir l'adresse Web mishipay.shop pour accéder au service.

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph> Expérience de numérisation en magasin avec la PWA

Analyser des produits

L'une des fonctionnalités essentielles de l'application MishiPay est la lecture de codes-barres, car elle permet à nos utilisateurs de scanner leurs ses propres achats et de voir le total cumulé avant même qu'il n'atteigne un solde registre.

Pour créer une expérience d'analyse sur le Web, nous avons identifié trois couches principales.

Schéma illustrant les trois principales couches de thread: le flux vidéo, la couche de traitement et la couche de décodeur.

Flux vidéo

Grâce au getUserMedia(), nous peut accéder à la caméra arrière de l'utilisateur selon les contraintes indiquées ci-dessous. Appeler la méthode déclenche automatiquement un message invitant l'utilisateur à accepter ou refuser l'accès à sa caméra. Une fois que nous avons au flux vidéo, nous pouvons le transmettre à un élément vidéo comme indiqué ci-dessous:

/**
 * Video Stream Layer
 * https://developer.mozilla.org/docs/Web/API/MediaDevices/getUserMedia
 */
const canvasEle = document.getElementById('canvas');
const videoEle = document.getElementById('videoElement');
const canvasCtx = canvasEle.getContext('2d');
fetchVideoStream();
function fetchVideoStream() {
  let constraints = { video: { facingMode: 'environment' } };
  if (navigator.mediaDevices !== undefined) {
    navigator.mediaDevices
      .getUserMedia(constraints)
      .then((stream) => {
        videoEle.srcObject = stream;
        videoStream = stream;
        videoEle.play();
        // Initiate frame capture - Processing Layer.
      })
      .catch((error) => {
        console.debug(error);
        console.warn(`Failed to access the stream:${error.name}`);
      });
  } else {
    console.warn(`getUserMedia API not supported!!`);
  }
}

Traitement de la couche

Pour détecter un code-barres dans un flux vidéo donné, nous devons régulièrement capturer des images et transférer à la couche du décodeur. Pour capturer une image, il suffit de dessiner les flux de VideoElement sur un HTMLCanvasElement à l'aide de drawImage() de l'API Canvas.

/**
 * Processing Layer - Frame Capture
 * https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Manipulating_video_using_canvas
 */
async function captureFrames() {
  if (videoEle.readyState === videoEle.HAVE_ENOUGH_DATA) {
    const canvasHeight = (canvasEle.height = videoEle.videoHeight);
    const canvasWidth = (canvasEle.width = videoEle.videoWidth);
    canvasCtx.drawImage(videoEle, 0, 0, canvasWidth, canvasHeight);
    // Transfer the `canvasEle` to the decoder for barcode detection.
    const result = await decodeBarcode(canvasEle);
  } else {
    console.log('Video feed not available yet');
  }
}

Pour les cas d'utilisation avancés, ce calque effectue aussi des tâches de prétraitement, comme le recadrage, la rotation ou la conversion en nuances de gris. Ces tâches peuvent utiliser le processeur de manière intensive et entraîner ne répond pas étant donné que la lecture des codes-barres est une opération de longue durée. Grâce au OffscreenCanvas, nous pouvons décharger pour un nœud de calcul Web. Sur les appareils compatibles avec l'accélération graphique matérielle, L'API WebGL et ses WebGL2RenderingContext peut et optimiser les gains sur les tâches de prétraitement qui utilisent de manière intensive le processeur.

Couche du décodeur

La dernière couche est la couche du décodeur, qui est chargée de décoder les codes-barres à partir des trames. capturées par la couche de traitement. Grâce au API Shape Detection (qui est n'est pas encore disponible sur tous les navigateurs), le navigateur décode lui-même le code-barres à partir d'un ImageBitmapSource, qui peut être un élément img, un élément SVG image, un élément video, une canvas, un objet Blob, un objet ImageData ou un objet ImageBitmap.

Schéma illustrant les trois principales couches de thread: flux vidéo, couche de traitement et API Shape Detection.

/**
 * Barcode Decoder with Shape Detection API
 * https://web.dev/shape-detection/
 */
async function decodeBarcode(canvas) {
  const formats = [
    'aztec',
    'code_128',
    'code_39',
    'code_93',
    'codabar',
    'data_matrix',
    'ean_13',
    'ean_8',
    'itf',
    'pdf417',
    'qr_code',
    'upc_a',
    'upc_e',
  ];
  const barcodeDetector = new window.BarcodeDetector({
    formats,
  });
  try {
    const barcodes = await barcodeDetector.detect(canvas);
    console.log(barcodes);
    return barcodes.length > 0 ? barcodes[0]['rawValue'] : undefined;
  } catch (e) {
    throw e;
  }
}

Pour les appareils qui ne sont pas encore compatibles avec l'API Shape Detection, nous avons besoin d'une solution de remplacement pour décoder les codes-barres. L'API Shape Detection expose un getSupportedFormats() qui permet de basculer entre l'API Shape Detection et la solution de remplacement.

// Feature detection.
if (!('BarceodeDetector' in window)) {
  return;
}
// Check supported barcode formats.
BarcodeDetector.getSupportedFormats()
.then((supportedFormats) => {
  supportedFormats.forEach((format) => console.log(format));
});

Organigramme montrant comment, en fonction de la compatibilité du détecteur de code-barres et des formats de code-barres compatibles, l&#39;API Shape Detection ou la solution de remplacement est utilisée.

Solution de remplacement

Plusieurs bibliothèques d'analyse Open Source et d'entreprise faciles à intégrer sont disponibles. à n'importe quelle application Web pour implémenter l'analyse. Voici quelques exemples de bibliothèques recommandent.

<ph type="x-smartling-placeholder">
Nom de la bibliothèque Type Solution Wasm Formats de codes-barres
QuaggaJs Open Source Non 1D
ZxingJs Open Source Non 1D et 2D (limitée)
CodeCorp Entreprise Oui 1D et 2D
Scandit Entreprise Oui 1D et 2D
</ph> Comparaison des bibliothèques de lecture de codes-barres commerciales Open Source et commerciales

Toutes les bibliothèques ci-dessus sont des SDK à part entière qui composent l'ensemble des couches décrites ci-dessus. Ils ont aussi exposent des interfaces pour permettre diverses opérations d'analyse. En fonction des formats de code-barres et la vitesse de détection nécessaire pour l'analyse de rentabilisation, la décision peut se situer entre les solutions Wasm et non-Wasm. Malgré la charge liée à la nécessité d'une ressource supplémentaire (Wasm) pour décoder le code-barres, Wasm les solutions non-Wasm en termes de justesse.

Nous avons tout d'abord choisi Scandit. Il est compatible avec tous les codes-barres formats requis pour nos cas d'utilisation métier ; il dépasse toutes les bibliothèques open source disponibles dans la vitesse d'analyse.

L'avenir de l'analyse

Une fois que l'API Shape Detection est entièrement compatible avec tous les principaux navigateurs, il est possible qu'une Nouvel élément HTML <scanner> doté des fonctionnalités requises pour un lecteur de codes-barres Ingénierie chez MishiPay pense qu'il existe un cas d'utilisation solide pour que la fonctionnalité de lecture de codes-barres soit une nouvelle élément HTML en raison du nombre croissant de bibliothèques sous licence et Open Source qui activent des fonctionnalités comme Scan & Go et bien d'autres.

Conclusion

La lassitude vis-à-vis des applications est un problème auquel les développeurs sont confrontés lorsque leurs produits arrivent sur le marché. Les utilisateurs veulent souvent pour comprendre la valeur qu'une application leur apporte avant de la télécharger. Dans un magasin, où MishiPay sauve et améliore l'expérience utilisateur, il est paradoxal d'attendre un télécharger avant de pouvoir utiliser une application. C'est là que notre PWA est utile. En éliminant les obstacles nos transactions ont été multipliées par 10 et nos utilisateurs ont économisé 2, 5 ans dans la file d'attente.

Remerciements

Joe Medley a rédigé cet article.