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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swoole~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值