PHP微信小程序之獲取并解密用戶數(shù)據(jù)獲取openId和unionId,,小程序登陸

前言
微信小程序API文檔:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html
在實(shí)際的小程序開(kāi)發(fā)中癞揉,往往需要用戶授權(quán)登陸并獲取用戶的數(shù)據(jù)筐赔,快速對(duì)接用戶系統(tǒng)铣猩。
openId: 用戶在當(dāng)前小程序的唯一標(biāo)識(shí)
unionId : 如果開(kāi)發(fā)者擁有多個(gè)移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用茴丰、和公眾帳號(hào)(包括小程序)达皿,可通過(guò)unionid來(lái)區(qū)分用戶的唯一性天吓,因?yàn)橹灰峭粋€(gè)微信開(kāi)放平臺(tái)帳號(hào)下的移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(hào)(包括小程序)峦椰,用戶的unionid是唯一的失仁。換句話說(shuō),同一用戶们何,對(duì)同一個(gè)微信開(kāi)放平臺(tái)下的不同應(yīng)用萄焦,unionId是相同的。詳情登錄微信開(kāi)放平臺(tái)(open.weixin.qq.com) 冤竹。
在微信小程序開(kāi)發(fā)中拂封,unionId等敏感數(shù)據(jù)則被加密在encryptedData,于是需要以下流程來(lái)解密敏感數(shù)據(jù)鹦蠕,從而獲取unionId等信息冒签。

流程

1、(客戶端)微信小程序客戶端調(diào)用 wx.login()接口獲取登錄憑證(code)

//1钟病、調(diào)用微信登錄接口萧恕,獲取code
wx.login({
    success: function (r) {
        var code = r.code;//登錄憑證
        if (code) {
            //2、調(diào)用獲取用戶信息接口
            //...
 
        } else {
            console.log('獲取用戶登錄態(tài)失敵濉票唆!' + r.errMsg)
        }
    },
    fail: function () {
        callback(false)
    }
})

2、(客戶端)微信小程序客戶端調(diào)用 wx.getUserInfo()接口獲取 用戶基本信息屹徘、encryptedData(用戶敏感信息加密數(shù)據(jù)) 和 iv(加密算法的初始向量 )

//1屯掖、調(diào)用微信登錄接口县袱,獲取code
wx.login({
    success: function (r) {
        var code = r.code;//登錄憑證
        if (code) {
            //2、調(diào)用獲取用戶信息接口
            wx.getUserInfo({
                success: function (res) {
                    console.log({encryptedData: res.encryptedData, iv: res.iv, code: code})
                    //3.解密用戶信息 獲取unionId
                    //...
                },
                fail: function () {
                    console.log('獲取用戶信息失敗')
                }
            })
 
        } else {
            console.log('獲取用戶登錄態(tài)失敹槌巍椎咧!' + r.errMsg)
        }
    },
    fail: function () {
        callback(false)
    }
})

3倦始、(客戶端)將前面獲取到的 code 驰坊、encryptedData谊迄、iv發(fā)送到自己的服務(wù)器(開(kāi)發(fā)者服務(wù)器),通過(guò)自己的服務(wù)器(開(kāi)發(fā)者服務(wù)器)解密獲取信息

//1豆励、調(diào)用微信登錄接口夺荒,獲取code
wx.login({
    success: function (r) {
        var code = r.code;//登錄憑證
        if (code) {
            //2、調(diào)用獲取用戶信息接口
            wx.getUserInfo({
                success: function (res) {
                    console.log({encryptedData: res.encryptedData, iv: res.iv, code: code})
                    //3.請(qǐng)求自己的服務(wù)器肆糕,解密用戶信息 獲取unionId等加密信息
                    wx.request({
                        url: 'https://xxxx.com/wxsp/decodeUserInfo',//自己的服務(wù)接口地址
                        method: 'post',
                        header: {
                            'content-type': 'application/x-www-form-urlencoded'
                        },
                        data: {encryptedData: res.encryptedData, iv: res.iv, code: code},
                        success: function (data) {
 
                            //4.解密成功后 獲取自己服務(wù)器返回的結(jié)果
                            if (data.data.status == 1) {
                                var userInfo_ = data.data.userInfo;
                                console.log(userInfo_)
                            } else {
                                console.log('解密失敗')
                            }
 
                        },
                        fail: function () {
                            console.log('系統(tǒng)錯(cuò)誤')
                        }
                    })
                },
                fail: function () {
                    console.log('獲取用戶信息失敗')
                }
            })
 
        } else {
            console.log('獲取用戶登錄態(tài)失敯愣选在孝!' + r.errMsg)
        }
    },
    fail: function () {
         console.log('登陸失敗')
    }
})

4诚啃、(服務(wù)端 php)自己的服務(wù)器發(fā)送code到微信服務(wù)器獲取openid(用戶唯一標(biāo)識(shí))和session_key(會(huì)話密鑰),最后將encryptedData私沮、iv始赎、session_key通過(guò)AES解密獲取到用戶敏感數(shù)據(jù)
解密需要 引用的文件官網(wǎng)可以下載
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html

/**
     * 解密用戶敏感數(shù)據(jù)
     *
     * @param encryptedData 明文,加密數(shù)據(jù)
     * @param iv            加密算法的初始向量
     * @param code          用戶允許登錄后,回調(diào)內(nèi)容會(huì)帶上 code(有效期五分鐘),開(kāi)發(fā)者需要將 code 發(fā)送到開(kāi)發(fā)者服務(wù)器后臺(tái)造垛,使用code 換取 session_key api魔招,將 code 換成 openid 和 session_key
     * @return
     */
$code = input('get.code');
        $appid = 'wx8c9d056ead85efd7';
        $secret = '849fbc7dff5c949c2a9707d9a20df7a8';
        $encryptedData = input('encryptedData');
        $iv = input('iv');

        if($code != ''){
            $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$appid.'&secret='.$secret.'&js_code='.$code.'&grant_type=authorization_code';
            $html = file_get_contents($url);
            $obj = json_decode($html);

            if(isset($obj->errcode)){
                // 獲取用戶信息失敗
                return $html;
            }else{

                $arrlist['openid'] = $obj->openid;
                $arrlist['session_key'] = $obj->session_key;
                /**
                 * 解密用戶敏感數(shù)據(jù)
                 *
                 * @param encryptedData 明文,加密數(shù)據(jù)
                 * @param iv            加密算法的初始向量
                 * @param code          用戶允許登錄后,回調(diào)內(nèi)容會(huì)帶上 code(有效期五分鐘)五辽,開(kāi)發(fā)者需要將 code 發(fā)送到開(kāi)發(fā)者服務(wù)器后臺(tái)办斑,使用code 換取 session_key api,將 code 換成 openid 和 session_key
                 * @return
                 */

                include_once "wxBizDataCrypt.php";

                $pc = new \WXBizDataCrypt( $appid, $arrlist['session_key']);

                $errCode = $pc->decryptData($encryptedData, $iv, $data );
                $data  = json_decode($data);//$data 包含用戶所有基本信息
                $arrlist['time'] = time();
                $arrlist['city'] = $data->city;//城市-市
                $arrlist['country'] = $data->country;//國(guó)家
                $arrlist['gender'] = $data->gender;//性別
                $arrlist['language'] = $data->language;//語(yǔ)言
                $arrlist['nickName'] = $data->nickName;//昵稱
                $arrlist['avatarUrl'] = $data->avatarUrl;//頭像
                $arrlist['province'] = $data->province;//城市-省份
                //判斷獲取信息是否成功
                if ($errCode != 0) {
                    return $errCode;
                }
                //存入數(shù)據(jù)庫(kù)
                $user = db('xw_userinfo');
                //判斷是否已存在
                $list = $user->where('openid',$arrlist['openid'])->find();
                if(empty($list)){
                    //數(shù)據(jù)不存在 則存入數(shù)據(jù)
                    $user->insert($arrlist);
                }else{
                    //數(shù)據(jù)存在 則更新數(shù)據(jù)
                    $where['openid'] = $arrlist['openid'];
                    $user->where($where)->update($arrlist);
                }

                return $html;
            }
        }else{
            return json_encode('code為空');
        }

總結(jié)
好了杆逗,總算完成數(shù)據(jù)解密了
qq:1366860941

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乡翅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子罪郊,更是在濱河造成了極大的恐慌蠕蚜,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悔橄,死亡現(xiàn)場(chǎng)離奇詭異靶累,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)癣疟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門挣柬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人睛挚,你說(shuō)我怎么就攤上這事凛忿。” “怎么了竞川?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵店溢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我委乌,道長(zhǎng)床牧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任遭贸,我火速辦了婚禮戈咳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘壕吹。我一直安慰自己著蛙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布耳贬。 她就那樣靜靜地躺著踏堡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咒劲。 梳的紋絲不亂的頭發(fā)上顷蟆,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天诫隅,我揣著相機(jī)與錄音,去河邊找鬼帐偎。 笑死逐纬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的削樊。 我是一名探鬼主播豁生,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼漫贞!你這毒婦竟也來(lái)了沛硅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绕辖,失蹤者是張志新(化名)和其女友劉穎摇肌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體仪际,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡围小,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了树碱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肯适。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖成榜,靈堂內(nèi)的尸體忽然破棺而出框舔,到底是詐尸還是另有隱情,我是刑警寧澤赎婚,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布刘绣,位于F島的核電站,受9級(jí)特大地震影響挣输,放射性物質(zhì)發(fā)生泄漏纬凤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一撩嚼、第九天 我趴在偏房一處隱蔽的房頂上張望停士。 院中可真熱鬧,春花似錦完丽、人聲如沸恋技。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蜻底。三九已至,卻和暖如春瓷耙,著一層夾襖步出監(jiān)牢的瞬間朱躺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工搁痛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留长搀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓鸡典,卻偏偏與公主長(zhǎng)得像源请,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子彻况,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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