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.
.envavecYKNPG_API_TOKEN.
- Créer le projet
mkdir -p demo_flask && cd demo_flaskpython -m venv .venv && source .venv/bin/activatepip install flask requests python-dotenv
- Ajouter le fichier d'environnement
- Fichier :
.env
YKNPG_API_TOKEN=remplacez-par-votre-jeton
YKNPG_BASE_URL=https://yknpg.ngoul.com/api/v1
- 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)
- Exécuter
flask --app app run- POST
{"phone": "...", "amount": 1000}vershttp://127.0.0.1:5000/pay.
Remarques
- Gardez le token côté serveur ; ajustez les timeouts et l'intervalle de polling si besoin.