開(kāi)發(fā)微信小程序會(huì)有些場(chǎng)景是需要授權(quán)用戶(hù)手機(jī)號(hào)的,微信小程序授權(quán)用戶(hù)手機(jī)號(hào)是通過(guò)getPhonenumber接口授權(quán)的,因?yàn)樾枰脩?hù)主動(dòng)觸發(fā)才能發(fā)起獲取手機(jī)號(hào)接口,所以該功能不由 API 來(lái)調(diào)用,需用 button 組件的點(diǎn)擊來(lái)觸發(fā)。另外,新版本接口不再需要提前調(diào)用wx.login進(jìn)行登錄。從基礎(chǔ)庫(kù) 2.21.2 (微信版本8.0.16)開(kāi)始,對(duì)獲取手機(jī)號(hào)的接口進(jìn)行了安全升級(jí),也就是說(shuō)基礎(chǔ)庫(kù) 2.21.2 以前的版本是舊版本,新版本和舊版本的區(qū)別是多了code參數(shù),以后舊版本接口可能會(huì)摒棄,建議大家使用新版本的手機(jī)號(hào)授權(quán)。
小程序授權(quán)手機(jī)號(hào)獲取的參數(shù)
【資料圖】
首先先講一下舊版本如何授權(quán)用戶(hù)手機(jī)號(hào),舊版本授權(quán)手機(jī)號(hào)點(diǎn)擊授權(quán)時(shí),會(huì)出現(xiàn)第一次授權(quán)不成功的現(xiàn)象,什么原因呢?code過(guò)期了,有人會(huì)問(wèn)我獲取的code是點(diǎn)擊授權(quán)手機(jī)號(hào)時(shí)一起獲取的,怎么會(huì)過(guò)期呢?這個(gè)就是這么神奇,可能是微信的bug問(wèn)題吧,反正一直沒(méi)決解,但也不是沒(méi)有解決的方法,解決方法就是在onLoad頁(yè)面加載時(shí)就wx.login獲取code值;
微信小程序手機(jī)號(hào)操作流程
舊版本授權(quán)手機(jī)號(hào)的代碼示例微信小程序wxml頁(yè)面
微信小程序js頁(yè)面
/** * 頁(yè)面的初始數(shù)據(jù) */ data: { code: "", },/** * 獲取手機(jī)號(hào) */ getUserMobileInfo: function (e) { var that = this, code = that.data.code, encryptedData = e.detail.encryptedData, iv = e.detail.iv; wx.checkSession({ success() { //session_key 未過(guò)期,并且在本生命周期一直有效 }, fail() { wx.login({ success: res => { that.setData({ code: res.code }) } }) }, complete() { if (e.detail.errMsg == "getPhoneNumber:ok") { userService.getTelephoneNumber(code, encodeURIComponent(encryptedData), encodeURIComponent(iv)).then(function (data) { wx.hideLoading(); var mobileValue = data.data that.setData({ mobileValue: mobileValue, }) }, function (data) { wx.hideLoading(); wx.showToast({ title: data.message, icon: "none" }); }); } else { wx.showModal({ title: "提示", content: "需獲取手機(jī)號(hào)才可提交信息", }) } } }) }, /** * 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面加載 */ onLoad: function (options) { wx.login({ success: res => { this.setData({ code: res.code }) } }) },
用戶(hù)同意授權(quán),我們可以根據(jù)wx.login時(shí)獲取到的code來(lái)通過(guò)后臺(tái)以及微信處理拿到session_key,最后通過(guò)app_id,session_key,iv,encryptedData(用戶(hù)同意授權(quán)errMsg返回‘getPhoneNumber:ok")
傳給后臺(tái)的參數(shù):code參數(shù)傳到后臺(tái)需要換取session_key;encryptedData包括敏感數(shù)據(jù)在內(nèi)的完整用戶(hù)信息的加密數(shù)據(jù),iv加密算法的初始向量,這兩個(gè)參數(shù)后臺(tái)需要解密的,解密的方法可以去微信官方開(kāi)發(fā)文檔查看,有很詳細(xì)說(shuō)明,這里就不講述了。
后臺(tái)處理后返回的參數(shù)
后臺(tái)處理后返回的參數(shù)
phoneNumber:用戶(hù)綁定的手機(jī)號(hào)(國(guó)外手機(jī)號(hào)會(huì)有區(qū)號(hào));
purePhoneNumber :沒(méi)有區(qū)號(hào)的手機(jī)號(hào);
countryCode:區(qū)號(hào)
新版本授權(quán)手機(jī)號(hào)的代碼示例微信小程序wxml頁(yè)面
微信小程序js頁(yè)面
/** * 獲取手機(jī)號(hào) */ getUserMobileInfo: function (e) { var that = this, code = e.detail.code; if (e.detail.errMsg == "getPhoneNumber:ok") { userService.getTelephoneNumber(code).then(function (data) { wx.hideLoading(); var mobileValue = data.data that.setData({ mobileValue: mobileValue, }) }, function (data) { wx.hideLoading(); wx.showToast({ title: data.message, icon: "none" }); }); } else { wx.showModal({ title: "提示", content: "需獲取手機(jī)號(hào)才可提交信息", }) } }
php后端的邏輯處理
/** * 獲取access_token * @return array */ private function getSession() { $params = [ "appid" => "你的小程序appid", "secret" => "你的小程序appsecret", "grant_type" => "client_credential" ]; $result = $this->httpGet("https://api.weixin.qq.com/cgi-bin/token", $params); return json_decode($result, true); } /** * code獲取用戶(hù)手機(jī)信息 */ public function getTelephoneNumber() { if (IS_POST) { $raw_json = file_get_contents("php://input"); $post_data = json_decode($raw_json, true); $code = $post_data["code"]; $session_res = $this->getSession($code); if ($session_res["errcode"]) { $this->apiReturn("0", $session_res["errmsg"]); } $param_data = [ "code" => $code, ]; $res_data = $this->httpJsonPost("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=".$session_res["access_token"], $param_data); $info = json_decode($res_data, true); if($info["errcode"] != 0){ $this->apiReturn($info["errcode"], $info["errmsg"]); } $this->apiReturn("1", "", $info["phone_info"]["phoneNumber"]); } } /** * json 請(qǐng)求 * @param string $url * @param array $data */ protected function httpJsonPost($url, $data = NULL) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERifYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); if(!$data){ return "data is null"; } if(is_array($data)) { $data = json_encode($data); } curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_HTTPHEADER,array( "Content-Type: application/json; charset=utf-8", "Content-Length:" . strlen($data), "Cache-Control: no-cache", "Pragma: no-cache" )); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $res = curl_exec($curl); $errorno = curl_errno($curl); if ($errorno) { return $errorno; } curl_close($curl); return $res; } /** * GET 請(qǐng)求 * @param string $url * @param array $param */ protected function httpGet($url, $param) { $url = $url . "?" . http_build_query($param); $curl = curl_init(); if (stripos($url, "https://") !== FALSE) { curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($curl, CURLOPT_SSLVERSION, 1); } curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $content = curl_exec($curl); $status = curl_getinfo($curl); curl_close($curl); if (intval($status["http_code"]) == 200) { return $content; } else { return false; } }
接口成功返回的整體數(shù)據(jù)結(jié)構(gòu),如下圖:
接口成功返回的整體數(shù)據(jù)結(jié)構(gòu)
寫(xiě)后臺(tái)邏輯時(shí)我遇到兩個(gè)錯(cuò)誤反饋
第一種反饋:{"errcode":47001,"errmsg":"data format error hint: [AgoBsDOre-c6ouia] rid: 626b7164-1d9c3b08-076fdbdb"},這個(gè)錯(cuò)誤是因?yàn)闆](méi)有用請(qǐng)求頭 Content-Type為application/json,所以我改成了json數(shù)據(jù)post請(qǐng)求,這個(gè)報(bào)錯(cuò)解決了。
第二種反饋:{"errcode":41001,"errmsg":"access_token missing rid: 626b7285-31e3f8d7-3556ca83"},這個(gè)錯(cuò)誤是因?yàn)閍ccess_token參數(shù),我沒(méi)寫(xiě)在url上,是和code一起寫(xiě)在數(shù)組中傳值的,這樣是不對(duì),應(yīng)該寫(xiě)到url上的,這個(gè)報(bào)錯(cuò)解決了。
舊版本的后臺(tái)邏輯沒(méi)有寫(xiě)出來(lái),是因?yàn)槲⑿乓院笠饤壟f版本的寫(xiě)法,這里就沒(méi)必要寫(xiě)了,如果有不會(huì)的,可以網(wǎng)上搜索一下,建議大家還是用新版本獲取用戶(hù)手機(jī)號(hào)的寫(xiě)法!小程序js文件中request請(qǐng)求,我用的是封裝后的寫(xiě)法傳參的,你可以微信小程序原生的wx.request傳參寫(xiě)法。以上就是微信小程序新版本與舊版本授權(quán)用戶(hù)手機(jī)號(hào)的教程了,僅供參考?。。?/p>
關(guān)鍵詞: 數(shù)據(jù)結(jié)構(gòu) 生命周期 后臺(tái)處理
- 觀(guān)焦點(diǎn):微信怎樣改手機(jī)號(hào)(微信小程序新版本與舊版本授權(quán)用戶(hù)手機(jī)號(hào)的教程)
- 動(dòng)態(tài)焦點(diǎn):河化股份:南松公司目前產(chǎn)品主要應(yīng)用于抗瘧疾類(lèi)、孕激素類(lèi)、營(yíng)養(yǎng)劑類(lèi)等藥品
- 中微半導(dǎo):公司有產(chǎn)品應(yīng)用于儲(chǔ)能
- 天天要聞:PingPong與浙江農(nóng)商聯(lián)合銀行達(dá)成合作
- 美團(tuán)優(yōu)選是做什么的?美團(tuán)優(yōu)選是正規(guī)的嗎?
- 天津醫(yī)保卡如何辦理?天津醫(yī)保認(rèn)證怎么辦理?
- 股票現(xiàn)量是什么意思?總量和現(xiàn)量以及量比的關(guān)系是什么?
- 股票現(xiàn)量是什么意思?總量和現(xiàn)量以及量比的關(guān)系是什么?
- 生物制藥龍頭股有哪些?生物醫(yī)藥績(jī)優(yōu)龍頭大盤(pán)點(diǎn)
- 銀行卡賬號(hào)查詢(xún)方法有哪些?銀行卡卡號(hào)忘了手機(jī)上怎么查?
- 當(dāng)江南遇上嶺南|出發(fā)超級(jí)目的地 我想陪你這樣尋“?!蔽?/a>
- 當(dāng)前快報(bào):海南省營(yíng)商環(huán)境建設(shè)廳揭牌成立
- 全球短訊!肇慶建設(shè)大灣區(qū)“智車(chē)新城”
- 合力打造優(yōu)勢(shì)產(chǎn)業(yè)集群(產(chǎn)經(jīng)觀(guān)察·關(guān)注數(shù)字產(chǎn)業(yè)集群③)
- 今日熱門(mén)!老年人現(xiàn)在打疫苗晚不晚?受基礎(chǔ)病影響的能不能打?獨(dú)居老人是否有必要接種?【科學(xué)防疫小貼士】(25)
- 心血管病患者一旦感染新冠病毒,居家應(yīng)該注意什么,如何避免基礎(chǔ)病加重,何時(shí)需要去就醫(yī)……【科學(xué)防疫小貼士】?(26)
- 【世界快播報(bào)】成都市住建局:將新建、續(xù)建中小學(xué)、幼兒園等基本公服設(shè)施430個(gè)
- 世界今亮點(diǎn)!快訊丨渝廈高鐵常益段試運(yùn)行,常德至長(zhǎng)沙最快1小時(shí)可達(dá)
- 股市中如何看大盤(pán)?看盤(pán)技巧有哪些?
- 每日快看:今起不再公布無(wú)癥狀感染者數(shù)據(jù) 中疾控專(zhuān)家解讀
- 低碳菜單引領(lǐng)寧波餐飲消費(fèi)新風(fēng)尚 試點(diǎn)將持續(xù)至今
- 深圳坪山打造餐飲服務(wù)食品安全示范高地 嚴(yán)守食品
- 黑龍江哈爾濱推出“沙盒”監(jiān)管新模式 激發(fā)市場(chǎng)活
- 第三季度全國(guó)消協(xié)受理投訴數(shù)量同比增10.02% 食品
- 北京懷柔對(duì)機(jī)動(dòng)車(chē)檢測(cè)機(jī)構(gòu)開(kāi)展監(jiān)督抽查 規(guī)范機(jī)動(dòng)
- 天津北辰扎實(shí)做好價(jià)格監(jiān)管工作 維護(hù)安全有序市場(chǎng)
- 北京石景山開(kāi)展冬季供暖前特種設(shè)備安全專(zhuān)項(xiàng)檢查
- 陜西延安:開(kāi)展兒童化妝品專(zhuān)項(xiàng)檢查 規(guī)范化妝品市
- 北京海淀開(kāi)展商品條碼專(zhuān)項(xiàng)監(jiān)督檢查 努力打造穩(wěn)定
- 金華推進(jìn)網(wǎng)絡(luò)直播營(yíng)銷(xiāo)治理顯成效 培育放心消費(fèi)直
- 1 觀(guān)焦點(diǎn):微信怎樣改手機(jī)號(hào)(微信小程序新版本與舊版
- 2 動(dòng)態(tài)焦點(diǎn):河化股份:南松公司目前產(chǎn)品主要應(yīng)用于抗
- 3 中微半導(dǎo):公司有產(chǎn)品應(yīng)用于儲(chǔ)能
- 4 天天要聞:PingPong與浙江農(nóng)商聯(lián)合銀行達(dá)成合作
- 5 美團(tuán)優(yōu)選是做什么的?美團(tuán)優(yōu)選是正規(guī)的嗎?
- 6 天津醫(yī)保卡如何辦理?天津醫(yī)保認(rèn)證怎么辦理?
- 7 股票現(xiàn)量是什么意思?總量和現(xiàn)量以及量比的關(guān)系是什
- 8 股票現(xiàn)量是什么意思?總量和現(xiàn)量以及量比的關(guān)系是什
- 9 生物制藥龍頭股有哪些?生物醫(yī)藥績(jī)優(yōu)龍頭大盤(pán)點(diǎn)
- 10 銀行卡賬號(hào)查詢(xún)方法有哪些?銀行卡卡號(hào)忘了手機(jī)上怎