Guide

Guide Flask pour encapsuler le flux de transaction YKNPG dans un endpoint simple.

Guide Flask pour encapsuler le flux de transaction YKNPG dans un endpoint simple.

Pré-requis

  • Python 3.10+, Flask, requests, python-dotenv.
  • .env avec YKNPG_API_TOKEN.
  1. Créer le projet
  • mkdir -p demo_flask && cd demo_flask
  • python -m venv .venv && source .venv/bin/activate
  • pip install flask requests python-dotenv
  1. Ajouter le fichier d'environnement
  • Fichier : .env
YKNPG_API_TOKEN=remplacez-par-votre-jeton
YKNPG_BASE_URL=https://yknpg.ngoul.com/api/v1
  1. Créer l'app
  • Fichier : app.py
import os
import time
from dotenv import load_dotenv
import requests
from flask import Flask, jsonify, request

load_dotenv()

API_TOKEN = os.environ["YKNPG_API_TOKEN"]
BASE_URL = os.environ.get("YKNPG_BASE_URL", "https://yknpg.ngoul.com/api/v1")
HEADERS = {"Authorization": f"Bearer {API_TOKEN}"}

app = Flask(__name__)


def create_transaction(amount: int, phone: str) -> dict:
    payload = {
        "amount": amount,
        "provider": "ORANGE_MONEY",
        "user_infos": {"number": phone},
        "callback_url": "http://example.com",
        "callback_method": "POST",
        "your_message": "pay this",
        "your_order_ref": "demo-1",
        "provider_fees_on_customer": True,
    }
    resp = requests.post(f"{BASE_URL}/transactions/", headers=HEADERS, json=payload, timeout=10)
    resp.raise_for_status()
    return resp.json()


def pay_transaction(uuid: str) -> dict:
    resp = requests.post(f"{BASE_URL}/transactions/{uuid}/pay/", headers=HEADERS, timeout=10)
    resp.raise_for_status()
    return resp.json()


def poll_status(uuid: str) -> str:
    status = "new"
    while status in {"new", "paying"}:
        time.sleep(5)
        resp = requests.get(f"{BASE_URL}/transactions/{uuid}/", headers=HEADERS, timeout=10)
        resp.raise_for_status()
        status = resp.json()["status"]
    return status


@app.post("/pay")
def pay():
    body = request.get_json()
    amount = int(body["amount"])
    phone = body["phone"]

    trx = create_transaction(amount, phone)
    pay_resp = pay_transaction(trx["uuid"])
    final_status = poll_status(trx["uuid"])

    return jsonify(
        instructions=trx.get("instructions"),
        post_pay_instructions=pay_resp.get("instructions"),
        final_status=final_status,
    )


if __name__ == "__main__":
    app.run(debug=True)
  1. Exécuter
  • flask --app app run
  • POST {"phone": "...", "amount": 1000} vers http://127.0.0.1:5000/pay.

Remarques

  • Gardez le token côté serveur ; ajustez les timeouts et l'intervalle de polling si besoin.