本地沙箱环境PHP file_get_contents调用PayPal OAuth2接口返回401未授权
你的PHP请求返回401是因为三个关键问题,对比AJAX请求就能看出差异:
问题1:请求体格式不匹配
你设置的Content-Type是application/x-www-form-urlencoded,但PHP代码里的请求体用了JSON格式字符串"{'grant_type' : 'client_credentials'}",而PayPal令牌接口要求urlencoded格式的键值对。AJAX里的data是对象,jQuery会自动转换为正确的grant_type=client_credentials格式,所以能正常执行。
问题2:请求头格式错误
PHP的stream_context_create中,http选项里的headers需要是字符串数组,而非关联数组。关联数组格式会被解析错误,导致头信息无法正确传递。
问题3:变量名拼写错误
代码里env('PAYBAL_CLIENT')少了一个字母P,应为PAYPAL_CLIENT,这会导致获取错误的Client ID,直接触发401验证失败。
修正后的PHP代码
$client_id = env('PAYPAL_CLIENT'); $client_secret = env('PAYPAL_SECRET'); $auth = base64_encode("$client_id:$client_secret"); $opts = array('http' => array( 'method' => 'POST', 'headers' => [ "Content-Type: application/x-www-form-urlencoded", "Authorization: Basic $auth" ], 'content' => "grant_type=client_credentials" // stream_context中POST请求体参数用content而非body ) ); $context = stream_context_create($opts); $url = "https://api-m.sandbox.paypal.com/v1/oauth2/token"; $result = file_get_contents($url, false, $context);
内容的提问来源于stack exchange,提问作者user8459720
相关产品推荐
相关产品推荐

