Téléchargements

Cette page répertorie les différents fichiers utiles dans le cadre de l'utilisation de MPay.

Application Android

L'application Android (v1.0.32.5.WIP) peut être téléchargée sur Google Play ou directement ici.
A installer sur le smartphone qui contient les puces SIM recevant les paiements.

La différence entre la version du Google Play et celle du site web réside en ce que Google Play exige, au moment de la compilation, que l'on cible l'API niveau 31 (Android 12). Or Android, depuis le niveau d'API 29 (version 10) ne permet plus à une application tournant en tâche de fond de démarrer une activité. Or, c'est par ce procédé que MPay exécute les codes USSD qui lui sont soumis via l'API. La version disponible ici sur le site web est compilée en ciblant l'API niveau 26 (Android 8) et peut donc offrir toutes les fonctionnalités initialement prévues.
Si vous n'avez pas besoin d'exécuter des codes USSD via l'API, ou si votre smartphone tourne sur Android 9 (ou inférieur), vous ne noterez pas de différence entre les deux versions. Si par contre vous utilisez Android 10 (ou supérieur), privilégiez la version disponible directement sur cette page.

Client web

mpay-client-0.6.tar.gz
Il s'installe sur votre site web. Son rôle est de faciliter les paiements par vos utilisateurs en offrant une page de paiement personnalisable et un rapatriement automatique des paiements vers votre site web.
La documentation est sur la page dédiée.

Plugin Nagios

mpay_ping.sh

Usage:

mpay_ping.sh [--url <mpay-api-url>] [--delay-warn <delay>] [--delay-crit <delay>] [--interval-checks <interval>] [--timeout <delay>] --apikey <apikey>
Le seul paramètre obligatoire est --apikey <apikey> où <apikey> est votre clé d'accès à l'API suivie d'un deux points (:), le tout encodé en base64.
Les autres paramètres:
  • --url <mpay-api-url>: url de l'API MPay
  • --delay-warn <delay>: délai au-delà duquel le plugin renvoie un statut WARNING
  • --delay-crit <delay>: délai au-delà duquel le plugin renvoie un statut CRITICAL
  • --interval-checks <interval>: intervalle entre les vérifications successives pour voir si l'application mobile a répondu au ping
  • --timeout <delay>: délai maximum d'attente de la réponse de l'application mobile

Exemple de configuration Nagios:

define command {
        command_name    ping_mpay
        command_line    $USER1$/mpay_ping.sh --apikey $ARG1$ --timeout $ARG2$ --delay-warn $ARG3$ --delay-crit $ARG4$
}

define service{
        use                             generic-service
        host_name                       vps4
        service_description             MPay Mobile App
        check_command                   ping_mpay!dlJYM2V0NUQzSmq3VnN5eEs3nMc6Cg==!30!10!20
        }

Plugin Prestashop

20211206paymentmpay-0.0.3.zip
Ce plugin permet d'intégrer facilement une option de paiement mobile à une boutique PrestaShop.

Les paramètres du plugin sont les suivants:

  • Identifiant Utilisateur MPay: l'identifiant (et non l'adresse mail) de votre compte MPay (disponible sur la page d'informations de votre compte)
  • Numéro Orange et Numéro Telmob: les numéros de téléphone qui doivent recevoir les paiements
  • Nom de votre boutique: le nom à afficher sur la page de paiement (facultatif)
  • URL de votre logo: l'URL de votre logo (en 32×32 pixels) qui sera affiché sur la page de paiement (facultatif)
  • Clé publique: la clé publique de votre compte MPay (également disponible sur la page d'informations de votre compte)
  • URL de rappel: l'URL vers laquelle les utilisateurs seront redirigés une fois le paiement effectué. Réservé aux utilisateurs avertis.
  • URL du client MPay: l'URL du client MPay, par défaut, c'est le client hébergé sur nos serveurs, mais vous pouvez mettre l'adresse d'un client MPay que vous auriez personnalisé. Réservé aux utilisateurs avertis.

Scripts shell

Ces scripts ont été écrits pour simplifier certaines utilisations courantes de l'API. À vous de les adapter suivant vos besoins spécifiques.
Note: au début de chaque script est définie une variable apiKey ou base64ApiKey. Il s'agit de la clé d'accès à l'API (déjà encodée en base64). À remplacer donc par la vôtre.

sendSms.sh: envoi de SMS.

#!/bin/bash
#set -x
base64key=''
send=false

sendCmd() {
    data='{
    "destinataire": "'$1'",
    "puce": "'$2'",
    "contenu": "'$3'"
    }'
    if [ $send == "false" ]; then
        echo curl -s -X POST -H \"Content-Type: application/json\" -H \"Authorization: Basic ${base64key}\" -i https://mpay.ytsamy.name/api/sms --data \'$data\'
    else
        curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Basic ${base64key}" -i https://mpay.ytsamy.name/api/sms --data "$data"
    fi
}

usage() {
    	echo "Usage: $0 --numero  --puce  --texte ";
}

if [ $# -lt 1 ]; then
        usage
	exit 1
fi

while [ -n "$1" ]; do
  case "$1" in
    --numero)
        numero=$2
        shift
        ;;
    --texte)
        texte="$2"
        shift
        ;;
    --puce)
        puce=$2
        shift
        ;;
    --send)
        send=true
        ;;
    --help)
        usage
        exit 0
        ;;
    *)
        echo "parametre inconnu: $1"
        usage
        exit 2
  esac
  shift
done

if [ -z "$numero" ]; then echo "Option --numero manquante"; exit 3;fi
if [ -z "$puce" ]; then echo "Option --puce manquante"; exit 3; fi
if [ -z "$texte" ]; then echo "Option --texte manquante"; exit 3; fi

sendCmd $numero $puce "$texte"

sendUssd.sh: exécution de code USSD.

#!/bin/bash

mpay_api="https://mpay.ytsamy.name/api/"
apikey=""


while [ -n "$1" ]; do
  case "$1" in
    --code)
        code=$2
        shift
        ;;
    --puce)
        puce=$2
        shift
        ;;
    *)
        echo "parametre inconnu: $1"
        exit 2
  esac
  shift
done

if [ -z "$code" ]; then echo "Option --code manquante"; exit 3;fi
if [ -z "$puce" ]; then echo "Option --puce manquante"; exit 3; fi


data='{
"puce": "'$puce'",
"code": "'$code'"
}'

curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Basic ${apikey}" -i ${mpay_api}ussdcodes --data "$data" 

mpayForfaitSms.sh: souscription au forfait SMS de Moov ou Orange par l'exécution d'un code USSD.

#!/bin/bash

# set -xv

mpayApiUrl="https://mpay.ytsamy.name/api/"
mpayBase64key=''

puce_orange=3
puce_moov=1
forfait_sms_orange_ussd="*101*1#"
forfait_sms_moov_ussd="*146*210#"
forfait_sms_orange_count=10
forfait_sms_moov_count=10

dummy=false

echoHelp() {
    echo "Usage: $0 [--dummy <count>] orange|moov"
}

recharge() {
    reseau=$1
    count=0
    code=""
    puce=""
    case $reseau in
        moov)
            code=$forfait_sms_moov_ussd
            count=$forfait_sms_moov_count
            puce=$puce_moov
            ;;
        orange)
            code=$forfait_sms_orange_ussd
            count=$forfait_sms_orange_count
            puce=$puce_orange
            ;;
    esac
    if [ $count -ne 0 ] && [ -n "$code" ] && [ -n "$puce" ] ; then
        if [ "$dummy" == "false" ]; then
            sendUssd.sh --code "$code" --puce $puce > /dev/null
            sleep 10s
        else
            count=$2
        fi
        data='{
        "puce": "'$puce'",
        "count": "'$count'"
        }'
        curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Basic  ${mpayBase64key}" "${mpayApiUrl}user/sms-count" --data "$data" >/dev/null
        if [ "$dummy" == "false" ]; then echo "Recharge forfait SMS $reseau"
        else echo "Recharge factice forfait SMS $reseau"; fi
    fi
}


# if [ $# -ne 1 ]; then echoHelp; exit -1; fi

reseau=""

while [ -n "$1" ]; do
    case "$1" in
    moov|orange)
        reseau=$1
        ;;
    --dummy)
        dummy=true
        count=$2
        shift 
        ;;
    *)
        echo "Paramètre inconnu $1"
        echoHelp
        exit -2
        ;;
    esac
    shift
done

if [ "$reseau" != "orange" ] && [ "$reseau" != "moov" ]; then
    echoHelp
    exit -3
fi

recharge $reseau $count

smsRappelAbonnementFasoPharmacies.sh: Ce script est écrit dans le cadre de l'application mobile Faso Pharmacies. Il interroge le serveur pour connaître les numéros de téléphone des utilisateurs dont l'abonnement expire dans n jours (n pouvant être négatif) et leur envoie un SMS de rappel. Le script identifie le réseau et la puce SIM à employer. En outre, étant donné qu'il envoie potentiellement un grand nombre de SMS, il prend en compte les limitations de débit de l'API, et les limites des forfaits SMS des opérateurs, lançant une nouvelle souscription si besoin.

#!/bin/bash

# set -xv

# Valeurs de production
# API Url & clé API
fasopharmaciesApiUrl="https://www.fasopharmacies.ytsamy.name/api/"
fasoPharmaciesBase64key=''
mpayApiUrl="https://mpay.ytsamy.name/api/"
mpayBase64key=''


#durée de la pause entre les envois, en secondes
pause=10
# envoi direct?
send=""
# date d'expiration
dexpiry=""
# debut=`date -d "-1 day" "+%F"`
shortUrl='https://msoft.bf/Pharma'

puce_orange=3
puce_moov=1

echoHelp() {
    echo "Usage: $0 [--pause <seconds> ] [--send] [--delai <nb jours>] [--date <date expiration>]"
}

getReseau() {
    case ${#1} in
        1)
            chiffre=$1
            ;;
        8)
            chiffre=${1:1:1}
            ;;
        11)
            chiffre=${1:4:1}
            ;;
        12)
            chiffre=${1:5:1}
            ;;
    esac
    
    case $chiffre in
        0|1|2|3)
            echo "moov"
            ;;
        4|5|6|7)
            echo "orange"
            ;;
        8|9)
            echo "telecel"
            ;;
        *)
            echo "inconnu"
    esac
}

getPuce() {
    case $1 in
        moov)
            puce=1
            ;;
        orange)
            puce=3
            ;;
        *)
            puce=""
            ;;
    esac
    echo $puce
}

sendSms() {
    number=$1
    reseau=`getReseau $1`
    puce=`getPuce $reseau`
    if [ $puce ]; then
        message="Votre abonnement"
        if [ $delai -lt 0 ]; then message="$message a expiré"
        else message="$message expire"
        fi
        message="$message le $ddisplay. Vous pouvez le renouveler en cliquant sur $shortUrl.\n\nFaso Pharmacies"
        sendSms.sh $send --numero $number --puce $puce --texte "$message"
    fi
}

while [ -n "$1" ]; do
  case "$1" in
    --pause)
        pause=$2
        shift
        ;;
    --send)
        send="--send"
        ;;
    --date)
        dexpiry=$2
        shift
        ;;
    --delai)
        delai=$2
        shift
        ;;
    *)
        echo "Paramètre inconnu $1"
        exit -1
        ;;
  esac
  shift
done


if [ -z "$delai" ]; then
    echo "Paramère manquant: delai"
    echoHelp
    exit -2
fi

if [ -z "$dexpiry" ]; then
    dexpiry=`date -d "$delai day" "+%F"`" 23:59:59"
fi

dparameter=`echo $dexpiry | sed "s/ /%20/g" | sed "s/:/%24/g" `
ddisplay=`date -d "$dexpiry" "+%d/%m/%Y"`

if [ $send ]; then
    line=0
    curl -s -X GET -H "Content-Type: application/json" -H "Authorization: Basic  ${fasoPharmaciesBase64key}" "${fasopharmaciesApiUrl}user/index?fields=telephone,telephoneAbonnement&UserSearch\[expiry\]=$dparameter" | jq -r '(.[0] | keys_unsorted) as $keys |  map([.[ $keys[] ]])[] | @tsv' | awk 'NF' | while read num1 num2; do
        line=$((line+1))
#         echo ligne: $line
        for num in $num1 $num2; do
            if [ $num ]; then
                resultat=$(sendSms $num)
                if [ -n "$resultat" ]; then
                    echo "Envoi SMS au $num"
                    reseau=`getReseau $num`
                    p=`getPuce $reseau`
                    smsRestants=`echo "$resultat" | grep Sms-Count | sed "s/.*: //" | tr -d "\r" `
                    if [ -n "$smsRestants" ] && [ "$smsRestants" -le 1 ]; then
                        mpayForfaitSms.sh $reseau > /dev/null
                        echo "Recharge Forfait SMS $reseau"
                    fi
                    
                    nb=`echo "$resultat" | grep Remaining | sed "s/.*: //" | tr -d "\r"`
                    #echo "line $line; Remaining = $nb; ID Trans: $idtrans"
                    if (($nb<50)); then
                        echo "line $line: Remaining = $nb; sleeping $pause seconds..."
                        sleep $pause
                    fi
                    sleep 5
                else
                    echo "SMS non envoyé au $num"
                fi
            fi
        done
    done
    
else

# Cette version, qui n'envoie pas directement les SMS mais crée un fichier de commandes,
# n'inclut pas de routine de suivi du nombre de SMS envoyés

#     tmpCmdFile=$(mktemp)
#     (
    echo "#!/bin/bash"

    line=0
    curl -s -X GET -H "Content-Type: application/json" -H "Authorization: Basic  ${fasoPharmaciesBase64key}" "${fasopharmaciesApiUrl}user/index?fields=telephone,telephoneAbonnement&UserSearch\[expiry\]=$dparameter" | jq -r '(.[0] | keys_unsorted) as $keys |  map([.[ $keys[] ]])[] | @tsv' | awk 'NF' | while read num1 num2; do
        line=$((line+1))
        # echo ligne: $line
        if [ $num1 ]; then sendSms $num1; fi
        echo "sleep $pause"
        if [ $num2 ]; then sendSms $num2; fi
        echo "sleep $pause"
    done
#     ) > $tmpCmdFile

#     . $tmpCmdFile

#     rm $tmpCmdFile
fi