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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM