微信(登录)demo

<?php
/**
 * Created by Fm.
 * User: wangxiong
 * Date: 2018/10/9
 * Time: 21:41
 */

namespace app\api\controller\v1;

use app\admin\model\Member;
use app\api\libs\Common;
use app\api\libs\WechatCallbackApiTest;
use think\Controller;
use think\Cache;
use think\Db;
use think\Exception;
use think\Request;
use app\api\libs\ModpPushPhoneCode;


class WXLoginController extends Controllers
{
    //APP
    private $APPID = 'xxxxxx';
    private $App_Secret = 'xxxxx';//web
    private $webAppID = 'xxxxx';
    private $webAppSecret = 'xxxxx';//小程序
    private $wxsmAppID = 'xxxx';
    private $wxsmAppSecret = 'xxxxx';
    private $curl;
    private $openId = '';
    private $access_token = '';
    private $code = '';
    private $LPM = '';
    private $user_id = '';
    private $redirect_uri = '';
    private $user_msg = '';
    private $union_id = '';
    private $nickname = '';
    private $headimgurl = '';
    private $token = '';
    private $unionid = '';
    private $session_key = '';
    private $url = '';
    public $phone = '';

    public function __construct()
    {
        $this->curl = new Curl();
        $this->LPM = new LoginPhoneModel();
    } //请求地址

    public function request_curl($url)
    {
        $this->curl->setUrl($url);
        $list = $this->curl->execute(true);
        return $list;
    }

    ########## WEB登录 #########//WEB登录//第一步获取code
    public function index_get_code()
    {
        if ($_GET['id']) {

            unset($_SESSION['belong_refer']);
            $_SESSION['belong_refer'] = $_GET['id'];
        }
        if ($_GET['type']) {
            unset($_SESSION['type']);
            $_SESSION['type'] = $_GET['type'];
        }
        $this->redirect_uri = 'http://xxxxxxxxxxxxxxxxxxx/phone/phone.php?r=WXLogin/webLogin';
        $this->redirect_uri = urlencode($this->redirect_uri);
        $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $this->webAppID . '&redirect_uri=' . $this->redirect_uri . '&response_type=code&scope=snsapi_userinfo&state=jjds&connect_redirect=1#wechat_redirect';
        header("location:" . $url);
    }

// 第二步:通过code换取网页授权access_token
    private function get_openId()
    {
        $code = isset($_GET['code']) ? $_GET['code'] : $_POST['code'];
        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $this->webAppID . '&secret=' . $this->webAppSecret . '&code=' . $code . '&grant_type=authorization_code';
        $this->curl = new Lib\Curl();
        $this->curl->setUrl($url);
        $return = $this->curl->execute(true);
        $this->access_token = $return->access_token;
        $this->openId = $return->openid;
    }

    //第三步:拉取用户信息(需scope为 snsapi_userinfo)
    private function get_one_user_msg_code()
    {
        $url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $this->access_token . '&openid=' . $this->openId . '&lang=zh_CN';
        $this->curl = new Lib\Curl();
        $this->curl->setUrl($url);
        $this->user_msg = $this->curl->execute(true);
    }

    //推广页登录
    public function webLogin()
    {
        $this->web_wx_login_index();
        header("location:http://xxxxxxxx/wap/html/generalize.html?type=" . $_SESSION['type'] . "&a=" . $_SESSION['token']);
    }

    //微信公众号登陆
    private function web_wx_login_index()
    {
        $this->get_openId();
        //通过code换取网页授权access_token ,openId
        $this->get_one_user_msg_code();
        //获取用户信息.
        $this->union_id = $this->user_msg->unionid;
        $this->wx_login($this->union_id, 4, '', $this->user_msg);
        $_SESSION['token'] = empty($this->token) ? '' : $this->token;
    }
    // ########## APP登录 #########
    //APP获取access_token
    public function app_get_access_token()
    {
        $code = isset($_GET['code']) ? $_GET['code'] : $_POST['code'];
        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $this->APPID . '&secret=' . $this->App_Secret . '&code=' . $code . '&grant_type=authorization_code';
        $list = $this->request_curl($url);
        return $list;
    } //APP获取调用(UnionID)

    public function app_UnionID($access_token, $openId)
    {
        $url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token . '&openid=' . $openId;
        $list = $this->object_to_array(WXLoginModel::request_curl($url));
        return $list;
    }
    ########## 小程序登录 #########//获取code
    ///  //微信小程序登陆
    public function sm_wx_login()
    {
        $code = isset($_GET['code']) ? $_GET['code'] : $_POST['code'];
        $this->url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' . $this->wxsmAppID . '&secret=' . $this->wxsmAppSecret . '&js_code=' . $code . '&grant_type=authorization_code';
        $this->curl = new Lib\Curl();
        $this->curl->setUrl($this->url);
        $return = $this->curl->execute(true);
        $this->user_msg = $return;
        $this->openId = $return->openid;
        $this->unionid = $return->unionid;
        $this->session_key = $return->session_key;
    }

    //获取code //微信小程序登陆
    public function sm_login()
    {
        $this->wx_login($this->unionid, 1);
        output_data(['token' => $this->token, 'phone' => $this->phone]);
    }

    //登陆(注册)
    public function wx_login($unionid, $clien_id, $status, $alllist)
    {
        if (isset($_POST['phone']) && $_POST['phone'] != 'undefined') { //存在手机号码(绑定微信)
            if ($_POST['status'] == 2) {
                $user_id = $this->get_one_data('users', 'user_id', ['user_name' => $unionid])['user_id'];
                if ($user_id) {
                    //已经有微信账户的
                    $this->get_one_delete('users', ['phone' => $_POST['phone']]);
                    $this->get_update_data(['phone' => $_POST['phone']], 'users', ['user_name' => $unionid]);
                    $token = $this->LPM->_get_token($user_id, $unionid, 3);
                    return $token;
                } else {
                    //没有微信账户的
                    $user_ids = $this->get_one_data('users', 'user_id', ['phone' => $_POST['phone']])['user_id'];
                    $this->get_update_data(['user_name' => $unionid], 'users', ['phone' => $_POST['phone']]);
                    $this->user_info(['phone' => $_POST['phone']], $alllist);
                    $token = $this->LPM->_get_token($user_ids, $unionid, 3);
                    return $token;
                }
            }
            //检测是否重复//
            $list = $this->get_one_data('users', 'role_type,user_B_id,belong_refer', ['user_name' => $unionid]);
            $user_b_id = $list['user_b_id'];
            $role_type = $list['role_type'];
            $belong_refer = $list['belong_refer'];
            $this->get_one_delete('users', ['user_name' => $unionid]);
            if ($list) {
                //  //绑定,更新信息//
                $this->get_update_data(['user_name' => $unionid, 'user_b_id' => $user_b_id, 'role_type' => $role_type, 'belong_refer' => $belong_refer], 'users', ['phone' => $_POST['phone']]);//
            } else {//
                //绑定,更新信息
                $this->get_update_data(['user_name' => $unionid], 'users', ['phone' => $_POST['phone']]);
            }
            $this->user_info(['phone' => $_POST['phone']], $alllist);
        } else {
            //检测是否注册过
            if ($unionid != "" && !empty($unionid)) {
                $option = $this->option($unionid);
            } else {
                $option = $this->option($this->openId);
            }
            $rst = M()->selectOne($option);
            if (!$rst) {
                //注册
                if ($unionid != "" && !empty($unionid)) {
                    $token = $this->regist($unionid, $clien_id);
                } else {
                    $token = $this->regist($this->openId, $clien_id);
                }
                if ($alllist) {
                    //获取用户信息
                    $this->user_info(['user_id' => $this->user_id], $alllist);
                }
                $phone = $this->get_one_data('users', 'phone', ['user_id' => $this->user_id])['phone']; //做C端归属处理 $this->user_belong();
            } else {
                //已注册
                if ($status == 2) {
                    if ($alllist) {
                        //获取用户信息
                        $this->user_info(['user_id' => $this->user_id], $alllist);
                    }
                    $token = '';
                } else {
                    //登录(更新密钥)
                    if ($unionid != "" && !empty($unionid)) {
                        $token = $this->LPM->_get_token($rst['user_id'], $unionid, $clien_id);
                    } else {
                        $token = $this->LPM->_get_token($rst['user_id'], $this->openId, $clien_id);
                    }
                    $this->token = $token;
                    if ($alllist) {
                        //获取用户信息
                        $this->user_info(['user_id' => $this->user_id], $alllist);
                    }
                }
            }
            $this->phone = $this->get_one_data('users', 'phone', ['user_id' => $rst['user_id']])['phone'];
            $this->curl->close();
            return ['token' => $token, 'phone' => $this->phone];
        }
    }

//做C端归属处理
    public function user_belong()
    {
        if ($_SESSION['belong_refer']) {
            //有推荐人,做归属
            $user_B_id = $this->get_one_data('users', 'user_B_id', ['user_id' => $_SESSION['belong_refer']])['user_b_id'];
            $this->get_update_data(['belong_refer' => $_SESSION['belong_refer'], 'user_B_id' => $user_B_id], 'users', ['user_id' => $this->user_id]);
        }
    }

//更新用户信息
    public function user_info($where, $alllist)
    {
        $alllist = $this->object_to_array($alllist);
        $new = $this->get_one_data('users', 'nickname,heard_img,city', $where);
        if (empty($new['nickname']) || empty($new['heard_img']) || empty($new['city'])) {
            $list = $this->get_update_data(['nickname' => $this->encrypt($alllist['nickname']), 'heard_img' => $alllist['headimgurl'], 'city' => $alllist['city']], 'users', $where);
        }
    }

    //查询参数
    private function option($unionid)
    {
        $option = ['field' => 'user_id,user_name', 'table' => 'users', 'where' => ['user_name' => $unionid], 'is_admin' => 0,];
        return $option;
    }

//注册参数
    private function regist($unionid, $clien_id)
    {
        $data = ['user_name' => $unionid, 'password' => md5('000000'), 'add_time' => time(), 'clien_id' => $clien_id,];
        $option = ['table' => 'users',];
        $list = M()->insert($data, $option);
        if (!$list) {
            output_errors('增加用户失败!');
        }
        $this->user_id = M()->getLastInsID();
        $this->token = $this->LPM->_get_token($this->user_id, $unionid, $clien_id);
        return $this->token;
    }

    /** 微信更新手机号码*/
    public function up_phone()
    {
        $encryptedData = isset($_POST['encryptedData']) ? $_POST['encryptedData'] : output_errors('失败');
        $iv = isset($_POST['iv']) ? $_POST['iv'] : output_errors('失败');
        $pc = new WXBizDataCrypt($this->wxsmAppID, $this->session_key);
        $errCode = $pc->decryptData($encryptedData, $iv, $data);
        if ($errCode == 0) {
        } else {
            output_errors('解密失败');
        }
        $user_id = $this->is_index();
        $data = $this->new_str_change($data);
        $list = $this->get_update_data(['phone' => $data['phoneNumber']], 'users', ['user_id' => $user_id]);
        if (!$list) {
            output_errors('绑定手机失败,请重试');
        }
        output_data('绑定手机成功');
    }
}
    
<?php
/**
 * Created by Fm.
 * User: wangxiong
 * Date: 2018/10/9
 * Time: 21:41
 */

namespace app\api\controller\v1;

use app\admin\model\Member;
use app\api\libs\Common;
use app\api\libs\WechatCallbackApiTest;
use think\Controller;
use think\Cache;
use think\Db;
use think\Exception;
use think\Request;
use app\api\libs\ModpPushPhoneCode;


class WXLoginController extends Controllers
{
    //APP
    private $APPID = 'xxxxxx';
    private $App_Secret = 'xxxxx';//web
    private $webAppID = 'xxxxx';
    private $webAppSecret = 'xxxxx';//小程序
    private $wxsmAppID = 'xxxx';
    private $wxsmAppSecret = 'xxxxx';
    private $curl;
    private $openId = '';
    private $access_token = '';
    private $code = '';
    private $LPM = '';
    private $user_id = '';
    private $redirect_uri = '';
    private $user_msg = '';
    private $union_id = '';
    private $nickname = '';
    private $headimgurl = '';
    private $token = '';
    private $unionid = '';
    private $session_key = '';
    private $url = '';
    public $phone = '';

    public function __construct()
    {
        $this->curl = new Curl();
        $this->LPM = new LoginPhoneModel();
    } //请求地址

    public function request_curl($url)
    {
        $this->curl->setUrl($url);
        $list = $this->curl->execute(true);
        return $list;
    }

    ########## WEB登录 #########//WEB登录//第一步获取code
    public function index_get_code()
    {
        if ($_GET['id']) {

            unset($_SESSION['belong_refer']);
            $_SESSION['belong_refer'] = $_GET['id'];
        }
        if ($_GET['type']) {
            unset($_SESSION['type']);
            $_SESSION['type'] = $_GET['type'];
        }
        $this->redirect_uri = 'http://xxxxxxxxxxxxxxxxxxx/phone/phone.php?r=WXLogin/webLogin';
        $this->redirect_uri = urlencode($this->redirect_uri);
        $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $this->webAppID . '&redirect_uri=' . $this->redirect_uri . '&response_type=code&scope=snsapi_userinfo&state=jjds&connect_redirect=1#wechat_redirect';
        header("location:" . $url);
    }

// 第二步:通过code换取网页授权access_token
    private function get_openId()
    {
        $code = isset($_GET['code']) ? $_GET['code'] : $_POST['code'];
        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $this->webAppID . '&secret=' . $this->webAppSecret . '&code=' . $code . '&grant_type=authorization_code';
        $this->curl = new Lib\Curl();
        $this->curl->setUrl($url);
        $return = $this->curl->execute(true);
        $this->access_token = $return->access_token;
        $this->openId = $return->openid;
    }

    //第三步:拉取用户信息(需scope为 snsapi_userinfo)
    private function get_one_user_msg_code()
    {
        $url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $this->access_token . '&openid=' . $this->openId . '&lang=zh_CN';
        $this->curl = new Lib\Curl();
        $this->curl->setUrl($url);
        $this->user_msg = $this->curl->execute(true);
    }

    //推广页登录
    public function webLogin()
    {
        $this->web_wx_login_index();
        header("location:http://xxxxxxxx/wap/html/generalize.html?type=" . $_SESSION['type'] . "&a=" . $_SESSION['token']);
    }

    //微信公众号登陆
    private function web_wx_login_index()
    {
        $this->get_openId();
        //通过code换取网页授权access_token ,openId
        $this->get_one_user_msg_code();
        //获取用户信息.
        $this->union_id = $this->user_msg->unionid;
        $this->wx_login($this->union_id, 4, '', $this->user_msg);
        $_SESSION['token'] = empty($this->token) ? '' : $this->token;
    }
    // ########## APP登录 #########
    //APP获取access_token
    public function app_get_access_token()
    {
        $code = isset($_GET['code']) ? $_GET['code'] : $_POST['code'];
        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $this->APPID . '&secret=' . $this->App_Secret . '&code=' . $code . '&grant_type=authorization_code';
        $list = $this->request_curl($url);
        return $list;
    } //APP获取调用(UnionID)

    public function app_UnionID($access_token, $openId)
    {
        $url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token . '&openid=' . $openId;
        $list = $this->object_to_array(WXLoginModel::request_curl($url));
        return $list;
    }
    ########## 小程序登录 #########//获取code
    ///  //微信小程序登陆
    public function sm_wx_login()
    {
        $code = isset($_GET['code']) ? $_GET['code'] : $_POST['code'];
        $this->url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' . $this->wxsmAppID . '&secret=' . $this->wxsmAppSecret . '&js_code=' . $code . '&grant_type=authorization_code';
        $this->curl = new Lib\Curl();
        $this->curl->setUrl($this->url);
        $return = $this->curl->execute(true);
        $this->user_msg = $return;
        $this->openId = $return->openid;
        $this->unionid = $return->unionid;
        $this->session_key = $return->session_key;
    }

    //获取code //微信小程序登陆
    public function sm_login()
    {
        $this->wx_login($this->unionid, 1);
        output_data(['token' => $this->token, 'phone' => $this->phone]);
    }

    //登陆(注册)
    public function wx_login($unionid, $clien_id, $status, $alllist)
    {
        if (isset($_POST['phone']) && $_POST['phone'] != 'undefined') { //存在手机号码(绑定微信)
            if ($_POST['status'] == 2) {
                $user_id = $this->get_one_data('users', 'user_id', ['user_name' => $unionid])['user_id'];
                if ($user_id) {
                    //已经有微信账户的
                    $this->get_one_delete('users', ['phone' => $_POST['phone']]);
                    $this->get_update_data(['phone' => $_POST['phone']], 'users', ['user_name' => $unionid]);
                    $token = $this->LPM->_get_token($user_id, $unionid, 3);
                    return $token;
                } else {
                    //没有微信账户的
                    $user_ids = $this->get_one_data('users', 'user_id', ['phone' => $_POST['phone']])['user_id'];
                    $this->get_update_data(['user_name' => $unionid], 'users', ['phone' => $_POST['phone']]);
                    $this->user_info(['phone' => $_POST['phone']], $alllist);
                    $token = $this->LPM->_get_token($user_ids, $unionid, 3);
                    return $token;
                }
            }
            //检测是否重复//
            $list = $this->get_one_data('users', 'role_type,user_B_id,belong_refer', ['user_name' => $unionid]);
            $user_b_id = $list['user_b_id'];
            $role_type = $list['role_type'];
            $belong_refer = $list['belong_refer'];
            $this->get_one_delete('users', ['user_name' => $unionid]);
            if ($list) {
                //  //绑定,更新信息//
                $this->get_update_data(['user_name' => $unionid, 'user_b_id' => $user_b_id, 'role_type' => $role_type, 'belong_refer' => $belong_refer], 'users', ['phone' => $_POST['phone']]);//
            } else {//
                //绑定,更新信息
                $this->get_update_data(['user_name' => $unionid], 'users', ['phone' => $_POST['phone']]);
            }
            $this->user_info(['phone' => $_POST['phone']], $alllist);
        } else {
            //检测是否注册过
            if ($unionid != "" && !empty($unionid)) {
                $option = $this->option($unionid);
            } else {
                $option = $this->option($this->openId);
            }
            $rst = M()->selectOne($option);
            if (!$rst) {
                //注册
                if ($unionid != "" && !empty($unionid)) {
                    $token = $this->regist($unionid, $clien_id);
                } else {
                    $token = $this->regist($this->openId, $clien_id);
                }
                if ($alllist) {
                    //获取用户信息
                    $this->user_info(['user_id' => $this->user_id], $alllist);
                }
                $phone = $this->get_one_data('users', 'phone', ['user_id' => $this->user_id])['phone']; //做C端归属处理 $this->user_belong();
            } else {
                //已注册
                if ($status == 2) {
                    if ($alllist) {
                        //获取用户信息
                        $this->user_info(['user_id' => $this->user_id], $alllist);
                    }
                    $token = '';
                } else {
                    //登录(更新密钥)
                    if ($unionid != "" && !empty($unionid)) {
                        $token = $this->LPM->_get_token($rst['user_id'], $unionid, $clien_id);
                    } else {
                        $token = $this->LPM->_get_token($rst['user_id'], $this->openId, $clien_id);
                    }
                    $this->token = $token;
                    if ($alllist) {
                        //获取用户信息
                        $this->user_info(['user_id' => $this->user_id], $alllist);
                    }
                }
            }
            $this->phone = $this->get_one_data('users', 'phone', ['user_id' => $rst['user_id']])['phone'];
            $this->curl->close();
            return ['token' => $token, 'phone' => $this->phone];
        }
    }

//做C端归属处理
    public function user_belong()
    {
        if ($_SESSION['belong_refer']) {
            //有推荐人,做归属
            $user_B_id = $this->get_one_data('users', 'user_B_id', ['user_id' => $_SESSION['belong_refer']])['user_b_id'];
            $this->get_update_data(['belong_refer' => $_SESSION['belong_refer'], 'user_B_id' => $user_B_id], 'users', ['user_id' => $this->user_id]);
        }
    }

//更新用户信息
    public function user_info($where, $alllist)
    {
        $alllist = $this->object_to_array($alllist);
        $new = $this->get_one_data('users', 'nickname,heard_img,city', $where);
        if (empty($new['nickname']) || empty($new['heard_img']) || empty($new['city'])) {
            $list = $this->get_update_data(['nickname' => $this->encrypt($alllist['nickname']), 'heard_img' => $alllist['headimgurl'], 'city' => $alllist['city']], 'users', $where);
        }
    }

    //查询参数
    private function option($unionid)
    {
        $option = ['field' => 'user_id,user_name', 'table' => 'users', 'where' => ['user_name' => $unionid], 'is_admin' => 0,];
        return $option;
    }

//注册参数
    private function regist($unionid, $clien_id)
    {
        $data = ['user_name' => $unionid, 'password' => md5('000000'), 'add_time' => time(), 'clien_id' => $clien_id,];
        $option = ['table' => 'users',];
        $list = M()->insert($data, $option);
        if (!$list) {
            output_errors('增加用户失败!');
        }
        $this->user_id = M()->getLastInsID();
        $this->token = $this->LPM->_get_token($this->user_id, $unionid, $clien_id);
        return $this->token;
    }

    /** 微信更新手机号码*/
    public function up_phone()
    {
        $encryptedData = isset($_POST['encryptedData']) ? $_POST['encryptedData'] : output_errors('失败');
        $iv = isset($_POST['iv']) ? $_POST['iv'] : output_errors('失败');
        $pc = new WXBizDataCrypt($this->wxsmAppID, $this->session_key);
        $errCode = $pc->decryptData($encryptedData, $iv, $data);
        if ($errCode == 0) {
        } else {
            output_errors('解密失败');
        }
        $user_id = $this->is_index();
        $data = $this->new_str_change($data);
        $list = $this->get_update_data(['phone' => $data['phoneNumber']], 'users', ['user_id' => $user_id]);
        if (!$list) {
            output_errors('绑定手机失败,请重试');
        }
        output_data('绑定手机成功');
    }
}
    

 

转载于:https://www.cnblogs.com/wxtrip/p/10975163.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值