这个问题与其他已经被问过的问题相似,但答案没有帮助,我认为有一个关键部分缺失了。我正在MailChimp OAuth2流程的第4步,该流程需要向授权url发送带外帖子(
see here
). 它不断返回错误:invalid\u grant,据我所知,这可能表示有许多不同的错误。这是我的代码(我使用的是Yii2)。
public function actionMailchimpAuthorize()
{
$redirect_uri = Url::toRoute(['controller/mailchimp-token'], 'https');
$base_uri = 'https://login.mailchimp.com/oauth2/authorize';
$params = '?response_type=code&client_id=' . Model::CLIENT_ID . '&redirect_uri=' . urlencode($redirect_uri);
$authorize_uri = $base_uri . $params;
return $this->render('mailchimpAuthorize', [
'authorize_uri' => $authorize_uri,
]);
}
public function actionMailchimpToken($code=NULL)
{
$redirect_uri = Url::toRoute(['controller/mailchimp-token'], 'https');
$token_uri = 'https://login.mailchimp.com/oauth2/token';
$params = [
'grant_type' => 'authorization_code',
'client_id' => Model::CLIENT_ID,
'client_secret' => Model::CLIENT_SECRET,
'redirect_uri' => urlencode($redirect_uri),
'code' => $code,
];
$user_agent = 'oauth2-draft-v10';
$headers = ['Accept: application/json'];
$res = Utility::post($token_uri, $params, $user_agent, $headers);
var_dump($res);
}
public function post($url, $params, $user_agent = NULL, $headers = NULL)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$post = http_build_query($params);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
isset($user_agent) ? curl_setopt($ch, CURLOPT_USERAGENT, $user_agent) : NULL;
isset($headers) ? curl_setopt($ch, CURLOPT_HTTPHEADER, $headers) : NULL;
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
答案就在这里,所以要注意重定向URI的匹配。但有三个地方可以输入返回uri:注册应用程序时在Mailchimp中,在授权url中,以及令牌url中。这三个都需要精确地进行macth,还是只需要auth和token URI?我试过各种组合,但都没有用。我的问题可能有所不同,但这是我唯一不清楚的(我想)。和我之前的很多人一样,我对这一个也很着迷。