我正在尝试使用oauth2 auth方法向VendHQ Api发送一个发布请求。我有正确的代码,client_id,client_secret等,因为它在Postman中工作正常但是当我尝试使用PHP curl发送相同的数据时,我收到错误:
错误
'error' => string 'invalid_request' (length=15)
'error_description' => string 'The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed. Check the "grant_type" parameter.' (length=179)
这是Requesting Access Token的文档,这是我的代码,它试图获取访问令牌。
PHP代码:
$prefix = $vend[0]['domain_prefix'];
$request_url = 'https://'.$prefix.'.vendhq.com/api/1.0/token';
$body['code'] = $vend[0]['code'];;
$body['client_id'] = $vend[0]['app_id'];;
$body['client_secret'] = $vend[0]['app_secret'];;
$body['grant_type'] = 'authorization_code';
$body['redirect_uri'] = $vend[0]['redirect_uri'];;
$response = $this->invoke($request_url, 'POST', $body);
调用功能
private function invoke($url, $method, $data = null)
{
$ch = curl_init($url);
if($method=='POST'){
if(isset($data)){
$data_string = json_encode($data);
}
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
$headers = array();
$headers[] = "Content-Type: application/x-www-form-urlencoded;charset=UTF-8";
$headers[] = 'Content-Length: '.strlen($data_string);
echo '<br>Curl Headers';
var_dump($headers);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}//END POST
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
$info = curl_getinfo($ch);
echo '<pre>Curl Info<br>';
var_dump($info);
echo '</pre>';
curl_close($ch);
$json_output = json_decode($json, true);
return $json_output;
}//end function
我相信我发送的一切都很好,但卷发正在发送但是从卷曲信息我得到了这个
'content_type' => string 'application/json; charset=UTF-8' (length=31)
但VendAPI Documentation表示将发布数据发送为“application / x-www-form-urlencoded”。
注意这些参数应作为“application / x-www-form-urlencoded”发送 POST请求的编码正文
我做错了什么?
答案 0 :(得分:1)
在此处发布问题后解决了问题。
问题是,我正在尝试使用application/x-www-form-urlencode
内容类型发布数据,但我正在以json格式发送数据。我从调用函数
if(isset($data)){
$data_string = json_encode($data);
}
并设置curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
除了创建$body
数组外,我创建了字符串:
$body = 'code='.$vend[0]['code'];
$body .= '&client_id='.$vend[0]['app_id'];
$body .= '&client_secret='.$vend[0]['app_secret'];
$body .= '&grant_type=authorization_code';
$body .= '&redirect_uri='.$vend[0]['redirect_uri'];
一切正常:)
答案 1 :(得分:0)
谢谢!这是使用您的答案后对我有用的完整示例:
labelHeight
但是,发送的标头仍然是Content-Type:application / json。