C# / .NET

Ce guide vous montre comment intégrer l'API de paiement de Money Fusion dans une application .NET, que ce soit côté backend (ASP.NET Core) ou frontend (MAUI mobile).

🔧 Côté Backend (ASP.NET Core)

1. Créez un modèle de requête FusionPayRequest

public class FusionPayRequest
{
    public decimal totalPrice { get; set; }
    public Article[] article { get; set; }
    public PersonalInfo[] personal_Info { get; set; }
    public string numeroSend { get; set; }
    public string nomclient { get; set; }
    public string return_url { get; set; }
    public string webhook_url { get; set; }
}

2. Exemple d’endpoint pour initier un paiement

[HttpPost("initiate/{ArticleId}")]
public async Task<IActionResult> InitiateFusionPay(string ArticleId)
{
    var payload = new FusionPayRequest
    {
        totalPrice = 1000,
        article = new[] { new Article { nom = "Nom de l'article", montant = 1000 } },
        personal_Info = new[] { new PersonalInfo { userId = "utilisateur123", orderId = "article123" } },
        numeroSend = "01010101",
        nomclient = "Client Test",
        return_url = "https://votreapp.com/PageDeRemerciement",
        webhook_url = "https://votreapp.com/votre/WebHook"
    };

    var client = _httpClientFactory.CreateClient("FusionPay");
    var response = await client.PostAsJsonAsync("MonApp/cléidentifiant/pay/", payload);
    var result = await response.Content.ReadFromJsonAsync<FusionPayResponse>();
    return Ok(new { checkoutUrl = result.url });
}

📱 Côté Frontend (MAUI)

1. Ouvrir une WebView avec l’URL du paiement

PaymentWebView.Source = "https://fusionpay.url/vers/checkout";

2. Capturer la redirection après paiement réussi

if (e.Url.StartsWith("VotreUrl://personnalisé", StringComparison.OrdinalIgnoreCase))
{
    await Shell.Current.GoToAsync("//PageDeRedirection");
}

✅ Résultat

  • Le paiement est initié via Money Fusion.
  • L'utilisateur est redirigé automatiquement vers votre app.
  • Le webhook vous notifie de la réussite.

🎯 Exemple de Webhook (confirmation de paiement)

Lorsque FusionPay reçoit un paiement, il envoie une requête HTTP POST à votre endpoint fusionpay-webhook. Voici comment le gérer côté backend en .NET :

🎯 Exemple de code C# (.NET) pour le Webhook

[AllowAnonymous]
[HttpPost("fusionpay-webhook")]
public async Task<IActionResult> HandleFusionPayWebhook([FromBody] FusionPayWebhook payload)
{
    Debug.WriteLine($"[FusionPay] Webhook reçu – Token: {payload.tokenPay}, Statut: {payload.statut}");

    if (payload.personal_Info == null || payload.personal_Info.Length == 0)
        return BadRequest(new { Message = "Données invalides." });

    var transactionId = payload.tokenPay;
    var userId = payload.personal_Info[0].userId;
    var articleId = payload.personal_Info[0].orderId;

    var alreadyProcessed = await _context.PurchasedArticles
        .AnyAsync(p => p.TransactionId == transactionId);

    if (alreadyProcessed)
        return Ok(new { Message = "Déjà traité" });

    if (payload.statut == "paid")
    {
        var article = await _context.Articles.FindAsync(aricleId);
        if (article == null)
            return NotFound("Article non trouvé");

        var purchase = new PurchasedArticle
        {
            UserId = userId,
            ArticleId = articleId,
            TransactionId = transactionId,
            PurchaseDate = DateTime.UtcNow,
            Title = article.Title,
            Price = article.Price,
            Description = article.Description,
        };

        _context.PurchasedArticles.Add(purchase);

        var pending = await _context.PendingPayments
            .FirstOrDefaultAsync(p => p.TransactionId == transactionId);

        if (pending != null)
            pending.IsCompleted = true;

        await _context.SaveChangesAsync();

        return Ok(new { Message = "Paiement confirmé et livre ajouté." });
    }

    return BadRequest(new { Message = "Paiement non accepté", payload.statut });
}

📦 Exemple de données reçues (JSON)

{
  "tokenPay": "ABC123456",
  "statut": "paid",
  "personal_Info": [
    {
      "userId": "UTILISATEUR123",
      "orderId": "LIVRE456"
    }
  ]
}