推送消息,必须带上deviceTokens(requestId)
获取appid
进入“应用信息”页面后,在“应用信息”区域获取应用的APP ID。
代码封装
/**
* 发送Push消息
* @param array $deviceTokens 指定发送用户
* @param string $title 推送标题
* @param string $description 通知栏消息内容
* @param string $page 快应用界面的path
* @param array $params 快应用界面时携带的参数
* @return bool|string
* @throws Exception
* 官方文档: https://developer.huawei.com/consumer/cn/doc/development/quickApp-Guides/quickapp-access-push-kit#h2-1577437411178
*/
function sendPushMessage($deviceTokens=[],$title='',$description='',$page='',$params=[]){
$appId = "102156515";//用户在华为开发者联盟申请的appId和appSecret(会员中心->我的应用, 点击“应用信息”获取)
$appSecret = "1a17b05e0cfc72395a9e3aac1385dbf3af99103b86fac5adf860c76bdba14901";
$accessToken = $this->refreshToken($appId,$appSecret);
/*PushManager.requestToken为客户端申请token的方法,可以调用多次以防止申请token失败*/
/*PushToken不支持手动编写,需使用客户端的onToken方法获取*/
// $deviceTokens = array();//目标设备Token
// $deviceTokens[] = 'AAE4PxueamHwa2NurzvsV7jBJut4arMrCRKkPJ1_QWxikUpQxXXPWFVF-Gue5gL4bdJlKe5YFySZOyMPqqGgLKma8PLBljy76_q9Q6KIKhLPy9AacqFphwpHy80IX091Yg';
// $title='觉醒前世记忆,重走弑天道,这一世,注定不平凡...';
// $description='觉醒前世记忆,重走弑天道,这一世,注定不平凡...';
// $page='/';
$params["key1"] = "test1";
// page 点击通知栏消息需要跳转到的快应用界面的path,Pushtype为0时有效。
// pushtype 0:通知栏消息 ● 1:透传消息
// validate_only 可选 true:测试消息 false:正式消息
// fast_app_target 1:加载器方式 2:引擎方式
$params = addslashes(json_encode($params));
$postBody = '{
"validate_only": false,
"message": {
"data": "{\"pushtype\":0,\"pushbody\":{\"title\":\"'.$title.'\",\"description\":\"'.$description.'\",\"page\":\"'.$page.'\",\"params\":'.$params.',\"ringtone\":{\"vibration\":\"true\",\"breathLight\":\"true\"}}}",
"ssss":"{k1:v1}",
"android": {
"collapse_key": -1,
"delivery_priority": "HIGH",
"ttl": "1448s",
"bi_tag": "Trump",
"fast_app_target": 2
},
"token": '.json_encode($deviceTokens).'
}
}';
$accessToken = str_replace("\\",'',$accessToken);
$header[] = "Content-type: application/json";
$header[] = "Authorization: Bearer {$accessToken}";
$postUrl = "https://push-api.cloud.huawei.com/v1/{$appId}/messages:send";
$response = $this->curl_send($postUrl, $postBody,$header);
$response = json_decode($response,true);
$response['postBody'] = $postBody;
return $response;
}
/**
* 请求AccessToken
* @param string $client_id 申请应用时获得的应用 ID,对应华为开发者联盟网站申请应用的时候获取的AppID。
* @param string $client_secret 申请应用时获得的应用密钥,对应华为开发者联盟网站申请应用的时候获取的AppSecret。
* @return bool
* @throws Exception
* 官方文档:https://developer.huawei.com/consumer/cn/doc/development/HMS-2-References/hmssdk_huaweipush_api_reference_agent_s1
*/
private function refreshToken($client_id='',$client_secret=''){
if(empty($client_id) || empty($client_secret)){
return false;
}
$key = 'kyy_huawei_token_'.$client_id;
$response = S($key);
if(empty($response)){
$postData = [
'grant_type'=>'client_credentials',
'client_secret'=>$client_secret,
'client_id'=>$client_id,
];
$tokenUrl = 'https://login.cloud.huawei.com/oauth2/v2/token'; //获取认证Token的URL
$response = $this->curl_send($tokenUrl, http_build_query($postData));
$response = json_decode($response,true);
S($key,$response,3500);
}
return $response['access_token'];
}
/**
* 请求curl
* @param $url
* @param $void
* @param $void
* @return bool|string
* @throws Exception
*/
public static function curl_send($url,$postData,$header){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5000);
curl_setopt($ch, CURLOPT_TIMEOUT, 5000);
if($header){
curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlErrNo = curl_errno($ch);
$curlErr = curl_error($ch);
curl_close($ch);
return $result;
}