You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过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

火山引擎 最新活动