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

posted @ 2020-09-23 10:03  冯莹辉  阅读(983)  评论(0编辑  收藏  举报