zoukankan      html  css  js  c++  java
  • 微信小程序授权登录,PHP解密用户数据,并返回token记住登录状态

    一/前端(我使用的uniapp)

    <template>
        <view>
            <button open-type="getUserInfo"   @getUserInfo="onGotUserInfo" lang="zh_CN" @tap="onGotUserInfo">获取个人信息</button>
            <button  @tap="goSign">长征活动报名</button>
        </view>
        
    </template>
    <script>
    export default {
        data() {
            return{
                
            }
        },
        onLoad() {
            // 执行查看授权选项
            this.getSettingMes();
        },
        methods:{
            getSettingMes(){
                let _this = this;
                uni.getSetting({
                    success(res) {
                        console.log(res)
                        if (res.authSetting['scope.userInfo']) {
                            uni.getUserInfo({
                                success(infoRes) {
                                    console.log(infoRes)
                                    uni.setStorageSync('userinfo', infoRes.userInfo);
                                },
                                fail() {
                                    console.log("获取用户信息失败")
                                }
                            })
                        }else if(!res.authSetting['scope.userInfo']){
                            console.log("需要点击按钮手动授权")
                        }
                    },
                    fail() {
                        console.log("获取已授权选项失败")
                    }
                })
            },
            //手动授权
            onGotUserInfo(e) {
                uni.login({
                    success: (res) => {
                        var code = res.code
                        uni.getUserInfo({
                            provider:'weixin',
                            success:function(infoRes){
                                //个人信息存入缓存
                                uni.setStorageSync('userInfo', infoRes.userInfo);
                                var rawData = infoRes.rawData;
                                var signature = infoRes.signature;
                                var encryptedData = infoRes.encryptedData;
                                var iv = infoRes.iv;
                                uni.request({
                                    url:'请求url',
                                    data:{
                                        'code':code,
                                        'rawData':rawData,
                                        'signature':signature,
                                        'iv':iv,
                                        'encryptedData':encryptedData
                                    },
                                    method:'POST',
                                    success:function(res){
                                        uni.setStorageSync('uids', res.data.data.userId);
                                        uni.setStorageSync('token', res.data.data.token);
                                        if(res.data.ret == 200){
                                            uni.showToast({
                                                title:'登录成功',
                                                icon:'none'
                                            })
                                        }
                                    }
                                })
                            }
                        })                    
                    }
                })
            }
        }
    }
    </script>

    二/后端处理 PHP

    public function miniProgramLoginApi()
        {
            $code = $this->post('code');
            if (!$code) {
                return [501, 'code错误'];
            }
    
            $conf = $this->getGlobalConfig('mini_program.worker');  //配置文件
            $data = [
                'appid' => $conf['appid'],
                'secret' => $conf['appsecret'],
                'js_code' => $code,
                'grant_type' => 'authorization_code',
            ];
            $response = $this->httpClient->get('https://api.weixin.qq.com/sns/jscode2session', ['query' =>$data]);
            $result=json_decode($response->getBody()->getContents(), true);
            
            if (!empty($result['openid'])) {
                $openid=$result['openid'];
                $encryptedData = $this->post('encryptedData');
                $iv = $this->post('iv');
                $sessionKey =$result['session_key'];
    
                if (!$encryptedData || !$iv) {
                    return [501, '客户端传递参数错误'];
                }
           //下边要引入官方包
                $datacrypt=new WXBizDataCrypt($conf['appid'],$sessionKey);
                $errCode = $datacrypt->decryptData($encryptedData,$iv,$data);
                $data = json_decode($data,true);
               
                if($errCode == 0){
                    $userInfo = [
                        'openid'    => $data['openId'],
                        'nickName'   => $data['nickName'],
                        'avatarUrl'  => $data['avatarUrl'],
                        'sex'     => $data['gender'],
                        'country'    => $data['language'],
                        'city'       => $data['city'],
                        'create_time'=> time(),
                    ];
                    $uid = $this->db->get('user','id',['openid' => $data['openId']]);
                    if(empty($uid)){
                        $this->db->insert('user',$userInfo);
    
                        $uid = $this->db->id();
    
                    }else{
                        $this->db->update('user',$userInfo,['openid' => $data['openId']]);
    
                    }
                        $loginToken = md5(date('YmdHis' . $uid));
                //存入缓存
                        cacheRedis()->set($loginToken, $uid, 7200*12);
    
                    return [200, ['token' => $loginToken, 'userId' => $uid]];
                }else{
                    return [501, '微信解密错误'];
                }
    
            }
        }

    三/ 第二步内官方包的下载路径

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

  • 相关阅读:
    mysql怎么导入大文件的sql文件
    php函数研究
    php实现实现代码多主从,切换,轮询,健康检查
    php实现单个用户禁止重复登录,防止同一用户同时登陆
    php使用p3p实现cookies跨域设置 实现单点登录,全站登录
    实现页面浏览统计
    遍历目录删除指定MD5值的文件
    boot.img的修改
    “逃离大厦”游戏的破解
    Android漏洞——将Android恶意代码隐藏在图片中
  • 原文地址:https://www.cnblogs.com/fengyinghui/p/13716547.html
Copyright © 2011-2022 走看看