• 微信小程序授权登录,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

  • 相关阅读:
    openwrt 相关文章
    负载均衡相关文章
    Today's Progress
    Rodrigues formula is beautiful, but uneven to sine and cosine. (zz Berkeley's Page)
    Camera Calibration in detail
    Fundamental Matrix in Epipolar
    Camera Calibration's fx and fy do Cares in SLAM
    FilterEngine::apply
    FilterEngine 类解析——OpenCV图像滤波核心引擎(zz)
    gaussBlur
  • 原文地址:https://www.cnblogs.com/fengyinghui/p/13716547.html
Copyright © 2020-2023  润新知