{
  "info": {
    "name": "FAYGAW — Checkout",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "description": "Créez et consultez un Checkout hébergé. Confirmez le paiement avec GET ou checkout.paid signé, jamais par un retour navigateur. 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 une session Checkout — checkout:write",
      "request": {
        "method": "POST",
        "url": "{{base_url}}/checkouts",
        "header": [
          {
            "key": "Authorization",
            "value": "Bearer {{api_key}}"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Idempotency-Key",
            "value": "example-checkout-abc123XYZ"
          }
        ],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"amount\": \"100\",\n  \"currency\": \"XOF\",\n  \"client_reference\": \"checkout_abc123XYZ\",\n  \"description\": \"Commande test\",\n  \"success_url\": \"https://merchant.example/payment/success\",\n  \"error_url\": \"https://merchant.example/payment/error\",\n  \"metadata\": {\n    \"merchant_site_url\": \"https://merchant.example/checkout/checkout_abc123XYZ\",\n    \"language\": \"fr\"\n  }\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        },
        "description": "Créez et consultez un Checkout hébergé. Confirmez le paiement avec GET ou checkout.paid signé, jamais par un retour navigateur. 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_');",
              "  }",
              "});"
            ]
          }
        }
      ]
    },
    {
      "name": "Lire le Checkout — checkout:read",
      "request": {
        "method": "GET",
        "url": "{{base_url}}/checkouts/co_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
        "header": [
          {
            "key": "Authorization",
            "value": "Bearer {{api_key}}"
          }
        ],
        "description": "Créez et consultez un Checkout hébergé. Confirmez le paiement avec GET ou checkout.paid signé, jamais par un retour navigateur. 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_');",
              "  }",
              "});"
            ]
          }
        }
      ]
    }
  ]
}
