<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Applications</title>
		<link>https://www.developpez.net/forums/</link>
		<description>Vos questions relatives aux applications réseau</description>
		<language>fr</language>
		<lastBuildDate>Sat, 25 Jul 2026 23:12:33 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.png</url>
			<title>Forum du club des développeurs et IT Pro - Applications</title>
			<link>https://www.developpez.net/forums/</link>
		</image>
		<item>
			<title><![CDATA[Encore un problème d'API et je pense d'authentification]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2184169&amp;goto=newpost</link>
			<pubDate>Wed, 10 Jun 2026 16:12:14 GMT</pubDate>
			<description>Bonjour, je rencontre de...</description>
			<content:encoded><![CDATA[<div>Bonjour, je rencontre de nouveau un souci avec une API <br />
le fournisseur me donne une Clé et secret ID <br />
je calcule un HASH ensuite que je mets en base 64 <br />
je crée ensuite un autorizationHeader <br />
<br />
    authorizationHeader := 'GCS v1HMAC:' + apiKey + ':' + hmacSignature;<br />
<br />
que je mets ainsi dans ma requête<br />
    Headers[0] := TNameValuePair.Create('Authorization', authorizationHeader);<br />
    Headers[1] := TNameValuePair.Create('Date', dateRFC1123);<br />
    Headers[2] := TNameValuePair.Create('Content-Type', contentType);<br />
    Headers[3] := TNameValuePair.Create('Accept', 'application/json');<br />
<br />
en faisant ça j'ai systématiquement une erreur 403 <br />
<br />
[18:08:12] Response Content:<br />
[18:08:12] {<br />
  &quot;errorId&quot;: &quot;cd56e7ef-9d2a-4dbf-901b-f12868521003&quot;,<br />
  &quot;errors&quot;: [<br />
    {<br />
      &quot;code&quot;: &quot;9007&quot;,<br />
      &quot;id&quot;: &quot;ACCESS_TO_MERCHANT_NOT_ALLOWED&quot;,<br />
      &quot;category&quot;: &quot;DIRECT_PLATFORM_ERROR&quot;,<br />
      &quot;message&quot;: &quot;ACCESS_TO_MERCHANT_NOT_ALLOWED&quot;,<br />
      &quot;httpStatusCode&quot;: 403<br />
    }<br />
  ],<br />
  &quot;status&quot;: 403<br />
}<br />
[18:08:12] <br />
[18:08:12] ERROR 403: ACCESS_TO_MERCHANT_NOT_ALLOWED.<br />
[18:08:12] Check merchant access, API key permissions, and IP whitelist.<br />
[18:08:12] <br />
[18:08:12] === Payment Links API Test Completed ===<br />
<br />
<br />
<font size="5"><b>Je me demande s'il ne faut pas utiliser   <br />
TOAuth1Authenticator  mais je ne sais pas  comment le paramétrer ici, si quelqu'un a une idée, je mets le code complet de la procédure ci dessous.</b><br />
</font><br />
Merci d'avance pout toute aide.<br />
<br />
<br />
<br />
<br />
procedure TPaymentLinksTestForm.CreatePaymentLink;<br />
var<br />
  HTTPClient: THTTPClient;<br />
  RequestBodyStream: TStringStream;<br />
  Response: IHTTPResponse;<br />
  Headers: TNetHeaders;<br />
<br />
  pspid: string;<br />
  apiKey: string;<br />
  secretKey: string;<br />
<br />
  requestMethod: string;<br />
  contentType: string;<br />
  baseURL: string;<br />
  resourcePath: string;<br />
  fullURL: string;<br />
<br />
  dateRFC1123: string;<br />
  stringToHash: string;<br />
  hmacSignature: string;<br />
  authorizationHeader: string;<br />
<br />
  jsonBody: string;<br />
  responseContent: string;<br />
begin<br />
  try<br />
    LogMessage('=== Payment Links API Test Started ===');<br />
<br />
    // =========================================================<br />
    // CONFIGURATION<br />
    // =========================================================<br />
    pspid := 'PRINTEMPS4';<br />
<br />
    // Replace these values with the real API key and secret.<br />
    // Important: if the previous secret was shared externally, rotate it.<br />
    apiKey := 'YOUR_API_KEY_HERE';<br />
    secretKey := 'YOUR_SECRET_KEY_HERE';<br />
<br />
    requestMethod := 'POST';<br />
    contentType := 'application/json';<br />
<br />
    baseURL := 'https://payment.preprod.direct.worldline-solutions.com';<br />
<br />
    // This path is used BOTH for the URL and for the HMAC string.<br />
    // For the HMAC, it must be the path only, not the full URL.<br />
    resourcePath := '/v2/' + pspid + '/paymentlinks';<br />
<br />
    fullURL := baseURL + resourcePath;<br />
<br />
    LogMessage('PSPID: ' + pspid);<br />
    LogMessage('Request Method: ' + requestMethod);<br />
    LogMessage('Content-Type: ' + contentType);<br />
    LogMessage('Base URL: ' + baseURL);<br />
    LogMessage('Resource Path: ' + resourcePath);<br />
    LogMessage('Full URL: ' + fullURL);<br />
    LogMessage('');<br />
<br />
    // =========================================================<br />
    // DATE HEADER<br />
    // =========================================================<br />
    dateRFC1123 := GetRFC1123DateTime;<br />
<br />
    LogMessage('Date header: ' + dateRFC1123);<br />
    LogMessage('');<br />
<br />
    // =========================================================<br />
    // HMAC SIGNATURE<br />
    // =========================================================<br />
    // Worldline HMAC string format:<br />
    //<br />
    // POST<br />
    // application/json<br />
    // Tue, 10 Jun 2026 12:34:56 GMT<br />
    // /v2/PRINTEMPS4/paymentlinks<br />
    //<br />
    // Use LF only: #10<br />
    // Do not use CRLF: #13#10<br />
    // Do not add the full host.<br />
    // Do not add an extra blank line unless the API documentation requires<br />
    // signed x-gcs headers.<br />
    stringToHash :=<br />
      requestMethod + #10 +<br />
      contentType + #10 +<br />
      dateRFC1123 + #10 +<br />
      resourcePath;<br />
<br />
    LogMessage('String To Hash:');<br />
    LogMessage(StringReplace(stringToHash, #10, '\n', [rfReplaceAll]));<br />
    LogMessage('');<br />
<br />
    hmacSignature := ComputeHMACSHA256(stringToHash, secretKey);<br />
<br />
    authorizationHeader := 'GCS v1HMAC:' + apiKey + ':' + hmacSignature;<br />
<br />
    LogMessage('HMAC Signature: ' + hmacSignature);<br />
    LogMessage('Authorization Header: GCS v1HMAC:' + apiKey + ':&lt;signature hidden&gt;');<br />
    LogMessage('');<br />
<br />
    // =========================================================<br />
    // JSON BODY<br />
    // =========================================================<br />
    jsonBody :=<br />
      '{' + #13#10 +<br />
      '  &quot;expirationDate&quot;: &quot;2026-08-01T14:15:22Z&quot;,' + #13#10 +<br />
      '  &quot;description&quot;: &quot;TEST Payment Link - ' + FormatDateTime('yyyymmdd hhnn', Now) + '&quot;,' + #13#10 +<br />
      '  &quot;paymentLinkOrder&quot;: {' + #13#10 +<br />
      '    &quot;merchantReference&quot;: &quot;PRINTEMPS4-' + FormatDateTime('yyyymmddhhnnss', Now) + '&quot;,' + #13#10 +<br />
      '    &quot;amount&quot;: {' + #13#10 +<br />
      '      &quot;amount&quot;: 1000,' + #13#10 +<br />
      '      &quot;currencyCode&quot;: &quot;EUR&quot;' + #13#10 +<br />
      '    }' + #13#10 +<br />
      '  },' + #13#10 +<br />
      '  &quot;recipientName&quot;: &quot;Jean Bon&quot;,' + #13#10 +<br />
      '  &quot;merchantReference&quot;: &quot;your-order-' + FormatDateTime('yyyymmddhhnnss', Now) + '&quot;' + #13#10 +<br />
      '}';<br />
<br />
    LogMessage('JSON Body:');<br />
    LogMessage(jsonBody);<br />
    LogMessage('');<br />
<br />
    // =========================================================<br />
    // HTTP HEADERS<br />
    // =========================================================<br />
    SetLength(Headers, 4);<br />
<br />
    Headers[0] := TNameValuePair.Create('Authorization', authorizationHeader);<br />
    Headers[1] := TNameValuePair.Create('Date', dateRFC1123);<br />
    Headers[2] := TNameValuePair.Create('Content-Type', contentType);<br />
    Headers[3] := TNameValuePair.Create('Accept', 'application/json');<br />
<br />
    LogMessage('Headers:');<br />
    LogMessage('  Authorization: GCS v1HMAC:' + apiKey + ':&lt;signature hidden&gt;');<br />
    LogMessage('  Date: ' + dateRFC1123);<br />
    LogMessage('  Content-Type: ' + contentType);<br />
    LogMessage('  Accept: application/json');<br />
    LogMessage('');<br />
<br />
    // =========================================================<br />
    // EXECUTE REQUEST<br />
    // =========================================================<br />
    HTTPClient := THTTPClient.Create;<br />
    try<br />
      HTTPClient.ConnectionTimeout := 30000;<br />
      HTTPClient.ResponseTimeout := 30000;<br />
      HTTPClient.UserAgent := 'Delphi Payment Links Test';<br />
<br />
      RequestBodyStream := TStringStream.Create(jsonBody, TEncoding.UTF8);<br />
      try<br />
        RequestBodyStream.Position := 0;<br />
<br />
        LogMessage('Executing POST request...');<br />
        LogMessage('');<br />
<br />
        Response := HTTPClient.Post(<br />
          fullURL,<br />
          RequestBodyStream,<br />
          nil,<br />
          Headers<br />
        );<br />
<br />
        LogMessage('=== RESPONSE ===');<br />
        LogMessage('HTTP Status Code: ' + IntToStr(Response.StatusCode));<br />
        LogMessage('Status Text: ' + Response.StatusText);<br />
        LogMessage('');<br />
<br />
        responseContent := Response.ContentAsString(TEncoding.UTF8);<br />
<br />
        LogMessage('Response Content:');<br />
        LogMessage(responseContent);<br />
        LogMessage('');<br />
<br />
        case Response.StatusCode of<br />
          200, 201:<br />
            begin<br />
              LogMessage('SUCCESS: Payment Link created.');<br />
            end;<br />
<br />
          400:<br />
            begin<br />
              LogMessage('ERROR 400: Bad Request.');<br />
              LogMessage('Check the JSON payload/schema.');<br />
            end;<br />
<br />
          401:<br />
            begin<br />
              LogMessage('ERROR 401: Unauthorized.');<br />
              LogMessage('Check API key, secret key, Date header, HMAC string, and Content-Type.');<br />
            end;<br />
<br />
          403:<br />
            begin<br />
              LogMessage('ERROR 403: ACCESS_TO_MERCHANT_NOT_ALLOWED.');<br />
              LogMessage('Check merchant access, API key permissions, and IP whitelist.');<br />
            end;<br />
<br />
          406:<br />
            begin<br />
              LogMessage('ERROR 406: Not Acceptable.');<br />
              LogMessage('Check the endpoint URL, Accept header, Content-Type header, and Payment Links API activation.');<br />
            end;<br />
<br />
        else<br />
          begin<br />
            LogMessage('ERROR: HTTP ' + IntToStr(Response.StatusCode));<br />
          end;<br />
        end;<br />
<br />
      finally<br />
        RequestBodyStream.Free;<br />
      end;<br />
<br />
    finally<br />
      HTTPClient.Free;<br />
    end;<br />
<br />
    LogMessage('');<br />
    LogMessage('=== Payment Links API Test Completed ===');<br />
<br />
  except<br />
    on E: Exception do<br />
    begin<br />
      LogMessage('');<br />
      LogMessage('EXCEPTION: ' + E.ClassName + ' - ' + E.Message);<br />
    end;<br />
  end;<br />
end;</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1809/systemes/reseaux/applications/">Applications</category>
			<dc:creator>nakos91</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2184169/systemes/reseaux/applications/probleme-d-api-pense-d-authentification/</guid>
		</item>
	</channel>
</rss>
