公众号自动登录php

admin3年前公众号&小程序507
public function isWeixin()
    {
        if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false && strpos($_SERVER['HTTP_USER_AGENT'], 'wxwork') === false) {
            return true;
        }
        return false;
    }

创建WxService.php,代码如下

<?php
namespace app\common\controller;

class WxService
{
    protected $appid;
    protected $appKey;
 
    public $data = null;
 
    public function __construct($appid, $appKey)
    {
        $this->appid = $appid; //微信支付申请对应的公众号的APPID
        $this->appKey = $appKey; //微信支付申请对应的公众号的APP Key
    }
 
    /**
     * 通过跳转获取用户的openid,跳转流程如下:
     * 1、设置自己需要调回的url及其其他参数,跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize
     * 2、微信服务处理完成之后会跳转回用户redirect_uri地址,此时会带上一些参数,如:code
     *
     * @return 用户的openid
     */
    public function GetOpenid()
    {
        //通过code获得openid
        if (!isset($_GET['code'])){
            //触发微信返回code码
            $baseUrl = $this->getCurrentUrl();
            $url = $this->__CreateOauthUrlForCode($baseUrl);
            Header("Location: $url");
            exit();
        } else {
            //获取code码,以获取openid
            $code = $_GET['code'];
            $openid = $this->getOpenidFromMp($code);
            return $openid;
        }
    }
 
    public function getCurrentUrl()
    {
        //$scheme = $_SERVER['HTTPS']=='on' ? 'https://' : 'http://';
        $scheme = 'http://';
        $uri = $_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING'];
        if($_SERVER['REQUEST_URI']) $uri = $_SERVER['REQUEST_URI'];
        $baseUrl = urlencode($scheme.$_SERVER['HTTP_HOST'].$uri);
        return $baseUrl;
    }
 
    /**
     * 通过code从工作平台获取openid机器access_token
     * @param string $code 微信跳转回来带上的code
     * @return openid
     */
    public function GetOpenidFromMp($code)
    {
        $url = $this->__CreateOauthUrlForOpenid($code);        
        $res = self::curlGet($url);
        $data = json_decode($res,true);
        $this->data = $data;
        return $data;
    }
 
    /**
     * 构造获取open和access_toke的url地址
     * @param string $code,微信跳转带回的code
     * @return 请求的url
     */
    private function __CreateOauthUrlForOpenid($code)
    {
        $urlObj["appid"] = $this->appid;
        $urlObj["secret"] = $this->appKey;
        $urlObj["code"] = $code;
        $urlObj["grant_type"] = "authorization_code";
        $bizString = $this->ToUrlParams($urlObj);
        return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
    }
 
    /**
     * 构造获取code的url连接
     * @param string $redirectUrl 微信服务器回跳的url,需要url编码
     * @return 返回构造好的url
     */
    private function __CreateOauthUrlForCode($redirectUrl)
    {
        $urlObj["appid"] = $this->appid;
        $urlObj["redirect_uri"] = "$redirectUrl";
        $urlObj["response_type"] = "code";
        $urlObj["scope"] = "snsapi_userinfo";
        $urlObj["state"] = "STATE";
        $bizString = $this->ToUrlParams($urlObj);
        return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
    }
 
    /**
     * 拼接签名字符串
     * @param array $urlObj
     * @return 返回已经拼接好的字符串
     */
    private function ToUrlParams($urlObj)
    {
        $buff = "";
        foreach ($urlObj as $k => $v)
        {
            if($k != "sign") $buff .= $k . "=" . $v . "&";
        }
        $buff = trim($buff, "&");
        return $buff;
    }
 
    /**
     * 获取用户信息
     * @param string $openid 调用【网页授权获取用户信息】接口获取到用户在该公众号下的Openid
     * @return string
     */
    public function getUserInfo($openid,$access_token)
    {
 
        $response = self::curlGet('https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN');
        return json_decode($response,true);
        
    }
 
    public static function curlGet($url = '', $options = array())
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        if (!empty($options)) {
            curl_setopt_array($ch, $options);
        }
        //https请求 不验证证书和host
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
 
    public static function curlPost($url = '', $postData = '', $options = array())
    {
        if (is_array($postData)) {
            $postData = http_build_query($postData);
        }
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
        if (!empty($options)) {
            curl_setopt_array($ch, $options);
        }
        //https请求 不验证证书和host
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
 
}


登录OR注册用户代码

$config = getSettingCache('weixin');
                $wx = new WxService($config['appid'], $config['appsecret']);
                $wxGetOpenid = $wx->GetOpenid();
                $access_token = $wxGetOpenid['access_token'];
                //获取openid
                $openid = $wxGetOpenid['openid'];
                $wxGetUser = $wx->getUserInfo($openid, $access_token);
                //获取头像
                $nick_name = $wxGetUser['nickname'];
                $headimgurl = $wxGetUser['headimgurl'];
                //检测用户是否已注册
                $check = model('user')->where('openid', $openid)->count();
                if($check > 0){
                    $user = model('user')->where('openid', $openid)->find();
                    $data['id'] = $user['id'];
                    $data['user_name'] = $user['user_name'];
                    $data['nick_name'] = $user['nick_name'];              
                    $data['refer_id']  = $user['refer_id'];
                    $info = \org\Crypt::encrypt(json_encode($data));
                    cookie('userInfo',$info);
                    session('__token__',null);
                }else{
                    if(!empty(cookie('uid'))){
                        $refer_id   = intval(cookie('uid'));
                    }else{
                        $refer_id   = 0;
                    }
                    $password = rand(100000, 999999);
                    $data['user_name'] = '微信用户'.substr($openid, 2, 10);
                    $data['nick_name'] = $nick_name;
                    $data['avatar'] = $headimgurl;
                    $data['password']  = md5($password);                     
                    $data['refer_id']  = $refer_id;
                    $data['mobile']    = '';
                    $data['login_time'] = time();
                    $data['model']      = 1;
                    $data['openid']     = $openid;
                    if(model('user')->allowField(true)->save($data))
                    {
                        unset($data['password']);
                        $data['id']  = model('user')->id;
                        $info = \org\Crypt::encrypt(json_encode($data));
                        cookie('userInfo', $info);
                        session('__token__',null);
                        $this->redirect('user.account/phone');
                    }else{
                        exit('注册失败,请刷新重试');
                    }
                }


相关文章

小程序最新版获取头像和昵称

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/userProfile.html...

小程序添加客服

其实只需要解决2个问题第一步,在微信小程序中添加联系在线客服按钮第二步,接入在线客服功能,设置【自动/人工/转人工】回复等一、添加小程序客服按钮① 在小程序中添加客服按钮功能,点此参考官方文档(开发者...

微信公众号第三方h5页面登录

官方文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html参考文档:h...

小程序添加远程仓库

https://developers.weixin.qq.com/miniprogram/dev/devtools/git.html...

小程序搭建即时通讯方案

https://blog.csdn.net/weixin_43881802/article/details/123481902...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。