Envoyer le fichier encodé en base64 et JSON via CURL en php
P粉139351297
P粉139351297 2023-08-28 10:22:44
0
1
636
<p>J'essaie d'utiliser CURL pour envoyer un fichier à PANDADOCS via l'appel API Créer un document à partir d'un fichier : https://developers.pandadoc.com/reference/create-document-from-pdf. </p> <p>En plus d'envoyer le fichier, je dois également envoyer un objet de données contenant les destinataires, etc. dans le cadre d'une chaîne de données multipart/form en JSON. Je ne sais pas comment configurer correctement cet appel et je continue de recevoir divers messages d'erreur renvoyés par son API, tels que "Un champ nommé fichier existe" </p> <p>Voici ce que j'ai jusqu'à présent : </p> <pre class="brush:php;toolbar:false;">fonction publique createDocument() { $p = getmypid(); $m = "({$p}) : PandaDoc::créer un document : "; $postfields = tableau(); $postfields['name'] = $this->document->name; $postfields['file'] = $this->document->file //PDF encodé en base 64; $destinataires = tableau( tableau( 'e-mail' => 'a.mcdoogle@test.com', 'first_name' => 'André', 'nom_de_famille' => 'rôle' => 'utilisateur', 'signing_order' => ) ); $données = tableau(); $data['destinataires'] = $destinataires ; $propriétaire = tableau( "email" => "john@example.com" ); $data['propriétaire'] = $propriétaire ; $postfields['data'] = json_encode($data); $header = array("Autorisation : clé API {$this->api_key}", "Type de contenu : multipart/form-data", "accepter" => "application/json") ; $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_URL, $this->url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields); $res = curl_exec($ch); si ($res === faux) { $errno = curl_errno($ch); $erreur = curl_error($ch); error_log("{$m}erreur cURL : {$error} ({$errno})"); throw new Exception("{$m}erreur cURL : {$error} ({$errno})"); } $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close ($ch); error_log("{$m}Résultats de PandaDoc : {$res}"); $response = json_decode($res); retourner $réponse ; }</pré> <p>Quelqu’un peut-il me dire ce que je fais de mal ? </p>
P粉139351297
P粉139351297

répondre à tous(1)
P粉848442185

C'est faux :

$postfields['data'] =  json_encode($data);

Je trouve leur documentation API dérangeante.

Court tutoriel :
Il s'agit d'un simple formulaire HTML multipart/form-data :
Ci-dessous, je traduis ce formulaire en curl.

<form action="<url>" method="post" enctype="multipart/form-data">

<input type="text" name="name1" value="value1" >
<input type="text" name="name2" value="value2" >
<input type="text" name="name3" value="value3" >

<button type="submit">submit</button>
</form>

Pour envoyer ceci en curl, vous devez mettre les données du formulaire dans des champs de publication.

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, '<url>');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "-----------------------------3303153187906175792551542585\r\nContent-Disposition: form-data; name=\"name1\"\r\n\r\nvalue1\r\n-----------------------------3303153187906175792551542585\r\nContent-Disposition: form-data; name=\"name2\"\r\n\r\nvalue2\r\n-----------------------------3303153187906175792551542585\r\nContent-Disposition: form-data; name=\"name3\"\r\n\r\nvalue3\r\n-----------------------------3303153187906175792551542585--\r\n");

$response = curl_exec($ch);

Voici les en-têtes de requête :

Content-Length: 408
Content-Type: application/x-www-form-urlencoded
Accept: */*
Host: my_curl_test_site.com
X-Https: 1

Voici le texte de la demande :

-----------------------------3303153187906175792551542585
Content-Disposition: form-data; name="name1"

value1
-----------------------------3303153187906175792551542585
Content-Disposition: form-data; name="name2"

value2
-----------------------------3303153187906175792551542585
Content-Disposition: form-data; name="name3"

value3
-----------------------------3303153187906175792551542585

J'encode le pdf en Base64 comme ceci :

$pdf = base64_encode(file_get_contents('example.pdf'));

Pour votre API PandaDoc


Il s'agit du champ du document, veuillez noter $pdf ci-dessus.

------BoundaryXXXXXXXXX
Content-Disposition: form-data; name="file"; filename="Sample PandaDoc PDF with Field Tags.pdf"
Content-Type: application/pdf;

$pdf
------BoundaryXXXXXXXXX

Votre type de contenu devra peut-être être application/pdf;base64
Leurs exemples utilisent des données binaires.

Voici votre champ de données

------BoundaryXXXXXXXXX
Content-Disposition: form-data; name="data"

{ 
   "name": "My minimal document",
   "url": "https://example.com/path/to/mydocument.pdf",
   "recipients": [
      {
       "email":"nobody@example.com"
      }
   ],
   "parse_form_fields": false
}
------BoundaryXXXXXXXXX

Source : https://developers.pandadoc.com/docs/upload-and-send-a-local-pdf

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal