微信授權(quán)獲取用戶openId等信息

在我們開發(fā)小程序的時(shí)候郎仆,需要通過授權(quán)獲取用戶的信息映跟。

第一種使用wx.getUserInfo直接獲取微信頭像畅卓,昵稱
// 必須是在用戶已經(jīng)授權(quán)的情況下調(diào)用
wx.getUserInfo({
    success: function(res) {
        var userInfo = res.userInfo
        var nickName = userInfo.nickName
        var avatarUrl = userInfo.avatarUrl
        var gender = userInfo.gender //性別 0:未知尉咕、1:男、2:女
        var province = userInfo.province
        var city = userInfo.city
        var country = userInfo.country
    }
})
第二種方式使用wx.login()

這種方式即將被放棄毕匀,目前使用比較多的是的wx.login()铸鹰。因?yàn)橹苯邮褂脀x.getUserInfo是不能獲取更多的信息的,如微信用戶的openid皂岔。 官方提示掉奄,需要發(fā)送獲取到的code進(jìn)行請(qǐng)求到微信的后端API。根據(jù)文檔凤薛,只需要進(jìn)行一個(gè)get請(qǐng)求到如下地址即可:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_codeappid和secret在微信小程序后臺(tái)可以看到姓建,
js_code為使用wx.login登錄時(shí)獲取到的code參數(shù)數(shù)據(jù),grant_type這個(gè)不用改動(dòng)缤苫。

官方推薦

在login獲取到code速兔,然后發(fā)送到開發(fā)者后端,后端再通過接口去微信后端換取到openid和sessionKey之后活玲,然后把session返回給前端涣狗,就已經(jīng)完成登錄行為。而login行為是靜默舒憾,不必授權(quán)的镀钓,不會(huì)對(duì)用戶造成騷擾。getUserInfo只是為了提供更優(yōu)質(zhì)的服務(wù)而存在镀迂,比如展示頭像昵稱丁溅,判斷性別,通過unionId和其他公眾號(hào)上已有的用戶畫像結(jié)合起來提供歷史數(shù)據(jù)探遵。所以不必在剛剛進(jìn)入小程序的時(shí)候就強(qiáng)制要求授權(quán)窟赏。相關(guān)代碼如下所示妓柜。

JS代碼
var userInfo= (wx.getStorageSync('userInfo'))
        if (userInfo) {
          wx.getUserInfo({
            success: function (res) {
              that.setData({
                nickName: res.userInfo.nickName,
                avatarUrl: res.userInfo.avatarUrl,
              })
            },
            fail: function () {
              console.log("獲取失敗涯穷!")
            },
            complete: function () {
              console.log("獲取用戶信息完成棍掐!")
            }
          })
        } else {
          wx.login({
            success: function (res) {
              console.log(res.code)
              if (res.code) {
                wx.getUserInfo({
                  withCredentials: true,
                  success: function (res_user) {
                    wx.request({
                     //后臺(tái)接口地址
                      url: 'https://xxxx.com/wx/login',
                      data: {
                        code: res.code
                      },
                      method: 'GET',
                      header: {
                        'content-type': 'application/json'
                      },
                      success: function (res) {
                        that.setData({
                          userInfo: res.errMsg.userInfo
                        })
                        wx.setStorageSync('userInfo', res.data.userInfo);

                      }
                    })
                  }, fail: function () {
                    wx.showModal({
                      title: '警告通知',
                      content: '您點(diǎn)擊了拒絕授權(quán),將無法正常顯示個(gè)人信息,點(diǎn)擊確定重新獲取授權(quán)。',
                      success: function (res) {
                        if (res.confirm) {
                          wx.openSetting({
                            success: (res) => {
                              if (res.authSetting["scope.userInfo"]) {////如果用戶重新同意了授權(quán)登錄
                                wx.login({
                                  success: function (res_login) {
                                    if (res_login.code) {
                                      wx.getUserInfo({
                                        withCredentials: true,
                                        success: function (res_user) {
                                          wx.request({
                                           url: 'https://xxxx.com/wx/login',
                                            data: {
                                              code: res_login.code
                                             },
                                            method: 'GET',
                                            header: {
                                              'content-type': 'application/json'
                                            },
                                            success: function (res) {
                                              that.setData({
                                                userInfo: res.errMsg.userInfo

                                              })
                                              wx.setStorageSync('userInfo', res.errMsg.userInfo);
                                            }
                                          })
                                        }
                                      })
                                    }
                                  }
                                });
                              }
                            }, fail: function (res) {

                            }
                          })

                        }
                      }
                    })
                  }, complete: function (res) {

                  }
                })
              }
            }
          })

        }
  },
//globalData建議放在app.js拷况,方便統(tǒng)一管理
  globalData: {   
    userInfo: null
  }

后端代碼

由于我的后端是PHP寫的作煌,用的是thinkphp5框架,框架地址:https://www.kancloud.cn/manual/thinkphp5/118003

 /**
     * 小程序登錄
     * @return array
     */
    public function login() {

        $code = input('post.code'); //這是從前端傳過來的code
        $userInfo = input('post.userInfo');
        $info = json_decode($userInfo, true);
        $user = $info['userInfo'];
        $memberModel = model('Member');
        $appid = "小程序的appid"; //一定要是小程序的appid,不是微信公眾號(hào)的appid
        $secret = "小程序的secret";
        $url = "https://api.weixin.qq.com/sns/jscode2session?appid=". $appid."&secret=".$secret."&js_code=" . $code . "&grant_type=authorization_code";
        //初始化curl
        $ch = curl_init($url);
        //3.設(shè)置參數(shù)
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//跳過證書驗(yàn)證
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);  // 從證書中檢查SSL加密算法是否存在
        $res = curl_exec($ch);
        if(curl_errno($ch)){
            var_dump(curl_error($ch));
        }
        $resArr = json_decode($res,1);
        $data = array();
        curl_close($ch);
        $mapData = array();

//這里我把用戶的信息保存起來赚瘦,方便下次調(diào)用粟誓,數(shù)據(jù)庫(kù)結(jié)構(gòu)我們?cè)谙旅鏁?huì)介紹
        if (!empty($resArr['openid'])) {
            $res = $memberModel->checkMember($resArr['openid']);
            Log::write('用戶信息:' . $memberModel->getLastSql());
            if ($res) {
                $mapData['userInfo'] = $res;
                $mapData['session_key'] = $resArr['session_key'];
                return $this->resMap(200, $mapData, $mapData);
            } else {
                $data['nickName'] = $user['nickName'];
                $data['avatarUrl'] = $user['avatarUrl'];
                $data['m_province'] = $user['province'];
                $data['m_city'] = $user['city'];
                $data['m_gender'] = $user['gender'];
                $data['m_language'] = $user['language'];
                $data['signature'] = $info['signature'];
                $data['iv'] = $info['iv'];
                $data['m_uuid'] = showUuid();
                $data['m_openid'] = $resArr['openid'];
                $data['m_country'] = $resArr['country'];
                $data['m_ip'] = GetIP();
                $data['m_createtime'] = getDateTime(1);
                $memberModel->addOne($data);
                $mapData['userInfo'] = $data;
                $mapData['session_key'] = $resArr['session_key'];
                return $this->resMap(200, $mapData, $mapData);
            }
        } else {
            return $this->resMap(4002, '登錄失敗', '登錄失敗');
        }
    }

 /**
     * 返回提示信息
     * @param $code string 錯(cuò)誤碼  4001 空值  4002 格式不正確  4003 長(zhǎng)度  4004 提示  200正確放回 ,0失敗
     * @param $msg string 錯(cuò)誤描述
     * @param $data string 返回值
     * @return array
     */
    public function resMap($code, $msg, $data)
    {
        $map = array();
        $map['errMsg'] = $msg;
        $map['data'] = $data;
        $map['errCode'] = $code;
        return json($map);
    }

以上就是核心代碼,希望對(duì)大家有用蚤告。在上面努酸,我們需要保存用戶的信息服爷,因此我們需要數(shù)據(jù)庫(kù)表杜恰,下面就談到表的設(shè)計(jì)。

用戶表的設(shè)計(jì)
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `system_member`
-- ----------------------------
DROP TABLE IF EXISTS `system_member`;
CREATE TABLE `system_member` (
  `m_id` INT(11) NOT NULL AUTO_INCREMENT,
  `nickName` VARCHAR(50) DEFAULT NULL COMMENT '用戶昵稱',
  `avatarUrl` VARCHAR(255) DEFAULT NULL COMMENT '頭像',
  `m_province` VARCHAR(40) DEFAULT NULL COMMENT '省份',
  `m_city` VARCHAR(50) DEFAULT NULL COMMENT '城市',
  `m_name` VARCHAR(30) DEFAULT NULL COMMENT '真實(shí)姓名',
  `m_gender` TINYINT(1) DEFAULT '3' COMMENT '用戶性別(1仍源、男 2心褐、女 3、未知)',
  `m_createtime` DATETIME DEFAULT NULL COMMENT '創(chuàng)建時(shí)間',
  `m_country` VARCHAR(100) DEFAULT NULL COMMENT '國(guó)家',
  `m_language` VARCHAR(50) DEFAULT NULL COMMENT '語(yǔ)言',
  `m_openid` VARCHAR(50) DEFAULT NULL COMMENT 'openID',
  `m_ip` VARCHAR(15) DEFAULT NULL COMMENT 'IP',
  `m_mobile` VARCHAR(20) DEFAULT NULL COMMENT '手機(jī)號(hào)碼',
  `m_uuid` VARCHAR(50) DEFAULT NULL,
  `m_username` VARCHAR(50) DEFAULT NULL COMMENT '用戶名',
  `m_pwd` VARCHAR(50) DEFAULT NULL COMMENT '密碼',
  `session_key` VARCHAR(255) DEFAULT NULL COMMENT '會(huì)話密鑰',
  `unionid` VARCHAR(255) DEFAULT NULL COMMENT '用戶在開放平臺(tái)的唯一標(biāo)識(shí)符',
  `signature` VARCHAR(255) DEFAULT NULL,
  `iv` VARCHAR(255) DEFAULT NULL,
  `k_id` VARCHAR(50) DEFAULT NULL,
  `k_openid` VARCHAR(80) DEFAULT NULL,
  PRIMARY KEY (`m_id`)
) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='獲取用戶小程序信息';

以上就是獲取用戶信息的完整流程笼踩,下面我們附上一張用戶登錄的流程圖逗爹。

流程圖

以上就是全部?jī)?nèi)容,希望對(duì)大家有用嚎于,謝謝大家(__) 嘻嘻……

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掘而,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子于购,更是在濱河造成了極大的恐慌袍睡,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肋僧,死亡現(xiàn)場(chǎng)離奇詭異斑胜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嫌吠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門止潘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辫诅,你說我怎么就攤上這事凭戴。” “怎么了炕矮?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵簇宽,是天一觀的道長(zhǎng)勋篓。 經(jīng)常有香客問我,道長(zhǎng)魏割,這世上最難降的妖魔是什么譬嚣? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮钞它,結(jié)果婚禮上拜银,老公的妹妹穿的比我還像新娘。我一直安慰自己遭垛,他們只是感情好尼桶,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锯仪,像睡著了一般泵督。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庶喜,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天小腊,我揣著相機(jī)與錄音,去河邊找鬼久窟。 笑死秩冈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斥扛。 我是一名探鬼主播入问,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼稀颁!你這毒婦竟也來了芬失?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤匾灶,失蹤者是張志新(化名)和其女友劉穎棱烂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粘昨,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡垢啼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了张肾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芭析。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吞瞪,靈堂內(nèi)的尸體忽然破棺而出馁启,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布惯疙,位于F島的核電站翠勉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏霉颠。R本人自食惡果不足惜对碌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒿偎。 院中可真熱鬧朽们,春花似錦、人聲如沸诉位。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)苍糠。三九已至叁丧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岳瞭,已是汗流浹背拥娄。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寝优,地道東北人条舔。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓枫耳,卻偏偏與公主長(zhǎng)得像乏矾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迁杨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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