知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
您當(dāng)前位置>首頁 » 新聞資訊 » 小程序相關(guān) >
uni-app系列二:微信小程序授權(quán),獲取用戶信息和手機(jī)號碼
發(fā)表時間:2021-1-4
發(fā)布人:葵宇科技
瀏覽次數(shù):367
微信小程序中比較常用的就是通過微信的賬號體系授權(quán)登錄了,這樣子省去了手動注冊登錄的流程,而且信息的真實性也是比較可靠的。
這一篇,就是說明在uni-app中怎么實現(xiàn)微信小程序的授權(quán)登錄操作,結(jié)合后端PHP接口實現(xiàn)整個流程
老規(guī)矩,開始擼碼
步驟:
- 微信小程序調(diào)用 wx.login() 獲取 臨時登錄憑證code ,并回傳到開發(fā)者服務(wù)器。
- 服務(wù)端調(diào)用 auth.code2Session 接口,換取 用戶唯一標(biāo)識 OpenID 和 會話密鑰 session_key。
這里使用方式一 開發(fā)者后臺校驗與解密開放數(shù)據(jù)
步驟:
-
服務(wù)端根據(jù)微信小程序的appid,用戶openid,上一步獲取的openid還有wx.getUserInfo()方法獲取encryptedData和iv 這4個數(shù)據(jù)結(jié)合官方提供的案例解析出用戶信息的數(shù)據(jù)
-
若解析成功,執(zhí)行后續(xù)操作;解析失敗,查找失敗原因。
以上兩個步驟就是微信官方提供的授權(quán)獲取用戶信息的方法了,具體可以看文檔說明,這里只是簡要說明
1.第一步就是小程序先要通過 wx.login()方法獲取code,這個只要調(diào)用方法即可獲取參數(shù)。
2.第二步是通過wx.getUserInfo()方法獲取encryptedData和iv這兩個數(shù)據(jù),如果是第一次登錄的話,直接調(diào)用會直接進(jìn)入 fail 回調(diào),詳見公告,接口升級之后是要使用 button 組件,并將 open-type 指定為 getUserInfo 類型,獲取用戶基本信息。因為button必須是手動點擊觸發(fā)的,所以實現(xiàn)思路是
2.1點擊open-type 指定為 getUserInfo 類型的button,首先獲取encryptedData和iv信息,
2.2接著success回調(diào)里面調(diào)用wx.login()獲取code。
2.3將code發(fā)送給服務(wù)端換取openid和session_key
2.4獲取openid成功回調(diào)之后將openid和2.1獲取到的encryptedData和iv發(fā)送給服務(wù)端解析用戶信息,執(zhí)行登錄成功的操作
3.先上頁面截圖
4.重點就是 授權(quán)登錄 這個按鈕了
<button open-type="getUserInfo" withCredentials="true" lang="zh_CN" @getuserinfo="getUserInfo">授權(quán)登錄</button>
復(fù)制代碼
指定button的open-type類型為 getUserInfo,并設(shè)置回調(diào)方法getUserInfo()
以下是整個方法執(zhí)行流程,按照執(zhí)行順序依次如下
export default {
data() {
return {
userdetail: {}
}
},
methods: {
getUserInfo(res) {
this.userdetail = res.detail; //將用戶信息存起來,下次使用
this.login();調(diào)用wx.login()方法獲取code
},
login() {
uni.login({
provider: 'weixin',
success: res => {
this.wxLogin(res.code);
},
fail: err => {
console.log('err', err);
}
});
},
//調(diào)用接口,通過code換取openid,session_key保存在服務(wù)端解析時會用到
wxLogin(code) { let params = {
code
};
this.$ajax.wxlogin(params).then(res => {
this.wxAuth(res.data.openid);
});
},
//解析數(shù)據(jù)
wxAuth(openid) {
let params = {
openid,
iv: this.userdetail.iv,
encryptedData: this.userdetail.encryptedData
};
this.$ajax.wxAuth(params).then(res => {
uni.showToast({
title: '授權(quán)成功',
duration: 2000 }) });
}
}
}
復(fù)制代碼
四 服務(wù)端實現(xiàn)代碼 以PHP為例
PHP以codeigniter 為例
//獲取openid
public function index_post()
{
// 微信 appid及app_secret 微信開發(fā)者后臺獲取
$appid = ""
$secret = ""
$post = $this->input->post();
$code = trim($post['code']); //獲取小程序傳遞過來的code值
$ajax_url = "https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=$code&grant_type=authorization_code";
$res = functionHelper::ajax_get($ajax_url); 自定義方法發(fā)起get請求
$data = http://www.wxapp-union.com/array();
if (!empty($res)) {
//解析成功的數(shù)據(jù)需要json_decode轉(zhuǎn)成json格式 $res_arr = json_decode($res, true);
if ($res_arr) {
//將openid返回給小程序
$data['data']['openid'] = $res_arr['openid'] ? $res_arr['openid'] : '';
//session_key保存在redis里面,不返回給小程序,官方是說這樣子比較安全,手動狗頭
$this->cache->redis->save($res_arr['openid'], $res_arr['session_key'], 3000);
}
//返回數(shù)據(jù)
responseHelper::response_ok($this, $data);
} else {
responseHelper::response_bad_request($this, "請求失敗");
}
}
//解密,獲取用戶信息/手機(jī)號碼
public function auth_post()
{
// 微信 appid微信開發(fā)者后臺獲取 $appid = "";
$post = $this->input->post(); //獲取小程序傳遞過來的參數(shù)
$openid = $post['openid'];
$encryptedData = http://www.wxapp-union.com/$post['encryptedData'];
$iv = $post['iv'];
//根據(jù)openid從redis里面獲取上一步存的對應(yīng)openid的sessionKey
$sessionKey = $this->cache->redis->get($openid);
$pc = new WXBizDataCrypt($appid, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data);
if ($errCode == 0) {
//解析成功的數(shù)據(jù)需要json_decode轉(zhuǎn)成json格式
$data_arr = json_decode($data, true);
responseHelper::response_ok($this, $data_arr);
} else {
responseHelper::response_bad_request($this, "解析失敗");
}
}
//自定義ajax_get完整代碼如下,只需傳入拼接好的url即可
public static function ajax_get($durl) {
// header傳送格式
$headers = array();
// 初始化
$curl = curl_init();
// 設(shè)置url路徑
curl_setopt($curl, CURLOPT_URL, $durl);
// 將 curl_exec()獲取的信息以文件流的形式返回,而不是直接輸出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// 在啟用 CURLOPT_RETURNTRANSFER 時候?qū)@取數(shù)據(jù)返回
curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
// 添加頭信息
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
// CURLINFO_HEADER_OUT選項可以拿到請求頭信息
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
// 不驗證SSL
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
// 執(zhí)行
$data = http://www.wxapp-union.com/curl_exec($curl);
// 關(guān)閉連接
curl_close($curl);
// 返回數(shù)據(jù)
return $data;
}
復(fù)制代碼
五 獲取手機(jī)號碼
獲取手機(jī)號碼和獲取用戶的流程和解析方法都是一樣的,差別就是 button類型需要設(shè)置為getPhoneNumber,僅此一個差別。獲取手機(jī)號碼的流程就留給各位小伙伴自己測試了。
作者:就是個人
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
相關(guān)案例查看更多
相關(guān)閱讀
- 云南手機(jī)網(wǎng)站建設(shè)
- 高端網(wǎng)站建設(shè)公司
- 云南省建設(shè)廳網(wǎng)站
- 網(wǎng)站維護(hù)
- 云南小程序開發(fā)報價
- 云南網(wǎng)站建設(shè)電話
- 云南網(wǎng)站建設(shè)特性
- 云南科技公司
- 楚雄小程序開發(fā)
- 網(wǎng)站上首頁
- 報廢車
- 小程序模板開發(fā)公司
- 云南做軟件
- 云南網(wǎng)絡(luò)營銷
- 報廢車管理
- 云南網(wǎng)站建設(shè)首頁
- 云南網(wǎng)站建設(shè)選
- 云南網(wǎng)站建設(shè)列表網(wǎng)
- 網(wǎng)站排名
- 小程序定制
- 云南建站公司
- 報廢車拆解回收管理系統(tǒng)
- 汽車報廢拆解管理系統(tǒng)
- 紅河小程序開發(fā)
- 網(wǎng)絡(luò)公司哪家好
- 開發(fā)框架
- 云南小程序開發(fā)推薦
- 云南網(wǎng)站建設(shè)價格
- 云南網(wǎng)站建設(shè)開發(fā)
- 保險網(wǎng)站建設(shè)公司