appid = config("wx_msg.f_appid"); $this->secret = config("wx_msg.f_appSecret"); } public function getToken(){ $token_key = self::KEY.'_'.'token'; $token = Redis::get($token_key); if(! $token){ $url = sprintf(self::ACCESS_URL,$this->appid, $this->secret); $res = $this->curlOpen($url); $res = json_decode($res,true); if(isset($res['errmsg'])) return [false,$res['errmsg']]; if(!isset($res['access_token'])) return [false,'request error']; $token = $res['access_token']; $expire_time = $res['expires_in']-300; Redis::set($token_key,$token); Redis::expire($token_key, $expire_time); return [true,$token]; } return [true,$token]; } public function getTokenSTABLE() { $token_key = self::KEY_STABLE . '_token'; $token = Redis::get($token_key); // 缓存存在且有效 if ($token) return [true, $token]; // 构建 POST 请求体 $postData = json_encode([ 'grant_type' => 'client_credential', 'appid' => $this->appid, 'secret' => $this->secret, // 可选:'force_refresh' => true 强制刷新 ]); list($status, $res) = $this->post_helper(self::STABLE_TOKEN_URL, $postData); if(! $status) return [false, $res]; // 错误处理 if (isset($res['errcode']) && $res['errcode'] != 0) return [false, "{$res['errcode']}: {$res['errmsg']}"]; if (empty($res['access_token'])) return [false, 'access_token missing']; // 缓存 Token(有效期7200秒,提前300秒刷新) $token = $res['access_token']; $expire = $res['expires_in'] - 300; // 实际6900秒(1小时55分) Redis::setex($token_key, $expire, $token); return [true, $token]; } public function setWebHook($data){ // file_put_contents('22.txt',json_encode($data)); $uri = isset($data['uri']) ? $data['uri'] : ''; $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"; $param = isset($data['param']) ? $data['param'] : ''; $redirect_uri = urlencode('https://xlkjapi.qingyaokeji.com/wxapi/getUnionid?uri='.$uri.'¶m='.$param); $url = sprintf($url,$this->appid,$redirect_uri); header("Location:".$url);exit; echo 'ok';die; } public function getUnionid($data){ // file_put_contents('22.txt',date('YmdHis').json_encode($data)); // echo $data['code']; if(isset($data['code'])) { list($status,$openid) = $this->getOpenid($data); // file_put_contents('222.txt',date('YmdHis').json_encode($openid)); // Log::channel('apiLog')->info('request', ['param' => $openid]); if(!$status) return [false,$openid]; $uri = $data['uri']; $openid = $openid['openid']; $param = isset($data['param']) ? $data['param'] : ''; $url = 'https://xlkj.qingyaokeji.com/#/wxGet?uri='.$uri.'&openid='.$openid.'¶m='.$param; header('Location:'.$url);exit(); } } public function getOpenid($data){ if(empty($data['code'])) return [false, 'code不能为空']; $code = $data['code']; $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code'; $url = sprintf($url,$this->appid,$this->secret,$code); $res = $this->curlOpen($url); $res = json_decode($res,true); if(!isset($res['openid'])) return [false,$res['errmsg']??'request error']; $openid = $res['openid']; return [true,['openid' => $openid]]; } }