PHP 实现华为推送

<?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;
    }
}

猜你喜欢

转载自blog.csdn.net/wyh757787026/article/details/130152201