| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 | <?phpnamespace addons\weixin\controller;use app\common\library\Auth;use think\Config;use addons\weixin\library\WechatService;use app\admin\model\weixin\User as WechatUser;use app\admin\model\User;use think\Hook;use think\Cookie;use think\Session;/** * 微信公众号接口 */class Index extends \think\addons\Controller{    public $auth = null;    public function _initialize()    {        parent::_initialize();        $this->auth = $auth = Auth::instance();        //监听注册登录注销的事件        Hook::add('user_login_successed', function ($user) use ($auth) {            $expire = input('post.keeplogin') ? 30 * 86400 : 0;            Cookie::set('uid', $user->id, $expire);            Cookie::set('token', $auth->getToken(), $expire);        });    }    /**     * 微信公众号授权登录和jssdk分享演示     * http://你的域名/addons/weixin     */    public function index()    {        //token        $token = $this->request->server('HTTP_TOKEN', $this->request->request('token', \think\Cookie::get('token')));        //初始化        $this->auth->init($token);        //检测是否登录        if (!$this->auth->isLogin()) {            $this->login();        }        return $this->fetch();    }    /**     * 微信公众号服务     * http://你的域名/addons/weixin/index/serve     */    public function serve()    {        ob_clean();        return WechatService::serve();    }    /**     * 公众号权限配置信息获取     * http://你的域名/addons/weixin/index/config     */    public function config()    {        $wxModel = new \app\admin\model\weixin\Config();        $wxConfigData = $wxModel->where([            'group' => 'weixin', 'name' => ['in', 'share_title,share_img,share_synopsis,avatar']        ])->select();        $wxConfig = [];        foreach ($wxConfigData as $val) {            $wxConfig[$val['name']] = $val['value'];        }        $jsSdk = json_decode(WechatService::jsSdk(urldecode($this->request->post('url'))), true);        return json(['code' => 1, 'data' => array_merge($wxConfig, $jsSdk)]);    }    /*     * 微信公众号发起授权     * http://你的域名/addons/weixin/index/login     * */    public function login()    {        $wechat_data = \app\admin\model\weixin\Config::where(['group' => 'weixin'])->select();        foreach ($wechat_data as $k => $v) {            $value = $v->toArray();            if (in_array($value['type'], ['selects', 'checkbox', 'images', 'files'])) {                $value['value'] = explode(',', $value['value']);            }            if ($value['type'] == 'array') {                $value['value'] = (array)json_decode($value['value'], true);            }            $wechat[$value['name']] = $value['value'];        }        $return_url = "http://" . $_SERVER['SERVER_NAME'] . "/addons/weixin/index/auth";        $redirect_uri = urlencode($return_url);        $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$wechat['appid']}&redirect_uri={$redirect_uri}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";        header('location:' . $url);        exit();    }    /**     * 公众号授权回调登陆     * http://你的域名/addons/weixin/index/auth     */    public function auth()    {        $spreadId = intval($this->request->param('spread'));        $login_type = $this->request->param('login_type', '');        try {            $wechatInfo = WechatService::oauthService()->user()->getOriginal();        } catch (\Exception $e) {            $this->error('授权失败', '', ['message' => $e->getMessage(), 'line' => $e->getLine()]);        }        if (!isset($wechatInfo['nickname'])) {            $wechatInfo = WechatService::getUserInfo($wechatInfo['openid']);            //没有关注公众号也没有会的微信用户昵称            if (!$wechatInfo['subscribe'] && !isset($wechatInfo['nickname'])) {                exit(WechatService::oauthService()->scopes(['snsapi_userinfo'])                    ->redirect($this->request->url(true))->send());            }            //得到标签列表            if (isset($wechatInfo['tagid_list'])) {                $wechatInfo['tagid_list'] = implode(',', $wechatInfo['tagid_list']);            }        } else {            //用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)            if (isset($wechatInfo['privilege'])) {                unset($wechatInfo['privilege']);            }        }        //授权成功后        $uid = WechatUser::onWechatOauthAfter($wechatInfo, $spreadId, $login_type);        //登录        $ret = $this->auth->direct($uid);        if ($ret) {            $this->success('授权登录成功', url('addons/weixin/index'));        } else {            $this->error($this->auth->getError());        }    }}
 |