{
  "info": {
    "name": "FAYGAW — Direct-Link Checkout",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "description": "Créez un Direct-Link Wave ou Orange Money et utilisez ses launch_options. Confirmez le paiement avec GET ou checkout.paid signé. Modifiez les valeurs d’exemple directement dans les requêtes. Pour une nouvelle opération, changez la référence et la clé Idempotency-Key. Après un timeout, conservez exactement la même clé et le même corps. Pour lire une opération, remplacez l’identifiant d’exemple par celui reçu à la création. ⚠ Les opérations effectuées avec une clé SANDBOX peuvent utiliser des fonds réels. Vérifiez toujours les montants et les bénéficiaires avant l’envoi.\n\nLes limites SANDBOX s’appliquent indépendamment par provider et par partenaire. Par défaut, le minimum Checkout est de 10 XOF et le minimum Payout de 100 XOF. Les minimums et plafonds SANDBOX peuvent être adaptés sur demande du partenaire auprès de Faygaw, après validation. Respectez les limites indiquées dans la réponse d’erreur et contactez Faygaw si une adaptation est nécessaire.\n\nSANDBOX limits apply independently per provider and partner. The default minimum is 10 XOF for Checkout and 100 XOF for Payout. SANDBOX minimums and limits can be adjusted upon the partner’s request to Faygaw, subject to approval. Follow the limits reported in the error response and contact Faygaw if an adjustment is needed."
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://api.faygaw.org/v1"
    },
    {
      "key": "api_key",
      "value": "",
      "description": "Clé API à renseigner localement ; ne pas la partager dans un export."
    },
    {
      "key": "expected_environment",
      "value": "SANDBOX",
      "description": "Contrôle de la réponse uniquement ; l’environnement est déterminé par la clé API."
    }
  ],
  "item": [
    {
      "name": "Créer un Direct-Link Wave — checkout:write",
      "request": {
        "method": "POST",
        "url": "{{base_url}}/dl-checkouts",
        "header": [
          {
            "key": "Authorization",
            "value": "Bearer {{api_key}}"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Idempotency-Key",
            "value": "example-dl-wave-abc123XYZ"
          }
        ],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"amount\": \"100\",\n  \"currency\": \"XOF\",\n  \"client_reference\": \"dl_wave_abc123XYZ\",\n  \"description\": \"Test Direct-Link Wave\",\n  \"success_url\": \"https://merchant.example/success\",\n  \"error_url\": \"https://merchant.example/error\",\n  \"metadata\": {\n    \"language\": \"fr\"\n  },\n  \"payment_method\": {\n    \"provider\": \"WAVE\"\n  }\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        },
        "description": "Créez un Direct-Link Wave ou Orange Money et utilisez ses launch_options. Confirmez le paiement avec GET ou checkout.paid signé. Modifiez les valeurs d’exemple directement dans les requêtes. Pour une nouvelle opération, changez la référence et la clé Idempotency-Key. Après un timeout, conservez exactement la même clé et le même corps. Pour lire une opération, remplacez l’identifiant d’exemple par celui reçu à la création. ⚠ Les opérations effectuées avec une clé SANDBOX peuvent utiliser des fonds réels. Vérifiez toujours les montants et les bénéficiaires avant l’envoi."
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "const body=pm.response.json();",
              "pm.test('Known response',()=>pm.expect([201,400,401,403,409,422,429,503]).to.include(pm.response.code));",
              "if(pm.response.code===201){",
              " pm.test('Requested provider',()=>pm.expect(body.provider).to.eql(JSON.parse(pm.request.body.raw).payment_method.provider));",
              " pm.test('No Hosted capability',()=>pm.expect(body.checkout_link).to.eql(undefined));",
              " pm.test('Provider application identities',()=>{if(body.status==='PROCESSING'){pm.expect(body.launch_options.map(x=>x.app)).to.eql(body.provider==='WAVE'?['WAVE']:['ORANGE_MONEY','MAXIT']);}});",
              "}else if(body.checkout){pm.test('No uncertain payable launch',()=>pm.expect(body.checkout.launch_options).to.eql([]));}"
            ]
          }
        }
      ]
    },
    {
      "name": "Créer un Direct-Link OM — checkout:write",
      "request": {
        "method": "POST",
        "url": "{{base_url}}/dl-checkouts",
        "header": [
          {
            "key": "Authorization",
            "value": "Bearer {{api_key}}"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Idempotency-Key",
            "value": "example-dl-om-abc123XYZ"
          }
        ],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"amount\": \"100\",\n  \"currency\": \"XOF\",\n  \"client_reference\": \"dl_om_abc123XYZ\",\n  \"description\": \"Test Direct-Link OM\",\n  \"success_url\": \"https://merchant.example/success\",\n  \"error_url\": \"https://merchant.example/error\",\n  \"metadata\": {\n    \"language\": \"fr\"\n  },\n  \"payment_method\": {\n    \"provider\": \"ORANGE_MONEY\"\n  }\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        },
        "description": "Créez un Direct-Link Wave ou Orange Money et utilisez ses launch_options. Confirmez le paiement avec GET ou checkout.paid signé. Modifiez les valeurs d’exemple directement dans les requêtes. Pour une nouvelle opération, changez la référence et la clé Idempotency-Key. Après un timeout, conservez exactement la même clé et le même corps. Pour lire une opération, remplacez l’identifiant d’exemple par celui reçu à la création. ⚠ Les opérations effectuées avec une clé SANDBOX peuvent utiliser des fonds réels. Vérifiez toujours les montants et les bénéficiaires avant l’envoi."
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "const body=pm.response.json();",
              "pm.test('Known response',()=>pm.expect([201,400,401,403,409,422,429,503]).to.include(pm.response.code));",
              "if(pm.response.code===201){",
              " pm.test('Requested provider',()=>pm.expect(body.provider).to.eql(JSON.parse(pm.request.body.raw).payment_method.provider));",
              " pm.test('No Hosted capability',()=>pm.expect(body.checkout_link).to.eql(undefined));",
              " pm.test('Provider application identities',()=>{if(body.status==='PROCESSING'){pm.expect(body.launch_options.map(x=>x.app)).to.eql(body.provider==='WAVE'?['WAVE']:['ORANGE_MONEY','MAXIT']);}});",
              "}else if(body.checkout){pm.test('No uncertain payable launch',()=>pm.expect(body.checkout.launch_options).to.eql([]));}"
            ]
          }
        }
      ]
    },
    {
      "name": "Lire le Checkout — checkout:read",
      "request": {
        "method": "GET",
        "url": "{{base_url}}/checkouts/co_bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
        "header": [
          {
            "key": "Authorization",
            "value": "Bearer {{api_key}}"
          }
        ],
        "description": "Créez un Direct-Link Wave ou Orange Money et utilisez ses launch_options. Confirmez le paiement avec GET ou checkout.paid signé. Modifiez les valeurs d’exemple directement dans les requêtes. Pour une nouvelle opération, changez la référence et la clé Idempotency-Key. Après un timeout, conservez exactement la même clé et le même corps. Pour lire une opération, remplacez l’identifiant d’exemple par celui reçu à la création. ⚠ Les opérations effectuées avec une clé SANDBOX peuvent utiliser des fonds réels. Vérifiez toujours les montants et les bénéficiaires avant l’envoi."
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "const data=pm.response.json();",
              "pm.test('Expected successful response',()=>pm.expect(pm.response.code).to.eql(pm.request.method==='POST'?201:200));",
              "pm.test('Private response is not cached',()=>pm.expect(pm.response.headers.get('Cache-Control')).to.eql('no-store'));",
              "pm.test('Owned Checkout in expected environment',()=>{",
              "  pm.expect(data.object).to.eql('checkout');",
              "  pm.expect(data.id).to.match(/^co_[a-f0-9]{32}$/);",
              "  pm.expect(data.environment).to.eql(pm.variables.get('expected_environment'));",
              "  pm.expect(data.currency).to.eql('XOF');",
              "  pm.expect(data.amount).to.match(/^[0-9]+$/);",
              "  pm.expect(['OPEN','PROCESSING','UNKNOWN','SUCCEEDED','FAILED','EXPIRED','CANCELLED']).to.include(data.status);",
              "  if(pm.request.method==='GET'){pm.expect(data.id).to.eql(pm.variables.replaceIn(pm.request.url.toString()).split('?')[0].split('/').pop());}",
              "});",
              "pm.test('Fee is absent before selection or an exact frozen whole-XOF quote',()=>{",
              "  if(data.provider===null){pm.expect(data.faygaw_partner_fee).to.eql(null);pm.expect(data.net_amount).to.eql(null);}",
              "  else{",
              "    pm.expect(['WAVE','ORANGE_MONEY']).to.include(data.provider);",
              "    pm.expect(data.faygaw_partner_fee).to.match(/^[0-9]+$/);pm.expect(data.net_amount).to.match(/^[0-9]+$/);",
              "    ",
              "  }",
              "});",
              "pm.test('Hosted capability stays on the expected origin',()=>{",
              "  if(data.checkout_link!==undefined){",
              "    pm.expect(data.checkout_link).to.match(/^https:\\/\\/hosted-checkout\\.faygaw\\.org\\/c\\/co_[a-f0-9]{32}#token=hcs_(sb|pr)_[A-Za-z0-9_-]{43}$/);",
              "    pm.expect(data.checkout_link.split('#token=')[0]).to.eql('https://hosted-checkout.faygaw.org/c/'+data.id);",
              "    pm.expect(data.checkout_link.split('#token=')[1].slice(0,7)).to.eql(data.environment==='SANDBOX'?'hcs_sb_':'hcs_pr_');",
              "  }",
              "});"
            ]
          }
        }
      ]
    }
  ]
}
