返回空数组的PHP CURL脚本

hiz5n14c  于 2023-04-04  发布在  PHP
关注(0)|答案(2)|浏览(91)

我只是写信给你,因为我正在努力让这段代码工作.我能够调用API的要求从命令行.只要我尝试调用它从一个php函数后,转换为PHP可读的curl它似乎发送,但我只是得到一个空数组作为响应。这是相当混乱,因为我得到了有效的错误消息,在响应从API以前。我将列出php和html表单的代码。

<?php

$name = $_POST['testName'];
$email = $_POST['testEmail'];
$file = $_FILES['testFile'];
$url = $_POST['testURL'];

runSend($file, $name, $email);

function runSend($file, $name, $email){

echo "Success, message sent";
        
echo $file;
echo $name;
echo $email;
echo $url;
        
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://api.boldsign.com/v1/document/send');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
$post = array(
    'Title' => 'Commercial Agreement',
    'Message' => 'Terms, purpose and duration of agreement ',
    'UseTextTags' => 'true',
    'EnableSigningOrder' => 'false',
    'Signers[0][Name]' => 'Example Name',
    'Signers[0][EmailAddress]' => 'example@example.com.au',
    'Signers[0][SignerOrder]' => '0',
    'Signers[0][FormFields][0][FieldType]' => 'Signature',
    'Signers[0][FormFields][0][Name]' => 'sign_field',
    'Signers[0][FormFields][0][PageNumber]' => '1',
    'Signers[0][FormFields][0][Bounds][X]' => '50',
    'Signers[0][FormFields][0][Bounds][Y]' => '50',
    'Signers[0][FormFields][0][Bounds][Width]' => '200',
    'Signers[0][FormFields][0][Bounds][Height]' => '30',
    'Signers[0][FormFields][0][IsRequired]' => 'true',
    'Files' => new CURLFILE($file)
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

$headers = array();
$headers[] = 'X-Api-Key: EXAM76242$PLEA32PIK555EY';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);
<form action="/wp-content/themes/hello-theme-child-master/send-test-file.php" method="post" enctype="multipart/form-data">
        name:
            <input type="text" id="testName" name="testName" value="[7401]"><br>
        email
            <input type="text" id="testEmail" name="testEmail" value="testEmail"><br>
        Select pdf to upload:
            <input type="file" name="testFile" id="testFile">
<input type="text" id="testURL" name="testURL" value="[e2pdf-download id="31" output='url']"><br>
            <input type="submit" value="Send File" name="submit">
    </form>

我已经尝试过无数次重构代码,坦率地说,我被难倒了。
----------------编辑/更新-----------------------------------------
你好,谢谢你.在你的帮助下,我越来越接近.下面是我目前的代码和错误,我得到.如果有人可以再看看,看看他们是否能想到任何可能的原因.再次感谢!

<?php

    if ($_FILES['testFile']['error'] !== UPLOAD_ERR_OK) {
        die("File upload failed with error code " . $_FILES['testFile']['error']);
    }

    //$name = $_POST['testName'];
    //$email = $_POST['testEmail'];
    //$url = $_POST['testURL'];
    //fopen($_FILES["UploadFileName"]["tmp_name"], 'r');
    $file = $_FILES['testFile'];

    runSend($file);

    /*
    $location = "/uploads/test/"_.$_FILENAME['testFile']['name']_;
    $tmp_file = $_FILES['testFile']['tmp_name'];
    move_uploaded_file($tmp_file, $location);
    */

    function runSend($file){

        $ch = curl_init();

        
        curl_setopt($ch, CURLOPT_URL, 'https://api.boldsign.com/v1/document/send');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        $post = array(
            'DisableExpiryAlert' => 'false',
            'ReminderSettings.ReminderDays' => '5',
            'BrandId' => '',
            'ReminderSettings.ReminderCount' => '3',
            'EnableReassign' => 'false',
            'Message' => '',
            'Signers[0][Name]' => 'Enter Name',
            'Signers[0][EmailAddress]' => 'example@example.com.au',
            'Signers[0][SignerOrder]' => '0',
            'Signers[0][FormFields][0][FieldType]' => 'Signature',
            'Signers[0][FormFields][0][Name]' => 'sign_field',
            'Signers[0][FormFields][0][PageNumber]' => '1',
            'Signers[0][FormFields][0][Bounds][X]' => '50',
            'Signers[0][FormFields][0][Bounds][Y]' => '50',
            'Signers[0][FormFields][0][Bounds][Width]' => '200',
            'Signers[0][FormFields][0][Bounds][Height]' => '30',
            'Signers[0][FormFields][0][IsRequired]' => 'true',
            'ExpiryDays' => '30',
            'EnablePrintAndSign' => 'false',
            'AutoDetectFields' => 'false',
            'OnBehalfOf' => '',
            'EnableSigningOrder' => 'false',
            'UseTextTags' => 'true',
            'SendLinkValidTill' => '',
            'Files' => new CURLFILE($file['tmp_name'].'.pdf'),
            'Title' => 'testing',
            'HideDocumentId' => 'false',
            'EnableEmbeddedSigning' => 'false',
            'ExpiryDateType' => 'Days',
            'ReminderSettings.EnableAutoReminder' => 'true',
            'ExpiryValue' => '60',
            'DisableEmails' => 'false'
        );
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

        $headers = array();
        $headers[] = 'Accept: application/json';
        $headers[] = 'X-API-Key: GWAGsagsgaEAWT2545q3AF';
        $headers[] = 'Content-Type: multipart/form-data';
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

        $result = curl_exec($ch);
        
        echo $result;
        
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        echo $httpcode;
        
        if (curl_errno($ch)) {
            echo 'Error:' . curl_error($ch);
        }
        curl_close($ch);

    };
?>

我目前收到的错误消息:0错误:无法打开文件“/tmp/phpWQLlLP.pdf”

n53p2ov0

n53p2ov01#

根据提供的代码,有几种可能的原因导致您从API获得空响应数组。这里有一些需要检查的事项和潜在的解决方案:
1.变量范围问题:在runSend函数中,$url变量不在作用域中,这可能会在尝试访问其值时导致问题。您应该将$url变量作为参数传递给函数:

runSend($file, $name, $email, $url);

然后更新函数定义:

function runSend($file, $name, $email, $url){ ... }

1.处理上传的文件:您将$file变量直接传递给CURLFile构造函数。但是,$file是一个关联数组,包含有关上传文件的信息。您应该将$file数组的tmp_name属性传递给构造函数:

'Files' => new CURLFILE($file['tmp_name'])

1.使用API特定的内容类型:当通过cURL发送文件时,您可能需要设置特定的内容类型。在这种情况下,您应该在设置CURLOPT_POSTFIELDS选项后添加这一行:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data'));

1.调试API响应:要调试API响应,您可以在执行cURL请求后立即打印它:

echo $result;

通过这种方式,您可以查看API是否返回任何错误消息,或者问题是否在客户端。
1.错误处理:在继续cURL请求之前检查文件是否成功上传是一个很好的做法。您可以在获取$_FILES ['testFile']之后添加一个简单的文件上传检查:

if ($_FILES['testFile']['error'] !== UPLOAD_ERR_OK) {
    die("File upload failed with error code " . $_FILES['testFile']['error']);
}

这将帮助您识别文件上传过程本身的任何问题。
1.参数格式不正确:API可能需要不同的参数格式,例如JSON。请查看API文档,了解是否需要以特定格式对参数进行编码。
如果API需要JSON payload,您可以更改$post数组并使用json_encode将其转换为JSON字符串。然后,将Content-Type头设置为application/json。
下面是一个如何做到这一点的例子:

$post = array(
    // Your parameters here
);

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'X-Api-Key: EXAM76242$PLEA32PIK555EY'));

在实施这些更改后,您应该更好地了解问题的原因。请记住检查API文档以了解任何特定要求,并确保您的实施符合这些要求。如果您仍然存在问题,请考虑检查API日志或联系API支持以获得进一步帮助。
既然你使用的是wordpress,那么激活调试模式来查看日志文件中是否有错误也是一个好主意。
希望这个有用。
---编辑答案---
您似乎遇到了PHP脚本中的文件处理问题。错误消息表明脚本无法打开临时文件。
问题在以下行中:

'Files' => new CURLFILE($file['tmp_name'].'.pdf'),

您在临时文件名后面附加了'.pdf',这是不必要的。PHP生成的临时文件已经有一个唯一的名称,因此向其添加文件扩展名可能会导致脚本查找不存在的文件。
要解决此问题,请将该行更改为:

'Files' => new CURLFILE($file['tmp_name']),

此外,您可能希望设置CURLFile的文件名和内容类型。您可以在创建CURLFile示例时通过传递其他参数来实现此目的:

'Files' => new CURLFILE($file['tmp_name'], $file['type'], $file['name']),

这将确保文件被接收服务器正确识别。
最后,通过检查临时文件是否存在并且可读,确保文件上传正常工作:

if (!is_uploaded_file($file['tmp_name'])) {
    die('Error: File upload issue.');
}

if (!is_readable($file['tmp_name'])) {
    die('Error: Temporary file not readable.');
}

在调用runSend函数之前添加这些行,以确保文件已上载且可访问。
我希望这有帮助!让我知道如果你有任何问题或需要进一步的帮助。

5vf7fwbs

5vf7fwbs2#

目前尚不清楚最终结果是什么,但一旦为curl请求提供了合适的参数来处理API的SSL端点,以下内容似乎可以正常工作example.com。

<?php

    function runSend( $url, $file, $name, $email ){
        /*
            Download a valid cacert.pem from 
            https://curl.haxx.se/docs/caextract.html
            and edit the path below to suit your setup.
        */
        $cacert='c:/wwwroot/cacert.pem';
        
        $ch = curl_init();
        
        /*
            supply the various SSL details
        */
        if( parse_url( $url, PHP_URL_SCHEME )=='https' ){
            curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, true );
            curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2 );
            curl_setopt( $ch, CURLOPT_CAINFO, $cacert );
        }
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        $post = array(
            'Title' => 'Commercial Agreement',
            'Message' => 'Terms, purpose and duration of agreement ',
            'UseTextTags' => 'true',
            'EnableSigningOrder' => 'false',
            'Signers[0][Name]' => 'Example Name',
            'Signers[0][EmailAddress]' => 'example@example.com.au',
            'Signers[0][SignerOrder]' => '0',
            'Signers[0][FormFields][0][FieldType]' => 'Signature',
            'Signers[0][FormFields][0][Name]' => 'sign_field',
            'Signers[0][FormFields][0][PageNumber]' => '1',
            'Signers[0][FormFields][0][Bounds][X]' => '50',
            'Signers[0][FormFields][0][Bounds][Y]' => '50',
            'Signers[0][FormFields][0][Bounds][Width]' => '200',
            'Signers[0][FormFields][0][Bounds][Height]' => '30',
            'Signers[0][FormFields][0][IsRequired]' => 'true',
            'Files' => new CURLFILE( $file )
        );
        curl_setopt( $ch, CURLOPT_POSTFIELDS, $post );

        $headers = array();
        $headers[] = 'X-Api-Key: EXAM76242$PLEA32PIK555EY';
        curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );

        $result = curl_exec( $ch );
        if( curl_errno( $ch ) ) echo 'Error:' . curl_error( $ch );
        curl_close( $ch );
        
        return $result;
    }
    
    
    # emulate POST array
    $_POST=array(
        'testName'  =>  'Griselda Grizzleguts',
        'testEmail' =>  'gg@gmail.com',
        'testURL'   =>  'https://example.com'
    );
    
    # configure curl request parameters
    $url='https://api.boldsign.com/v1/document/send';
    $name = $_POST['testName'];
    $email = $_POST['testEmail'];
    $url = $_POST['testURL'];
    $file='c:\temp\ssldebug.txt';
    
    # make the request & print result
    $result=runSend( $url, $file, $name, $email );
    if( $result ){
        printf('<pre>%s</pre>',print_r($result,true));
    }
?>

相关问题