无法从GoDaddy Poynt获取Access Token:JWT无效问题求助
解决GoDaddy Poynt获取Access Token时JWT无效的问题
以下是针对你代码中问题的修正点:
1. 签名算法不匹配
你使用的是RSA私钥,但签名算法指定为HS512(对称哈希算法),RSA密钥对应的正确算法应该是RS512(非对称签名算法),这是JWT无效的核心原因之一。
修正后的JWT编码代码:
$jwt = JWT::encode( $request_data, $secret_key, 'RS512' // 替换为RS512算法 );
2. CURL请求头设置错误
你误用CURLOPT_HEADER来设置请求头,该参数的作用是控制是否返回响应头,正确设置请求头需使用CURLOPT_HTTPHEADER,并传入数组格式的头部信息。
修正后的CURL请求头设置:
curl_setopt($curl_obj, CURLOPT_HTTPHEADER, [ "Accept: application/json", "api-version: 1.2", "Content-Type: application/x-www-form-urlencoded" ]);
3. OAuth参数名不符合标准
POST参数中的grantType不符合OAuth规范,正确参数名应为grant_type。
修正后的POST字段:
curl_setopt($curl_obj, CURLOPT_POSTFIELDS, "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=" . $jwt );
4. 额外验证点
- 确认RSA私钥格式正确,无多余换行、空格,密钥内容完整。
- 检查
iat(签发时间)和exp(过期时间)的时间戳,确保与Poynt服务器时间偏差在5分钟内。 - 验证
jti的长度是否符合要求,当前bin2hex(random_bytes(32))生成的64字符格式是符合标准的。
修正后的关键代码片段:
// JWT编码部分 $jwt = JWT::encode( $request_data, $secret_key, 'RS512' ); // CURL请求部分 $curl_obj = curl_init(); curl_setopt($curl_obj, CURLOPT_POST, 1); curl_setopt($curl_obj, CURLOPT_URL, "https://services.poynt.net/token"); curl_setopt($curl_obj, CURLOPT_HTTPHEADER, [ "Accept: application/json", "api-version: 1.2", "Content-Type: application/x-www-form-urlencoded" ]); curl_setopt($curl_obj, CURLOPT_POSTFIELDS, "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=" . $jwt ); curl_setopt($curl_obj, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($curl_obj); curl_close($curl_obj);
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

