PHP: CURL sendgrid API V3授权

PHP: CURL sendgrid API V3 authorization

我在 curl 和 sendgrid 集成方面需要很多帮助,我想从下面显示的 curl 语句开始:

curl -X "GET" "https://api.sendgrid.com/v3/contactdb/recipients" -H "Authorization: basic key" -H "Content-Type: application/json"

下面的脚本给我一个错误 "message":"request body is invalid"

<?php
$url = 'https://api.sendgrid.com/v3';
$request =  $url.'/contactdb/lists';
// Generate curl request
$userid = 'useid';
$userkey= '12345';

$headers = array(
        'Authorization' => 'Basic xxxxxxx',
        );

$session = curl_init($request);
    // Tell curl to use HTTP get
curl_setopt ($session, CURLOPT_POST, FALSE);
// Tell curl that this is the body of the GET
curl_setopt ($session, CURLOPT_POSTFIELDS, $headers);
curl_setopt($session, CURLOPT_USERPWD, $userid.':'.$userkey); 
// Tell curl not to return headers, but do return the response
curl_setopt($session, CURLOPT_HEADER, False);
// Tell PHP not to use SSLv3 (instead opting for TLS)
curl_setopt($session, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
     // obtain response
$response = curl_exec($session);
var_dump($response);
curl_close($session);
?>

最终,我想集成我网站上的订阅系统,以无缝更新 Sendgrid 联系人列表。如果您认为有更好的方法可以实现这一点,请随时向我指出。谢谢!

根据您的代码,试试这个:

<?php

$url = 'https://api.sendgrid.com/v3/templates';
$request =  $url.'/user/profile';

$params = array(
'name'  => 'test'
  );

$json_post_fields = json_encode($params);


// Generate curl request
$ch = curl_init($request);

$headers = array("Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);


// Apply the JSON to our curl call
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_post_fields);

$data = curl_exec($ch);

if (curl_errno($ch)) {
print "Error: " . curl_error($ch);
} else {
// Show me the result
var_dump($data);
curl_close($ch);
}
?>

此外,在尝试调试此类 API 集成时,我发现将 cURL 绑定到本地代理非常有用,这样我就可以监控 cURL 与 API 之间的 HTTP 通信,例如,

curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:8888");

如果您使用 Windows 并在本地测试 Fiddler 非常适合。

<?php
$url = 'https://api.sendgrid.com/v3';
$request =  $url.'/contactdb/lists';
// Generate curl request
$userid = 'useid';
$userkey= '12345';

$session = curl_init($request);
// Tell curl to use HTTP get
curl_setopt ($session, CURLOPT_POST, FALSE);
// Tell curl that this is the body of the GET
curl_setopt($session, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ; 
curl_setopt($session, CURLOPT_USERPWD, $userid.':'.$userkey); 
// Tell curl not to return headers, but do return the response
curl_setopt($session, CURLOPT_HEADER, False);
curl_setopt($session, CURLOPT_HTTPHEADER,array('Content-Type: application/json')); 
// Tell PHP not to use SSLv3 (instead opting for TLS)
curl_setopt($session, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);

// obtain response
$response = curl_exec($session);
var_dump($response);
curl_close($session);
?>

已解决的版本和工作版本在这里

这是我的解决方案。它基于太多来源而无法列出。

define("SENDGRID_API_KEY","SG.xxxxxxxxxxxxxxxxxxxxxxxx");

//the 'to' parameter can be either be a single email as a string or an array of emails
function email($to,$subject,$message) {

    if (!$to) return;

    //start the params
    $params=[
        'from'=> "yourEmail@address.com",
        'fromname'=> "Your From Name",
        'subject'=> $subject,
        'text'=> preg_replace("/\n\s+/","\n",rtrim(html_entity_decode(strip_tags($message)))),
        'html'=> $message,
    ];

    //if we have an array of email addresses, add a to[i] param for each
    if (is_array($to)) {
        $i=0;
        foreach($to as $t) $params['to['.$i++.']']=$t;

    //just one email, can add simply like this
    } else {
        $params['to']=$to;
    }

    // Generate curl request
    $session = curl_init('https://api.sendgrid.com/api/mail.send.json');
    // Tell PHP not to use SSLv3 (instead opting for TLS)
    curl_setopt($session, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
    curl_setopt($session, CURLOPT_HTTPHEADER, array('Authorization: Bearer '.SENDGRID_API_KEY));
    // Tell curl to use HTTP POST
    curl_setopt ($session, CURLOPT_POST, true);
    // Tell curl that this is the body of the POST
    curl_setopt ($session, CURLOPT_POSTFIELDS, $params);
    // Tell curl not to return headers, but do return the response
    curl_setopt($session, CURLOPT_HEADER, false);
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true);

    //execute and obtain response
    $response = curl_exec($session);
    curl_close($session);

    //no response at all. that's bad!
    if (!$response) {
        $errorMessage="SENDGRID SENT NO RESPONSE<br>";
    } else {
        $response=json_decode($response,true);
        //wasn't a success
        if ($response['message']!='success') {
            $errorMessage="SENDGRID SENDING ERROR<br>Error(s): ".implode("<br>",$response['errors']);
        }
    }
    //finish forming error message and save to log
    if ($errorMessage) {
        $errorMessage.="Subject: ".$subject."<br>To: ";
        if (is_array($to)) {
            $errorMessage.=implode(",",$to);
        //just one email, can add simply like this
        } else {
            $errorMessage.=$to;
        }
        yourOwnLoggingFunction($errorMessage);
    }

    //show full response if needed
 // print_r($response); 

}

//send to one person
email("test@email.com","The Subject","<h1>The Body</h1><p>Goes here</p>");
//send to multiple people
email(["test1@email.com","test2@email.com"],"The Subject","<h1>The Body</h1><p>Goes here</p>");