如何通过PHP调用Udemy API获取课程促销价格?
解决Udemy API获取促销价格的问题
我之前也碰到过一模一样的情况!Udemy API的促销价格确实不在课程默认返回的基础字段里,而且你的授权头格式还有个小错误,这俩点大概率是导致你拿不到数据的原因。下面一步步给你理顺:
1. 先修正Authorization头的格式错误
你现在的授权写法不对,正确的Basic Auth应该是把client_id:client_secret整个字符串做base64编码,再加上Basic 前缀,不是分别编码client_id和client_secret。修改后的HTTP头应该是这样:
$clientId = 'YOUR_CLIENT_ID'; $clientSecret = 'YOUR_CLIENT_SECRET'; // 把clientId和clientSecret用冒号拼接后再做base64编码 $authToken = base64_encode("$clientId:$clientSecret"); curl_setopt($ch,CURLOPT_HTTPHEADER,array( "X-Udemy-Client-Id: $clientId", "X-Udemy-Client-Secret: $clientSecret", "Authorization: Basic $authToken", "Accept: application/json, text/plain, */*" ));
这个格式错误可能会导致API返回的字段不完整,因为权限验证没做对。
2. 获取促销价格的两种有效方式
Udemy的促销价格信息主要通过两个途径获取:
方式一:在课程请求中明确指定price_detail字段
哪怕你用了@all,有些关联字段默认也不会返回,得明确指定price_detail。修改你的课程请求URL:
$url = "https://www.udemy.com/api-2.0/courses/$id?fields[course]=@all,price_detail";
请求后,你能在返回的课程对象里找到price_detail属性,里面包含:
current_price:当前显示的价格(也就是促销价,如果有的话)original_price:课程原价discount:折扣幅度(促销状态下会有值)
方式二:单独请求课程价格端点
如果需要更详细的价格信息(比如不同地区的定价、促销有效期等),可以单独请求/courses/{id}/prices端点:
$priceUrl = "https://www.udemy.com/api-2.0/courses/$id/prices"; // 用同样的curl配置请求这个URL $priceResult = curl_exec($ch); $priceResult = json_decode($priceResult);
返回的结果是一个价格数组,每个条目里会有:
price:当前售价(促销价)list_price:原价is_promotion:是否处于促销状态currency:货币类型
3. 修改后的完整代码示例
把上面的修正整合到你的代码里,最终版本大概是这样:
function getcourse($id) { header('Content-Type: application/json'); $clientId = 'YOUR_CLIENT_ID'; $clientSecret = 'YOUR_CLIENT_SECRET'; $authToken = base64_encode("$clientId:$clientSecret"); // 课程基础信息URL(包含price_detail字段) $courseUrl = "https://www.udemy.com/api-2.0/courses/$id?fields[course]=@all,price_detail"; // 课程详细价格URL $priceUrl = "https://www.udemy.com/api-2.0/courses/$id/prices"; $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( "X-Udemy-Client-Id: $clientId", "X-Udemy-Client-Secret: $clientSecret", "Authorization: Basic $authToken", "Accept: application/json, text/plain, */*" )); // 获取课程基础信息 curl_setopt($ch, CURLOPT_URL, $courseUrl); $courseData = curl_exec($ch); $courseData = json_decode($courseData); // 获取详细价格信息 curl_setopt($ch, CURLOPT_URL, $priceUrl); $priceData = curl_exec($ch); $priceData = json_decode($priceData); curl_close($ch); // 把价格数据合并到课程对象里,方便后续使用 if ($priceData) { $courseData->detailed_prices = $priceData; } return $courseData; }
最后提醒
确保你的Udemy API密钥有足够的权限,部分价格字段可能需要商业级别的API访问权限。如果还是拿不到数据,可以去Udemy的API控制台检查你的权限设置。
内容的提问来源于stack exchange,提问作者dcoder1989




