【小程序开发:从客户端到服务端系列教程】一. 用户登录

此教程适合接触微信小程序一段时间,有一点基础的同学参考学习。
服务端语言:PHP 服务端框架:Thinkphp5.0
客户端: 微信小程序框架

客户端

//app.js
var httpclient = require("utils/httpclient");

App({
    onLaunch: function () {
        this.loginWx();
    },

    /**
     * 缓存登录
     */
    cacheLoginWx: function (cb) {
        if (this.userInfo == null) {
            this.loginWx(cb);
        } else {
            typeof cb == "function" && cb(this.userInfo);
        }
    },

    /**
     * 强制登录微信
     */
    loginWx: function (cb) {
        var that = this
        var code = '';
        var openid = '';
        wx.showNavigationBarLoading();
        wx.showLoading({
            title: '努力登录中...',
            mask: true,
        })
        //调用登录接口
        wx.login({
            success: function (obj) {
                wx.hideNavigationBarLoading();
                code = obj.code;
                // console.log(code);
                //请求服务端换取key
                httpclient.request(
                    that.url.head + that.url.wxOnLogin,
                    {
                        code: code,
                    },
                    function (res) {
                        openid = res.openid;
                        that.getUserInfo(cb, openid);
                    },
                    function (res) {
                        console.log('key错误');
                        wx.hideNavigationBarLoading();
                        wx.hideLoading();
                    }
                )
            },
            fail: function () {
                //登录失败
                console.log('授权失败');
                wx.hideNavigationBarLoading();
                wx.hideLoading();
            }
        })
    },

    /**
     * 获取用户信息
     * @param openid=null不解析加密数据
     */
    getUserInfo: function (cb, openid = null) {
        var that = this;
        wx.showNavigationBarLoading();
        //读取用户信息
        wx.getUserInfo({
            success: function (res) {
                wx.hideNavigationBarLoading();
                console.log('授权成功!');
                // console.log(res);
                that.userInfo = res.userInfo;
                //解密数据
                if (openid != null) {
                    that.decodeWxUserInfo(openid, res, cb);
                } else {
                    typeof cb == "function" && cb(that.userInfo);
                }
            },
            fail: function () {
                wx.hideNavigationBarLoading();
                wx.hideLoading();
                //登录失败
                console.log('登录出现网络错误失败');
                typeof cb == "function" && cb(null);
            }
        })
    },

    /**
     * 请求解析微信加密数据
     */
    decodeWxUserInfo: function (openid, obj, cb) {
        var that = this;
        var rawData = obj.rawData;
        var signature = obj.signature;
        var encryptedData = obj.encryptedData;
        var iv = obj.iv;
        wx.showNavigationBarLoading();
        //
        httpclient.request(
            that.url.head + that.url.decodeWxUserInfo,
            {
                openid: openid,
                encryptedData: encryptedData,
                iv: iv,
            },
            function (userData) {
                if (userData.hasOwnProperty('userId')) {
                    that.userInfo.userId = userData.userId;
                }
                if (userData.hasOwnProperty('authority')) {
                    that.userInfo.authority = parseInt(userData.authority);
                }
                console.log(userData);
                //
                wx.hideNavigationBarLoading();
                wx.hideLoading();
                typeof cb == "function" && cb(that.userInfo);
            },
            function (res) {
                console.log('解密数据网络错误');
                wx.hideNavigationBarLoading();
                wx.hideLoading();
            }
        )
    },

    /**
     * 获取用户id
     */
    getUserId() {
        if (this.userInfo == null) return null;
        return this.userInfo.userId;
    },

    /**
     * userInfo 
     */
    userInfo: null,

    /**
     * url
     */
    url: {
        head: "http://192.168.0.1/",
        //consumer
        wxOnLogin: "/public/consumer/Consumer/wxOnLogin",
        decodeWxUserInfo: "/public/consumer/Consumer/decodeWxUserInfo",
    },
})

讲解

注:httpclient.js 是我封装的一个http请求的类,各位可以根据自己服务端返回的json数据格式自定义,这里就不提供代码了。

  • cacheLoginWx方法提供缓存登录,你当然不希望自己的程序每次都请求服务器登录吧,所以需要判断登录的地方首先调用这个方法。
  • 获取微信登录的code,用此code从自建服务端获取登录用户的openid
  • wx.getUserInfo方法可以获取简要的用户信息,比如头像url和昵称,此方法还会返回一个加密过的rawData,如果需要获取更多用户的信息,比如用户的性别,地区等,就需要解密这段数据了
  • decodeWxUserInfo会从服务端请求解密数据,此步骤对于不需要用户详细信息的可以省略。

服务端 (语言:php)

服务端就不提供代码了,数据库表不一样,代码写法也不一样,这里只提供一下思路

  • 通过code获取openid,地址:$url = "https://api.weixin.qq.com/sns/jscode2session?";通过此方法获取的数据,可以在数据表里新建一个用户,记录唯一标识openid,此时服务端已经可以认为微信登录成功了。

  • 解密数据,我用的官方提供的php Demo,这里有一点非常重要,从官方下载的php文档一定要记得去掉BOM头,否则android手机的用户就会无法登录成功,这一步切记!我用的phpstrom,所以直接可以选择File--Remove BOM。

  • openid是用户登录此小程序的唯一标识,同一用户登录小程序,此openid不会变,如果要判断App或是网页里的登录的微信用户是否是同一个用户,需要用到unionid,有需要的同学一定要注意。

结束语

感谢大家的支持,系列教程会不断更新,如果在小程序开发过程中有遇到问题的同学可以私信我,空了一定会予以解答。

[我的网站] http://www.58xinrui.com
码字也是个苦差事,欢迎打赏💰

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 转载自cr180大神DiscuzX2.5完整目录结构【source程序文件库】 /source/admincp后台...
    cndaqiang阅读 832评论 1 2
  • 背着书包走走跳跳的小孩 你的母亲是否做好了可口的饭菜 当你踏进门的时候给你一个拥抱 夸奖你今天多么懂事 大街上徘徊...
    年达阅读 206评论 0 0
  • 大家好我来自思涵创业平台我叫创业如歌!感谢一直支持我的人!谢谢亲们ヽ(•̀ω•́ )ゝ俺眉毛又回来啦啊哒人一定要有...
    创业如歌666简书凤芹阅读 294评论 2 2
  • 周:你去哪? 张:回家 周:然后呢? 张:上班。。 周:不去上班行不行? 张:不去上班你养我啊? 周:(先失迟疑和...
    茗艺堂阅读 281评论 0 0