OPPO广告联盟无PHP官方SDK,需自行实现服务端API调用;核心是严格按规范构造HMAC-SHA256签名请求GET /v1/report/data接口,注意时间戳、Content-MD5、header格式及reportType大小写等细节。

OPPO广告联盟API没有PHP官方SDK
OPPO广告联盟目前只提供 Java、Android、iOS 的官方接入方式,api_php 这类命名并不存在——你搜到的所谓“PHP SDK”基本是第三方非维护脚本或简单封装的 cURL 调用,不带签名逻辑、无错误重试、不更新鉴权规则。
实际能走通的路径只有一条:自己实现 OPPO 的「服务端 API」调用,核心是 GET /v1/report/data 这类报表接口,但必须严格按文档做 HMAC-SHA256 签名,且时间戳误差不能超 5 分钟。
签名失败是90% PHP请求被拒的直接原因
OPPO 要求所有请求头带 X-Oppo-Date 和 X-Oppo-Authorization,后者由 AccessKeyId:Signature 拼接而成,而 Signature 是对规范字符串做 hash_hmac('sha256', $stringToSign, $secretKey) 得到的 base64 编码结果。
常见翻车点:
立即学习“PHP免费学习笔记(深入)”;
-
$stringToSign必须严格按 “HTTP_METHOD\nContent-MD5\nContent-Type\nX-Oppo-Date\nCanonicalizedOppoHeaders\nCanonicalizedResource” 拼接,换行用\n,不是\r\n -
Content-MD5头必须存在(即使空请求体),值为base64_encode(md5('', true)),即47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU= -
X-Oppo-Date格式必须是Y-m-d\TH:i:s\Z(UTC 时间),用gmdate('Y-m-d\TH:i:s\Z'),别用date() - 拼接
CanonicalizedOppoHeaders时,要把所有x-oppo-开头的 header 小写、排序、去空格后用\n连接,末尾也要加\n
获取广告展示与点击数据要分两步走
OPPO 不允许一次拉取混合指标。你要分别调用两个接口:
- 曝光数据:请求
GET /v1/report/data?reportType=exposure&startTime=2024-01-01&endTime=2024-01-02 - 点击数据:请求
GET /v1/report/data?reportType=click&startTime=2024-01-01&endTime=2024-01-02
注意:reportType 只认小写 exposure/click,传 EXPOSURE 或 ad_impression 直接返回 400 Bad Request;时间范围最多查 31 天,且 startTime 和 endTime 必须是自然日(00:00:00–23:59:59 UTC),不能带时分秒偏移。
cURL 请求里最容易漏掉的三个header
少任何一个,401 Unauthorized 或 403 Forbidden 就稳了:
-
Content-Type: application/json(即使 GET 请求也得带) -
X-Oppo-Date: 2024-01-01T00:00:00Z(必须 UTC,必须带 Z) -
X-Oppo-Authorization: OPPO_ACCESS_KEY_ID:Base64(Signature)(注意冒号前后无空格)
调试时建议先用 curl -v 打印完整请求头,和 OPPO 文档里的示例逐行比对。PHP 里用 curl_setopt($ch, CURLOPT_HEADER, true) 也能看到响应头里的 X-Oppo-Request-Id,出问题时把这个 ID 提给 OPPO 支持,比截图快得多。
真正卡住的地方往往不是逻辑,而是签名字符串里多了一个空格、时间少了 Z、或者 base64 编码没用原始二进制 md5 结果——这些细节文档里不会加粗,但错一个就全盘失败。



















