1. 微信登录思路:

    1. 在main.js 中封装公共函数,用于判断用户是否登录
    2. 在main.js 中分定义全局变量,用于存储接口地址
    3. 如果没有登录、则跳转至登录页面
    4. 进入登录页面
    5. 通过 wx.login 获取用户的 code
    6. 通过 code 获取用户的 SessionKey、OpenId 等信息【本应后台接口、但是此处使用js发送请求】
    7. 通过 openId 调用后台 Api 获取用户的信息
    8. 获取成功,则说明已经授权过了,直接登录成功
    9. 获取失败,则说明没有授权过,需要授权之后才能进行登录
    10. 用户点击页面微信登录按钮【 <button open-type="getUserInfo"></button>】
    11. 获取用户数据,然后调用后台接口写入数据库
  2. 在 applets/main.js 中添加如下

    // 封装全局登录函数
    // backpage, backtype 2个参数分别代表:
    // backpage : 登录后返回的页面
    // backtype : 打开页面的类型[1 : redirectTo 2 : switchTab]
    Vue.prototype.checkLogin = function( backpage, backtype ){
    // 同步获取本地数据(uid、随机码、用户名、头像)
    var user_id = uni.getStorageSync('user_id');
    var user_nu = uni.getStorageSync('user_nu');
    var user_nm = uni.getStorageSync('user_nm');
    var user_fa = uni.getStorageSync('user_fa');
    if( user_id == '' || user_nu == '' || user_fa == ''){
    // 使用重定向的方式跳转至登录页面
    uni.redirectTo({url:'../login/login?backpage='+backpage+'&backtype='+backtype});
    return false;
    }
    // 登录成功、已经登录返回数组 [用户 id, 用户随机码, 用户昵称, 用户表情]
    return [user_id, user_nu, user_nm, user_fa];
    }
    // 定义一个全局的请求地址
    Vue.prototype.apiServer = 'http://0608.cc/'
  3. 在 pages/login/login.vue 中添加如下

    <template>
    <view>
    <!-- login view html start -->
    <view>
    <view>
    <view class="header"><image src="/static/img/public/login-wx.png"></image></view>
    <view class="content">
    <view>申请获取以下权限</view>
    <text>获得你的公开信息(昵称,头像、地区等)</text>
    </view>
    <button class="bottom" type="primary" open-type="getUserInfo" withCredentials="true" lang="zh_CN" @getuserinfo="wxGetUserInfo">授权登录</button>
    </view>
    </view>
    <!-- login view html end -->
    </view>
    </template> <script>
    export default {
    data() {
    return {
    appid: '*************',
    secret: '*************************',
    code: '',
    sessionKey: '',
    openId: '',
    userInfo: {
    avatarUrl: '',
    city: '',
    country: '',
    gender: 1,
    language: '',
    nickName: ''
    },
    pageOption: {}
    };
    },
    methods: {
    // 第一授权获取用户信息 ===》按钮触发
    wxGetUserInfo() {
    let _self = this;
    // 1.获取用户的信息
    uni.getUserInfo({
    provider: 'weixin',
    success: ( infoRes ) => {
    console.log( infoRes )
    _self.userInfo = infoRes.userInfo
    // 2.提交数据到后台、写入数据库
    uni.request({
    url: _self.apiServer + 'appletsUserInfo',
    data: {
    openid: _self.openId,
    avatarUrl: _self.userInfo.avatarUrl,
    city: _self.userInfo.city,
    country: _self.userInfo.country,
    gender: _self.userInfo.gender,
    language: _self.userInfo.language,
    nickName: _self.userInfo.nickName
    },
    method: 'POST',
    success: res => {
    if( res.data.code != 0 )
    {
    uni.showToast({ title: res.data.msg, icon: 'none' });
    return false;
    }
    // 用户信息写入缓存
    uni.showToast({title: '登录成功'})
    uni.setStorageSync( 'user_id', res.data.res.u_id );
    uni.setStorageSync( 'user_nm', res.data.res.u_nickName );
    uni.setStorageSync( 'user_fa', res.data.res.u_avatarUrl );
    uni.setStorageSync( 'user_nu', res.data.res.u_regtime );
    // 然后跳回原页面
    if( _self.pageOption.backtype == 1 )
    {
    uni.redirectTo({ url: _self.pageOption.backpage })
    }else{
    uni.switchTab({ url: _self.pageOption.backpage })
    }
    },
    fail: () => {
    uni.showToast({ title: '用户信息操作失败', icon: 'none' });
    }
    });
    },
    fail: () => {
    uni.showToast({ title: '获取用户信息失败', icon: 'none' });
    }
    });
    return false
    },
    // 登录
    login() {
    let _self = this; // 0. 显示加载的效果
    uni.showLoading({
    title: '登录中...'
    }); // 1. wx 获取登录用户 code
    uni.login({
    provider: 'weixin',
    success: loginRes => {
    console.log(loginRes);
    _self.code = loginRes.code;
    // 2. 将用户登录code传递到后台置换用户SessionKey、OpenId等信息
    uni.request({
    url:
    'https://api.weixin.qq.com/sns/jscode2session?appid=' +
    _self.appid +
    '&secret=' +
    _self.secret +
    '&js_code=' +
    _self.code +
    '&grant_type=authorization_code',
    success: codeRes => {
    console.log(codeRes);
    _self.openId = codeRes.data.openid;
    _self.sessionKey = codeRes.data.session_key;
    // 3.通过 openId 判断用户是否授权
    uni.request({
    url: _self.apiServer + 'loginApplets',
    data: {
    openid: _self.openId
    },
    method: 'POST',
    success: openIdRes => {
    console.log(openIdRes);
    // 隐藏loading
    uni.hideLoading();
    // 还没授权登录、请先授权然后登录
    if (openIdRes.data.code == 1) {
    // 提示消息、让用户授权
    uni.showToast({ title: openIdRes.data.msg, icon: 'none' });
    }
    // 已经授权了、查询到用户的数据了
    if (openIdRes.data.code == 0) {
    // 用户信息写入缓存
    uni.showToast({title: '登录成功'})
    uni.setStorageSync( 'user_id', openIdRes.data.res.u_id );
    uni.setStorageSync( 'user_nm', openIdRes.data.res.u_nickName );
    uni.setStorageSync( 'user_fa', openIdRes.data.res.u_avatarUrl );
    uni.setStorageSync( 'user_nu', openIdRes.data.res.u_regtime );
    // 然后跳回原页面
    if( _self.pageOption.backtype == 1 )
    {
    uni.redirectTo({ url: _self.pageOption.backpage })
    }else{
    uni.switchTab({ url: _self.pageOption.backpage })
    }
    }
    },
    fail: () => {
    uni.showToast({ title: '获取授权信息失败', icon: 'none' });
    return false;
    }
    });
    },
    fail: () => {
    uni.showToast({ title: '获取 SesssionKey OpenId 失败', icon: 'none' });
    return false;
    }
    });
    },
    fail: () => {
    uni.showToast({ title: '获取 code 失败', icon: 'none' });
    return false;
    }
    });
    return false;
    }
    },
    onLoad( options ) {
    // 接收跳转的参数
    this.pageOption = options
    //默认加载
    this.login();
    }
    };
    </script> <style>
    .header {
    margin: 90rpx 0 90rpx 50rpx;
    border-bottom: 1px solid #ccc;
    text-align: center;
    width: 650rpx;
    height: 300rpx;
    line-height: 450rpx;
    } .header image {
    width: 200rpx;
    height: 200rpx;
    } .content {
    margin-left: 50rpx;
    margin-bottom: 90rpx;
    } .content text {
    display: block;
    color: #9d9d9d;
    margin-top: 40rpx;
    } .bottom {
    border-radius: 80rpx;
    margin: 70rpx 50rpx;
    font-size: 35rpx;
    }
    </style>
  4. 在 pages/my/my.vue 中添加如下:

    <template>
    <view>我的页面</view>
    </template> <script>
    var loginRes;
    export default {
    data() {
    return {};
    },
    onLoad() {
    // 加载定义好的方法
    loginRes = this.checkLogin('../my/my', 2);
    // 没有登录成功,返回空
    if (!loginRes) {
    return;
    }
    },
    methods: {}
    };
    </script> <style></style>
  5. PHP 接口 loginApplets

    public function loginApplets(Request $request, UserInfo $userInfo)
    {
    // 获取数据
    $data['u_openid'] = $request->param('openid', '');
    // 验证数据
    $rule = [
    'u_openid' => 'require|max:200|min:10'
    ];
    $message = [
    'u_openid.require' => 'openid 不能为空',
    'u_openid.max' => 'openid 格式错误',
    'u_openid.min' => 'openid 格式错误'
    ];
    $validate = Validate::rule($rule)->message($message);
    if (!$validate->check($data)) {
    return json(['code' => 1, 'msg' => $validate->getError(), 'res' => null]);
    }
    // 根据 openid 判断是否存在
    $where['u_openid'] = $data['u_openid'];
    $user = $userInfo->selOne($where);
    if (!$user) {
    return json(['code' => 1, 'msg' => '还没授权登录、请先授权然后登录', 'res' => $user]);
    }
    return json(['code' => 0, 'msg' => '已授权获取到用户的数据', 'res' => $user]);
    }
  6. PHP 接口 appletsUserInfo

    public function appletsUserInfo(Request $request, UserInfo $userInfo)
    {
    // 获取数据
    $data['u_openid'] = $request->param('openid', '');
    $data['u_avatarUrl'] = $request->param('avatarUrl', '');
    $data['u_city'] = $request->param('city', '');
    $data['u_country'] = $request->param('country', '');
    $data['u_gender'] = $request->param('gender', '');
    $data['u_language'] = $request->param('language', '');
    $data['u_nickName'] = $request->param('nickName', '');
    // 验证数据
    $rule = [
    'u_openid' => 'require|max:200|min:10',
    'u_avatarUrl' => 'require',
    'u_nickName' => 'require'
    ];
    $message = [
    'u_openid.require' => 'openid 不能为空',
    'u_openid.max' => 'openid 格式错误',
    'u_openid.min' => 'openid 格式错误',
    'u_avatarUrl.require' => '用户头像 不能为空',
    'u_nickName.max' => '用户名 格式错误',
    ];
    $validate = Validate::rule($rule)->message($message);
    if (!$validate->check($data)) {
    return json(['code' => 1, 'msg' => $validate->getError(), 'res' => null]);
    } // 根据 openid 判断是否存在
    $where['u_openid'] = $data['u_openid'];
    $user = $userInfo->selOne($where); // 存在、执行修改
    if ($user) {
    $user_res = $userInfo->updOne($where, $data);
    $res = [];
    $res['u_id'] = $user['u_id'];
    $res['u_regtime'] = $user['u_regtime'];
    } // 不存在、执行添加
    if (empty($user)) {
    $res = [];
    $res = $data;
    $res['u_regtime'] = time();
    $res['u_id'] = $userInfo->addOne($res);
    } // 判断是否添加成功
    if (empty($res['u_id'])) {
    return json(['code' => 1, 'msg' => '注册失败,返回重试', 'res' => null]);
    }
    return json(['code' => 0, 'msg' => 'ok', 'res' => $res]);
    }
  7. 完工!!!

使用 UniApp 实现小程序的微信登录的更多相关文章

  1. 微信小程序与微信公众号同一用户登录问题

    微信小程序与微信公众号同一用户登录问题 最近在做微信小程序与微信公众号登录合并的接口.整理相关资料以及个人认识的心得写了这篇文章与大家一起分享. 首先,简单说下我遇到的问题是我们的程序调用微信小程序得 ...

  2. 微信小程序API~检查登录状态

    wx.checkSession(Object object) 检查登录态是否过期. 通过 wx.login 接口获得的用户登录态拥有一定的时效性.用户越久未使用小程序,用户登录态越有可能失效.反之如果 ...

  3. java实现微信小程序服务端(登录)

    微信小程序如今被广泛使用,微信小程序按照微信官网的定义来说就是: 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 这就是微信小程序的魅力所在,有 ...

  4. 微信小程序实现与登录

    一.小程序的实现原理 在小程序中,渲染层和逻辑层是分开的,双线程同时运行,渲染层和逻辑层这两个通信主体之间的通讯以及通讯主体与第三方服务器之间的通信,都是通过微信客户端进行转发.小程序启动运行两种情况 ...

  5. 微信小程序(原名微信应用号)开发工具0.9版安装教程

    微信小程序全称微信公众平台·小程序,原名微信公众平台·应用号(简称微信应用号) 声明 微信小程序开发工具类似于一个轻量级的IDE集成开发环境,目前仅开放给了少部分受微信官方邀请的人士(据说仅200个名 ...

  6. [小程序开发] 微信小程序内嵌网页web-view开发教程

    为了便于开发者灵活配置小程序,微信小程序开放了内嵌网页能力.这意味着小程序的内容不再局限于pages和large,我们可以借助内嵌网页丰富小程序的内容.下面附上详细的开发教程(含视频操作以及注意事项) ...

  7. 微信小程序之微信登陆 —— 微信小程序教程系列(20)

    简介: 微信登陆,在新建一个微信小程序Hello World项目的时候,就可以看到项目中出现了我们的微信头像,其实这个Hello World项目,就有一个简化版的微信登陆.只不过是,还没有写入到咱们自 ...

  8. 小程序获取微信用户的openid

    小程序获取微信用户的openid //index.js //获取应用实例 const app = getApp() Page({ globalData: { appid: '11121221a89e0 ...

  9. 微信小程序和微信公众号的id是一个吗

    首先,简单说下我遇到的问题是我们的程序调用微信小程序得到openid,然后通过openID得到用户的唯一标识,用户得以登录,然而,当我们调用微信公众号也同样的到openid,同一以用户两个不同的ope ...

随机推荐

  1. PAT-1064 Complete Binary Search Tree(完全二叉树)

    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...

  2. 五、数据类型(1):整数&&带小数点的数

    1.整数 int printf("%d",...); scanf("%d",&...); 2.带小数点的数 double printf("%f ...

  3. python list 与 String 互相转换

    str0 = '127.0.0.1' list0 = str0.split('.') print(list0) #['127', '0', '0', '1'] str1 = '#'.join(list ...

  4. pyqt5_实例:修改xml文件中节点值

    需求: 将类似如下xml文件的externalid节点值修改成不重复的值 实现该功能的代码Func.py: #coding=utf-8 ''' Created on 2019年10月15日 @auth ...

  5. web自动化之iframe操作

    from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...

  6. 将`VuePress`建立的博客部署到GitHub或Gitee上

    将VuePress建立的博客部署到GitHub或Gitee上 在上一篇中,我们详细介绍了如何利用VuePress搭建起个人博客系统,但这只是在本地debug启动的,接下来,我们把它部署到Github网 ...

  7. [微信营销企划之路]001.环境搭建(XAMPP+WeiPHP)

    引言 本系列适合0基础的人员,因为我们就是从0开始的,此系列记录我们步入微信营销企划并进行开发的一些经验分享,望与君共勉!作为刚刚踏入微信队伍中的新人的我们,如果有什么不对的地方,还望不吝赐教. 在开 ...

  8. debug PHP程序(xdebug、IntelliJ IDEA)

    之前写PHP程序的都是echo调试,今天感觉太麻烦了就想起研究一下IntelliJ IDEA如何调试PHP程序. 从网上查找了很多资料,大部分都提到在IDE里开启服务,一下就懵了,怎么启这么多服务呢. ...

  9. Unity 游戏框架搭建 2019 (五十六/五十七) 需求分析-架构中最重要的一环&从 EmptyGO 到 Manager Of Managers

    我们的项目开始立项的时候,最常见的一个情况就是:几个人的小团队,一开始什么也不做,就开始写代码,验证逻辑,游戏就开始写起来了.而公司的一些所谓的领导层面一开始就把游戏定义为我们要做一个大作.这个事情本 ...

  10. Chisel3 - Tutorial - Functionality

    https://mp.weixin.qq.com/s/3hDzpJiANdwp07hO03psyA   演示使用函数进行代码复用的方法.   参考链接: https://github.com/ucb- ...