<?php
namespace App\Helper;
use App\Exception\BusinessException;
use App\Constants\ErrorCode;
class HuaweiMessage
{
/**
* AccessToken URL
*/
const ACCESS_TOKEN_URL = 'https://oauth-login.cloud.huawei.com/oauth2/v3/token';
/***
* 推送URL
*/
const PUSH_URL = 'https://push-api.cloud.huawei.com/v1/%s/messages:send';
/**
* 发送消息
*
* @param $setting 推送配置
* @param $message 消息体
* @param $regId 用户regId
*/
public function send($setting, $message, $regId)
{
$pushURL = sprintf(self::PUSH_URL, $setting->app_id);
$accessToken = $this->getAccessToken($setting);
$data = json_encode([
'pushtype' => 0,
'pushbody' => [
'title' => $message['title'],
'description' => $message['content'],
'page' => $message['url'],
'params' => $message['params'] ?? null,
],
]);
$params = [
'message' => [
"validate_only" => false,
'data' => $data,
'android' => [
'fast_app_target' => 2,
],
'token' => is_array($regId) ? $regId : array($regId),
],
];
$result = $this->requestData($pushURL, $params, $accessToken);
if ($result['code'] != 200 && $result['code'] != 80000000) {
throw new BusinessException(ErrorCode::BIZ_ERROR, $result['msg']);
}
}
/**
* 获取缓存key
*/
public function tokenKey($clientSecret)
{
return sprintf('message:huawei:%s', $clientSecret);
}
/**
* 获取AccessToken
*/
public function getAccessToken($setting)
{
$key = $this->tokenKey($setting->client_secret);
$accessToken = Cache::get($key);
if (!$accessToken) {
$accessToken = $this->CreateAccessToken($setting);
}
return $accessToken;
}
/**
* 创建AccessToken
*/
public function CreateAccessToken($setting)
{
$params = [
'grant_type' => 'client_credentials',
'client_id' => $setting->client_id,
'client_secret' => $setting->client_secret,
];
$url = $this->getUrl(self::ACCESS_TOKEN_URL, $params);
$result = $this->requestData($url);
if ($result && $result['access_token']) {
$key = $this->tokenKey($setting->client_secret);
Cache::set($key, $result['access_token'], $result['expires_in']);
return $result['access_token'];
}
return false;
}
/**
* 构建URL
*/
public function getUrl($url, $params)
{
return $url . '?' . http_build_query($params);
}
/**
* 请求
*/
public function requestData($url, $params = [], $accessToken = null)
{
$headers = [
'Content-type' => 'application/json',
];
if ($accessToken) {
$headers['Authorization'] = sprintf('Bearer %s', $accessToken);
}
$options = [
'headers' => $headers,
];
try {
$result = make(Client::class)
->request('POST', $url, $params, $options)
->getResult();
} catch (\Exception $exception) {
throw new BusinessException(ErrorCode::BIZ_ERROR, $exception->getMessage());
}
return $result;
}
}
PHP 实现华为推送
于 2023-04-14 14:00:53 首次发布