@muana/pay-sdk
v0.6.0
Published
SDK sécurisé pour intégrer les paiements Mobile Money avec intelligence artificielle, génération automatique de secrets HMAC, et mode ECDSA recommandé
Downloads
18
Maintainers
Readme
Muana Pay SDK
SDK JavaScript/TypeScript pour intégrer les paiements Mobile Money avec sécurité renforcée et intelligence artificielle. Deux modes disponibles:
🚀 Nouveautés v0.4.0
- 🧠 Intelligence artificielle Groq intégrée dans tous les modes (Supabase + BYOB)
- 🔄 Parsing intelligent des SMS : Regex + IA Groq pour extraction optimale
- 🆕 Endpoints unifiés :
/muana-validationpartout (Supabase + BYOB) - 🆕 Fingerprinting avancé : Détection des doublons par empreinte cryptographique
- 🆕 Champs structurés :
payment_reference,amount_cents,counterparty_number,parsed_confidence - 🛡️ Mode ECDSA recommandé pour la sécurité maximale
📦 Installation
npm i @muana/pay-sdk🚀 Modes d'intégration
Supabase (Edge Functions)
import { MuanaPayClient } from '@muana/pay-sdk/supabase';BYOB - Bring Your Own Backend/Base (Webhooks)
// Pas d'import côté serveur - utilisez les templates fournis
// L'app Android envoie directement à votre endpointMode Supabase
Quickstart
- Deploy Edge Functions in your Supabase project
Copy files from the SDK into your Supabase functions folder:
node_modules/@muana/pay-sdk/supabase/edge/muana-filter/index.ts → supabase/functions/muana-filter/index.ts
node_modules/@muana/pay-sdk/supabase/edge/muana-validation/index.ts → supabase/functions/muana-validation/index.tsThen deploy and set env vars (from your project root):
supabase functions deploy muana-filter
supabase functions deploy muana-validation
supabase functions set muana-filter \
SUPABASE_URL=your_url \
SUPABASE_ANON_KEY=your_anon_key \
GROQ_API_KEY=your_groq_key # Optionnel mais recommandé
supabase functions set muana-validation \
SUPABASE_URL=your_url \
SUPABASE_SERVICE_ROLE_KEY=your_service_role_key- Run the SQL once in your database
Open and execute this script in your Supabase SQL editor:
node_modules/@muana/pay-sdk/supabase/sql/setup_transactions.sqlIt creates public.muana_sms (consolidated table for SMS storage + payment processing) with helpful indexes + permissive RLS for inserts/selects used by the functions.
- Add environment variables in your Web app
Vite example (.env):
VITE_SUPABASE_URL=<YOUR_SUPABASE_URL>
VITE_SUPABASE_ANON_KEY=<YOUR_ANON_KEY> # never commit .env- Initialize the client
import { MuanaPay } from '@muana/pay-sdk/supabase';
const muana = new MuanaPay({
supabaseUrl: import.meta.env.VITE_SUPABASE_URL,
anonKey: import.meta.env.VITE_SUPABASE_ANON_KEY,
});- Verify a transaction (Pricing flow)
// Méthode 1: Vérification par référence de transaction (méthode classique)
const result = await muana.verifyTransaction({
userId: 'USER_UUID', // Supabase Auth user id
paymentReference: 'ABC123', // copied from the user's SMS
planName: 'Pro', // nom du plan
});
// Méthode 2: Vérification par numéro de téléphone (nouveau!)
const result = await muana.verifyTransaction({
userId: 'USER_UUID',
counterpartyNumber: '7701xxxx',
planName: 'Pro',
});
// Méthode 3: Vérification avec montant spécifique
const result = await muana.verifyTransaction({
userId: 'USER_UUID',
counterpartyNumber: '7701xxxx',
amountCents: 10000,
});🤖 Intelligence Artificielle Groq Intégrée
Nouveau ! Tous les modes (Supabase + BYOB) utilisent maintenant Groq AI pour :
- 🧠 Parsing intelligent : Extraction automatique des champs structurés
- 🎯 Filtrage marketing : Distinction SMS transaction vs publicité
- 🌍 Multilingue : Français, anglais, et autres langues
- 📊 Confiance élevée : Score de confiance pour chaque extraction
Configuration (ne jamais exposer ces clés côté client) :
# Supabase
supabase functions set muana-filter GROQ_API_KEY=your_groq_key
# BYOB
export GROQ_API_KEY=your_groq_keyAvantages (sans divulguer de prompts ou d'heuristiques internes) :
- ✅ Extraction précise :
payment_reference,amount_cents,counterparty_number - ✅ Filtrage automatique : Ignore les SMS marketing
- ✅ Fallback robuste : Regex si Groq indisponible
- ✅ Confiance mesurée :
parsed_confidencepour chaque SMS
Prerequisites
- Edge Function
muana-filterdeployed with env:SUPABASE_URL,SUPABASE_ANON_KEY,GROQ_API_KEY(optionnel) - Edge Function
muana-validationdeployed with env:SUPABASE_URL,SUPABASE_SERVICE_ROLE_KEY - Run the SQL in
sql/setup_transactions.sqlon your Supabase project
Deploy Edge Functions (copy these files into your Supabase functions)
Copy the files:
edge/muana-filter/index.ts→supabase/functions/muana-filter/index.tsedge/muana-validation/index.ts→supabase/functions/muana-validation/index.ts
Then deploy (from your project root):
supabase functions deploy muana-filter
supabase functions deploy muana-validationSet env vars in Supabase dashboard or via CLI:
supabase functions set muana-filter SUPABASE_URL=... SUPABASE_ANON_KEY=... GROQ_API_KEY=...
supabase functions set muana-validation SUPABASE_URL=... SUPABASE_SERVICE_ROLE_KEY=...Notes:
- Muana Android App will POST incoming SMS to
muana-filterusing your Supabase URL + anon key (no Android native code needed). - Your web/app server should call
muana-validationwhen a user pastes their payment reference on the Pricing page.
🔐 Sécurité Renforcée
Génération Automatique des Secrets HMAC
Problème résolu : Plus de secrets faibles comme "123456" ou "password" !
Solution : L'app Android génère automatiquement des secrets cryptographiquement sécurisés de 64 caractères.
// Dans l'app MuAna → Configuration → Mode Webhook → HMAC
<Button onClick={() => {
// Génération sécurisée 32 bytes = 64 hex chars
const array = new Uint8Array(32);
crypto.getRandomValues(array);
const newSecret = Array.from(array,
byte => byte.toString(16).padStart(2, '0')
).join('');
setWebhookSecret(newSecret);
}}>
Générer Secret Sécurisé
</Button>Mode ECDSA Recommandé
Plus sécurisé que HMAC : Clés privées dans Android Keystore, révocation par appareil.
// Génération automatique des paires de clés
<Button onClick={async () => {
const { generateEcdsaP256KeyPair } = await import("@/lib/ecdsa");
const { publicKeyPem, privateJwk } = await generateEcdsaP256KeyPair();
// Clé privée reste dans l'appareil, clé publique envoyée au serveur
}}>
Générer Paire de Clés
</Button>Mode BYOB (Bring Your Own Backend/Base)
Pour les développeurs qui veulent utiliser leur propre base de données (Postgres, MySQL, MongoDB, etc.) sans Supabase.
Principe
- L'app Android MuAna envoie directement les SMS vers votre endpoint webhook.
- Votre serveur reçoit, vérifie la signature, parse le SMS avec IA Groq, et insère en base.
- MuAna ne stocke aucune donnée: BYOB = autonomie totale.
🆕 Nouveautés BYOB v0.4.0
- 🧠 IA Groq intégrée : Parsing intelligent des SMS même en mode BYOB
- 🔄 Endpoints unifiés :
/muana-validationpartout (comme Supabase) - 🆕 Fingerprinting avancé : Détection des doublons par empreinte cryptographique
- 🆕 Champs structurés :
payment_reference,amount_cents,counterparty_number,parsed_confidence - 🆕 Parsing hybride : Regex + IA Groq pour extraction optimale
Quickstart BYOB
Choisissez un template serveur dans
byob/:- Node + Postgres:
byob/node-express-postgres/server-unified.js(recommandé) - Node + Postgres:
byob/node-express-postgres/server.js - Node + Postgres:
byob/node-express-postgres/server-ecdsa.js
- Node + Postgres:
Créez les tables avec les schemas fournis:
- Postgres:
byob/sql/muana_sms.postgres.sql - MySQL:
byob/sql/muana_sms.mysql.sql
- Postgres:
Déployez le serveur avec les variables d'environnement:
DATABASE_URL=postgresql://... GROQ_API_KEY=your_groq_key # Optionnel mais recommandé pour l'IAConfigurez l'app MuAna:
- Mode: Webhook (BYOB)
- Signature: ECDSA (recommandé) ou HMAC
- Webhook URL: https://votre-backend.com/webhook/sms
- Générez une paire de clés via le bouton
Testez la vérification automatique:
# Créer une demande de paiement curl -X POST https://votre-backend.com/muana-validation \ -H "Content-Type: application/json" \ -d '{ "user_id": "user123", "plan_name": "Pro", "amount_cents": 10000, "counterparty_number": "123456789" }' # Retourne: {"status": "verified", "sms_id": "uuid"} # Quand l'app Android reçoit un SMS de 77010000 avec 10000 FCFA, # l'auto-match active automatiquement l'abonnement!
🆕 Architecture BYOB v0.4.0
Parsing hybride intelligent :
SMS reçu → Regex basique → IA Groq (si disponible) → Base de données structuréeChamps extraits automatiquement :
payment_reference: ID/référence de transactionamount_cents: Montant en centimescounterparty_number: Numéro expéditeur/destinataireparsed_confidence: Score de confiance de l'extractionfingerprint: Empreinte cryptographique pour éviter les doublons
Endpoints unifiés :
POST /webhook/sms: Réception des SMS avec parsing IAPOST /muana-validation: Vérification des transactions
Sécurité BYOB
- ECDSA par appareil (défaut): clé privée Android Keystore + clé publique en base.
- HMAC par appareil (compat): secret par
device_iden base. - Anti-replay: fenêtre 5 min + table
muana_webhook_events. - Déduplication:
fingerprintunique par SMS. - Parsing sécurisé: Regex + IA Groq avec fallback robuste.
Voir byob/README.md pour les détails complets.
API
Supabase Mode:
new MuanaPayClient({ supabaseUrl: string, anonKey: string })sendSms({ sender: string, message: string, timestamp?: string|number|Date })→ POST to/functions/v1/muana-filterverifyTransaction({ userId: string, paymentReference?: string, counterpartyNumber?: string, planName?: string, amountCents?: number })→ POST to/functions/v1/muana-validation
BYOB Mode:
POST /webhook/sms→ Reçoit les SMS, parse avec IA et auto-matchPOST /muana-validation→ Vérification des transactions (même interface que Supabase)
Nouveautés v0.4.0:
- 🧠 IA Groq intégrée dans tous les modes (Supabase + BYOB)
- 🔄 Parsing intelligent : Regex + IA pour extraction optimale
- 🆕 Endpoints unifiés :
/muana-validationpartout - 🆕 Fingerprinting avancé : Détection des doublons par empreinte
- 🆕 Champs structurés :
payment_reference,amount_cents,counterparty_number,parsed_confidence - 🔄 Vérification automatique par numéro: Plus besoin de saisir l'ID de transaction
- ⚡ Auto-match en temps réel: Activation immédiate du plan dès réception du SMS
- 🔄 Realtime support: Écoute des mises à jour via Supabase Realtime
- 📊 Colonnes enrichies:
payment_status,counterparty_number,amount_cents, etc. - 🛡️ Mode ECDSA recommandé pour la sécurité maximale
Recommended:
- Use
planIdfrom your ownplanstable for exact match. - If you can't pass a plan, provide
amountCentsso the function can create a pending transaction and validate amount vs plan later. - Set
GROQ_API_KEYfor intelligent SMS parsing and marketing filtering.
SQL Setup
Run sql/setup_transactions.sql on your Supabase database. It creates public.muana_sms with the columns used by the Edge Functions and permissive RLS policies for insert/select.
Security
muana-filteris called with the anon key from Muana Android. The RLS policy onmuana_smsis permissive to allow inserts.muana-validationmust use the service role key in Edge env (not exposed to clients).- In your Vite app, define
VITE_SUPABASE_URLandVITE_SUPABASE_ANON_KEYin.envfiles.
Security checklist (Operational)
- Do not commit
.envfiles; use secrets managers or CI/CD environment variables. - Never expose or bundle
SUPABASE_SERVICE_ROLE_KEYorGROQ_API_KEYin client code. - Mask phone numbers and references in logs and examples (e.g.,
7701xxxx,REFxxxx). - Avoid logging raw SMS content; log minimal metadata only.
- Rotate keys immediately if exposure is suspected, and audit access logs.
- Keep prompts/model details private; document behavior, not internal instructions.
📚 Documentation
- 🇫🇷 Français : README.fr.md - Guide complet d'installation et configuration
- 🔐 Sécurité : docs/WEBHOOK_SECURITY.md - Guide détaillé HMAC vs ECDSA
- 🧠 IA Groq : docs/GROQ_FILTERING.md - Filtrage intelligent des SMS
- 📱 Exemples : examples/ - Implémentations React et Node.js
- 🔧 BYOB : byob/ - Templates serveur et schémas SQL
Example .env:
VITE_SUPABASE_URL=https://xxxx.supabase.co
VITE_SUPABASE_ANON_KEY=eyJhbGciOi...Troubleshooting
- Node < 18: install a fetch polyfill (e.g.
node-fetch) or upgrade Node. muana-validationreturns 500: checkSUPABASE_SERVICE_ROLE_KEYis set on the function and correct.- Status
rejected: make sure the SMS with thatpayment_referenceexists inmuana_sms, and the amount matches the selected plan. - CORS: the Edge Functions set permissive CORS headers by default; if you customize, keep
authorization, x-client-info, apikey, content-typeallowed. - GROQ parsing fails: check
GROQ_API_KEYis set and valid. The system falls back to regex parsing automatically.
