| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 | <?phpnamespace App\Services;use Illuminate\Support\Facades\Log;use JPush\Client;use PHPUnit\Util\Exception;class JPushService{    protected static $client = null;    //推送类型    const PUSH_TYPE_ALL = 1;    const PUSH_TYPE_TAG = 2;    const PUSH_TYPE_ALIAS = 3;    const PUSH_TYPE_REG_ID = 4;    const JG_YJDL_POST_URL = 'https://api.verification.jpush.cn/v1/web/loginTokenVerify';    private function __construct()    {    }    private function __clone()    {    }    /**     * 获取实例     */    public static function getInstance()    {        if (!self::$client) {            self::$client = new Client(config('jpush.app_key'), config('jpush.master_secret'), null);        }        return self::$client;    }    /**     * 给android或ios推送消息     */    public static function pushNotify($params)    {        //推送平台        $platform = $params['platform'] ?? 'all';        //推送标题        $title = $params['title'] ?? '';        //推送内容        $content = $params['content'] ?? '';        //通知栏样式ID        $builder_id = $params['builder_id'] ?? 0;        //附加字段        $extras = $params['extras'] ?? '';        //推送类型        $type = $params['type'] ?? '';        //推送目标(注册ID)        $reg_id = $params['reg_id'] ?? '';        //推送目标(标签)        $tag = $params['tag'] ?? '';        //推送目标(别名)        $alias = $params['alias'] ?? '';        $large_icon = $params['image'] ?? '';        try {            $push = self::getInstance()->push();            //设置平台            $push->setPlatform($platform);            switch ($type) {                case self::PUSH_TYPE_ALL:                    $push->addAllAudience();                    break;                case self::PUSH_TYPE_TAG:                    $push->addTag($tag);                    break;                case self::PUSH_TYPE_ALIAS:                    $push->addAlias($alias);                    break;                case self::PUSH_TYPE_REG_ID:                    $push->addRegistrationId($reg_id);                    break;            }            $push->androidNotification($content, [                'title' => $title,                'builder_id' => $builder_id,                'extras' => $extras,                'large_icon' => $large_icon            ])->iosNotification($content, [                'sound' => 'sound',                'badge' => '+1',                'extras' => $extras,//                'large_icon' => $params['image']            ])->options([                'apns_production' => config('jpush.apns_production', true),                //表示离线消息保留时长(秒)                'time_to_live' => 86400,            ]);            $response = $push->send();            if ($response['http_code'] != 200) {                Log::channel('jpush')->error(json_encode($response, JSON_UNESCAPED_UNICODE));            }            return $response;        } catch (\Throwable $e) {            Log::channel('jpush')->error(json_encode([                'file' => $e->getFile(),                'line' => $e->getLine(),                'message' => $e->getMessage(),                'params' => $params,            ], JSON_UNESCAPED_UNICODE));        }    }    /**     * 获取指定设备的别名和标签     */    public static function getDevices($reg_id)    {        $response = self::getInstance()->device()->getDevices($reg_id);        if ($response['http_code'] == 200) {            return $response['body'];        }        return [];    }    /**     * 给指定设备添加标签     */    public static function addTags($reg_id, $tags = [])    {        $response = self::getInstance()->device()->addTags($reg_id, $tags);        if ($response['http_code'] == 200) {            return true;        }        return false;    }    /**     * 清空指定设备的标签     */    public static function clearTags($reg_id)    {        $response = self::getInstance()->device()->clearTags($reg_id);        if ($response['http_code'] == 200) {            return true;        }        return false;    }    /**     * 清空指定设备的标签     */    public static function removeTags($reg_id, $tags = [])    {        $response = self::getInstance()->device()->removeTags($reg_id, $tags);        if ($response['http_code'] == 200) {            return true;        }        return false;    }    /**     * 更新指定设备的别名     */    public static function updateAlias($reg_id, $alias)    {        $response = self::getInstance()->device()->updateAlias($reg_id, $alias);        if ($response['http_code'] == 200) {            return true;        }        return false;    }    /**     * jgOpensslPrivateDecrypt($encrypted)     (加密) 手机号码解密获取手机号     * @param   $encrypted        string       (加密) 手机号码     * @param     *     * @return              string         手机号|false     *  err:错误信息     *     */    public static function jgOpensslPrivateDecrypt($encrypted){        $prefix = '-----BEGIN RSA PRIVATE KEY-----';        $suffix = '-----END RSA PRIVATE KEY-----';        $result = '';        $prikey = config('jpush.jg_yjdl_private_rsa');        $key = $prefix . "\n" . $prikey . "\n" . $suffix;//拼接换行符        $r = openssl_private_decrypt(base64_decode($encrypted), $result, openssl_pkey_get_private($key));        if($r){            return $result;        }else{            return false;            throw new Exception("解密失败");        }    }    /**     * jgLoginTokenVerify($token)         提交loginToken,验证后返回手机号码(加密)     * @param   $token        string       认证SDK获取到的loginToken     * @param   $exId         开发者自定义的id,非必填     *     * @return              array         手机号     *  err:错误信息     *     */    public static function jgLoginTokenVerify($token,$exId)    {        $host    =  self::JG_YJDL_POST_URL;        $method  = "POST";//        $appcode = VERIFY_APPCODE;        $headers = array();        array_push($headers, "Authorization: Basic " .base64_encode(config('jpush.app_key').':'.config('jpush.master_secret')));        //根据API的要求,定义相对应的Content-Type        array_push($headers, "Content-Type".":"."application/json");        $data = json_encode(["loginToken"=>$token,"exId"=>$exId]);        $curl = curl_init();        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);        curl_setopt($curl, CURLOPT_URL, $host);        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);        curl_setopt($curl, CURLOPT_FAILONERROR, false);        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);        //设定返回信息中是否包含响应信息头,启用时会将头文件的信息作为数据流输出,true 表示输出信息头, false表示不输出信息头        //如果需要将字符串转成json,请将 CURLOPT_HEADER 设置成 false        curl_setopt($curl, CURLOPT_HEADER, false);        $ret = curl_exec($curl);        $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);        // file_put_contents(PATH_USER_JG_LOGIN_LOG.date('Y-m-d').'.log', date('Y-m-d H:i:s').$ret.PHP_EOL,FILE_APPEND);//写入文件 常量需要自己在定义        $ret  = json_decode($ret,true);        if ($ret['code'] == 8000) {//            if($ret['exID']!=$exId){//                throw new Exception("exID 返回与发送不一致");//            }        } else {            //throw new Exception($ret['code'].":请重试");            throw new Exception($ret['code'].':'.$ret['content']);        }        return $ret;    }//通过别名发送://JPushService::pushNotify([    //'title' => '测试',    //'content' => '测试',    //'alias' => 'user_id_' . $user_id,    //'extras' => $extras,    //'type' => JPushService::PUSH_TYPE_ALIAS,//]);}
 |