【小程序開發(fā):從客戶端到服務(wù)端系列教程】一. 用戶登錄

此教程適合接觸微信小程序一段時(shí)間败明,有一點(diǎn)基礎(chǔ)的同學(xué)參考學(xué)習(xí)馅精。
服務(wù)端語言:PHP 服務(wù)端框架: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);
        }
    },

    /**
     * 強(qiáng)制登錄微信
     */
    loginWx: function (cb) {
        var that = this
        var code = '';
        var openid = '';
        wx.showNavigationBarLoading();
        wx.showLoading({
            title: '努力登錄中...',
            mask: true,
        })
        //調(diào)用登錄接口
        wx.login({
            success: function (obj) {
                wx.hideNavigationBarLoading();
                code = obj.code;
                // console.log(code);
                //請(qǐng)求服務(wù)端換取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錯(cuò)誤');
                        wx.hideNavigationBarLoading();
                        wx.hideLoading();
                    }
                )
            },
            fail: function () {
                //登錄失敗
                console.log('授權(quán)失敗');
                wx.hideNavigationBarLoading();
                wx.hideLoading();
            }
        })
    },

    /**
     * 獲取用戶信息
     * @param openid=null不解析加密數(shù)據(jù)
     */
    getUserInfo: function (cb, openid = null) {
        var that = this;
        wx.showNavigationBarLoading();
        //讀取用戶信息
        wx.getUserInfo({
            success: function (res) {
                wx.hideNavigationBarLoading();
                console.log('授權(quán)成功!');
                // console.log(res);
                that.userInfo = res.userInfo;
                //解密數(shù)據(jù)
                if (openid != null) {
                    that.decodeWxUserInfo(openid, res, cb);
                } else {
                    typeof cb == "function" && cb(that.userInfo);
                }
            },
            fail: function () {
                wx.hideNavigationBarLoading();
                wx.hideLoading();
                //登錄失敗
                console.log('登錄出現(xiàn)網(wǎng)絡(luò)錯(cuò)誤失敗');
                typeof cb == "function" && cb(null);
            }
        })
    },

    /**
     * 請(qǐng)求解析微信加密數(shù)據(jù)
     */
    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('解密數(shù)據(jù)網(wǎng)絡(luò)錯(cuò)誤');
                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 是我封裝的一個(gè)http請(qǐng)求的類冈闭,各位可以根據(jù)自己服務(wù)端返回的json數(shù)據(jù)格式自定義又活,這里就不提供代碼了矮台。

  • cacheLoginWx方法提供緩存登錄,你當(dāng)然不希望自己的程序每次都請(qǐng)求服務(wù)器登錄吧漾月,所以需要判斷登錄的地方首先調(diào)用這個(gè)方法病梢。
  • 獲取微信登錄的code,用此code從自建服務(wù)端獲取登錄用戶的openid
  • wx.getUserInfo方法可以獲取簡(jiǎn)要的用戶信息,比如頭像url和昵稱,此方法還會(huì)返回一個(gè)加密過的rawData蜓陌,如果需要獲取更多用戶的信息觅彰,比如用戶的性別,地區(qū)等钮热,就需要解密這段數(shù)據(jù)了
  • decodeWxUserInfo會(huì)從服務(wù)端請(qǐng)求解密數(shù)據(jù)填抬,此步驟對(duì)于不需要用戶詳細(xì)信息的可以省略。

服務(wù)端 (語言:php)

服務(wù)端就不提供代碼了隧期,數(shù)據(jù)庫表不一樣飒责,代碼寫法也不一樣,這里只提供一下思路

  • 通過code獲取openid仆潮,地址:$url = "https://api.weixin.qq.com/sns/jscode2session?";通過此方法獲取的數(shù)據(jù)宏蛉,可以在數(shù)據(jù)表里新建一個(gè)用戶,記錄唯一標(biāo)識(shí)openid性置,此時(shí)服務(wù)端已經(jīng)可以認(rèn)為微信登錄成功了拾并。

  • 解密數(shù)據(jù),我用的官方提供的php Demo鹏浅,這里有一點(diǎn)非常重要嗅义,從官方下載的php文檔一定要記得去掉BOM頭,否則android手機(jī)的用戶就會(huì)無法登錄成功隐砸,這一步切記芥喇!我用的phpstrom,所以直接可以選擇File--Remove BOM凰萨。

  • openid是用戶登錄此小程序的唯一標(biāo)識(shí)继控,同一用戶登錄小程序,此openid不會(huì)變胖眷,如果要判斷App或是網(wǎng)頁里的登錄的微信用戶是否是同一個(gè)用戶武通,需要用到unionid,有需要的同學(xué)一定要注意珊搀。

結(jié)束語

感謝大家的支持冶忱,系列教程會(huì)不斷更新,如果在小程序開發(fā)過程中有遇到問題的同學(xué)可以私信我境析,空了一定會(huì)予以解答囚枪。

[我的網(wǎng)站] http://www.58xinrui.com
碼字也是個(gè)苦差事,歡迎打賞??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末劳淆,一起剝皮案震驚了整個(gè)濱河市链沼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沛鸵,老刑警劉巖括勺,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缆八,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡疾捍,警方通過查閱死者的電腦和手機(jī)奈辰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乱豆,“玉大人奖恰,你說我怎么就攤上這事⊥鹪#” “怎么了房官?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵矩肩,是天一觀的道長(zhǎng)酒觅。 經(jīng)常有香客問我,道長(zhǎng)话肖,這世上最難降的妖魔是什么疲酌? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任蜡峰,我火速辦了婚禮,結(jié)果婚禮上朗恳,老公的妹妹穿的比我還像新娘湿颅。我一直安慰自己,他們只是感情好粥诫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布油航。 她就那樣靜靜地躺著,像睡著了一般怀浆。 火紅的嫁衣襯著肌膚如雪谊囚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天执赡,我揣著相機(jī)與錄音镰踏,去河邊找鬼。 笑死沙合,一個(gè)胖子當(dāng)著我的面吹牛奠伪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播首懈,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼绊率,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了究履?” 一聲冷哼從身側(cè)響起滤否,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挎袜,沒想到半個(gè)月后顽聂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肥惭,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盯仪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年紊搪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片全景。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耀石,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出爸黄,到底是詐尸還是另有隱情滞伟,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布炕贵,位于F島的核電站梆奈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏称开。R本人自食惡果不足惜亩钟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鳖轰。 院中可真熱鬧清酥,春花似錦、人聲如沸蕴侣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昆雀。三九已至辱志,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狞膘,已是汗流浹背荸频。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留客冈,地道東北人旭从。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像场仲,于是被迫代替她去往敵國(guó)和親和悦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理渠缕,服務(wù)發(fā)現(xiàn)鸽素,斷路器,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 轉(zhuǎn)載自cr180大神DiscuzX2.5完整目錄結(jié)構(gòu)【source程序文件庫】 /source/admincp后臺(tái)...
    cndaqiang閱讀 838評(píng)論 1 2
  • 背著書包走走跳跳的小孩 你的母親是否做好了可口的飯菜 當(dāng)你踏進(jìn)門的時(shí)候給你一個(gè)擁抱 夸獎(jiǎng)你今天多么懂事 大街上徘徊...
    年達(dá)閱讀 210評(píng)論 0 0
  • 大家好我來自思涵創(chuàng)業(yè)平臺(tái)我叫創(chuàng)業(yè)如歌亦鳞!感謝一直支持我的人馍忽!謝謝親們ヽ(??ω?? )ゝ俺眉毛又回來啦啊噠人一定要有...
  • 周:你去哪遭笋? 張:回家 周:然后呢坝冕? 張:上班。瓦呼。 周:不去上班行不行喂窟? 張:不去上班你養(yǎng)我啊央串? 周:(先失遲疑和...
    茗藝堂閱讀 283評(píng)論 0 0