oppo推送需通过服务端http api调用,php仅作请求发起方;须用hmac-sha256签名、毫秒时间戳、唯一nonce,严格按格式构造authorization头与json body,否则易触发40012/40015错误。

OPPO 推送 SDK 不支持 PHP 直接调用
PHP 不能像 Android 原生那样集成 OppoPushSDK,因为 OPPO 的推送客户端 SDK 只提供 Java/Kotlin(Android)和 iOS 原生版本,没有 PHP 版本的客户端库。所谓“PHP 调用 OPPO 推送”,实际是指服务端通过 OPPO 开放平台提供的 HTTP API 发送消息,PHP 仅作为后端服务发起请求。
必须用服务端 API:/v1/message/send 接口
OPPO 开放平台只开放了标准 RESTful 接口,所有推送动作都得走 POST https://api.oppomobile.com/v1/message/send,PHP 需要自己构造签名、组装 JSON body、发起 HTTPS 请求。这不是封装好的 SDK 调用,而是典型的 OAuth2 + 自定义签名 HTTP 调用。
- 必须提前在 OPPO 开放平台申请应用,拿到
app_key、app_secret和master_secret - 签名算法是 HMAC-SHA256,密钥为
app_secret,原文是method + \n + uri + \n + timestamp + \n + nonce - 请求头必须带
Authorization(含app_key、timestamp、nonce、signature)、Content-Type: application/json - body 中的
target_type填token(单推)或alias(别名推),不能填设备 ID 或手机号
cURL 发起请求时容易漏掉的点
用 PHP 的 curl_exec() 调用 OPPO 接口,看似简单,但失败率很高,多数卡在认证或格式问题上:
- 时间戳
timestamp必须是毫秒级整数(不是秒),且与 OPPO 服务器时间偏差不能超过 5 分钟,建议用(int)(microtime(true) * 1000) -
nonce必须每次唯一(推荐bin2hex(random_bytes(8))),重复会触发限流 - OPPO 要求 body 中的
content字段必须是 JSON 字符串(即双引号、无换行),不是 PHP 数组;如果传了数组,json_encode($arr, JSON_UNESCAPED_UNICODE)是必须的 - 证书验证默认开启,若本地 cURL 报
SSL certificate problem,应显式设置CURLOPT_CAINFO或用系统 CA 包,而非关掉CURLOPT_SSL_VERIFYPEER
返回错误码 40012 / 40015 怎么快速定位
这两个是最常遇到的错误:40012 表示签名无效,40015 表示参数缺失或格式错误。不要盲目重试,先检查这几项:
- 拼签名原文时,
uri必须是/v1/message/send(不带域名、不带查询参数、开头有斜杠) -
Authorization头里各字段顺序必须是app_key="xxx",timestamp="xxx",nonce="xxx",signature="xxx",缺引号、多空格、顺序错都会 40012 - body 中
token或alias值不能为空字符串,也不能是 null;OPPO 对 token 格式有校验(长度、字符集),非法 token 会直接 40015 - 别用
file_get_contents('php://input')测试接口——它不发 POST body,必须用curl_setopt($ch, CURLOPT_POSTFIELDS, $json)
OPPO 接口不返回详细错误原因,只给 code 和 message,调试阶段建议把完整请求头、body、签名原文全打日志,比对文档示例一步一验。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











