uni APP 微信小程序获取授权的微信信息
<p>根据微信小程序开发文档,获取用户信息的接口有3个UserInfo,wx.getUserInfo,wx.getUserProfile。</p><p>UserInfo比较老就不用了。wx.getUserInfo基础库版本 2.3.1 以后支持,但是必须用户授权 scope.userInfo。</p>
<p>wx.getUserProfile 基础库 2.10.4 开始支持,获取用户信息。页面产生点击事件(例如 <code>button</code> 上 <code>bindtap</code> 的回调中)后才可调用,每次请求都会弹出授权窗口,用户同意后返回 <code>userInfo</code>。该接口用于替换 <code>wx.getUserInfo。</code></p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">用户授权</span>
<span style="color: rgba(0, 0, 0, 1)"> wx.authorize({
scope: </span>'scope.userInfo'<span style="color: rgba(0, 0, 0, 1)">,
success(res) {
wx.startRecord();
}
});</span></pre>
</div>
<p> //查看微信小程序接口是否可用</p>
<div class="cnblogs_code">
<pre>console.log(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wx.getUserProfile</span><span style="color: rgba(128, 0, 0, 1)">'</span>, wx.canIUse(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">getUserProfile</span><span style="color: rgba(128, 0, 0, 1)">'</span>))</pre>
</div>
<p>wx.getUserInfo获取用户信息</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取微信用户信息</span></pre>
<pre><span style="color: rgba(0, 0, 0, 1)"> wx.getUserInfo({
success: function(res) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">用户信息</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> userInfo =<span style="color: rgba(0, 0, 0, 1)"> res.userInfo;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">性别 0:未知、1:男、2:女</span>
<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> {
nickName,
avatarUrl,
gender,
province,
city,
country
} </span>=<span style="color: rgba(0, 0, 0, 1)"> userInfo;
console.log(res)
let userUrl </span>=<span style="color: rgba(0, 0, 0, 1)"> userInfo.avatarUrl;<span style="color: rgba(51, 153, 102, 1)">//微信头像</span>
let wxname </span>=<span style="color: rgba(0, 0, 0, 1)"> userInfo.nickName;<span style="color: rgba(51, 153, 102, 1)">//微信昵称</span>
},
fail: res </span>=><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取失败的去引导用户授权</span>
<span style="color: rgba(0, 0, 0, 1)"> uni.showToast({
title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">您需要授权,才能获取您的信息!</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
});
}
});<br></span></pre>
</div>
<p>wx.getUserProfile 获取用户信息,获取openid,思路如下wx.login获取code,然后调微信服务端接口</p>
<pre>'https://api.weixin.qq.com/sns/jscode2session?appid=' + appId + '&secret=' + APP_SECRET + '&js_code=' +<span>
code + '&grant_type=authorization_code'</span><br>就能得到openid和sessionKey。</pre>
<pre><span>WXBizDataCrypt是官网js提供的解密用户信息的。通过上述接口就能获取</span>sessionKey,然后可以解密微信用户加密的信息。</pre>
<div class="cnblogs_code">
<pre> </pre>
<p> wx.login({<br> success: function(data) {<em id="__mceDel"></em></p>
<pre><em id="__mceDel"> let code=data.code;</em></pre>
<pre><span style="color: rgba(0, 128, 0, 1)"> //</span><span style="color: rgba(0, 128, 0, 1)">登录微信授权</span>
<span style="color: rgba(0, 0, 0, 1)"> wx.getUserProfile({
desc: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">用于完善用户资料</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
lang: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">zh_CN</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
success: function(res) {
console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wx.getUserProfile=>用户允许了授权</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
console.log(res.userInfo);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> console.log( res.rawData );</span>
<span style="color: rgba(0, 0, 0, 1)"> console.log(res.signature);
console.log(res.encryptedData);
console.log(res.iv);
that.userUrl </span>=<span style="color: rgba(0, 0, 0, 1)"> res.userInfo.avatarUrl;
that.wxname </span>=<span style="color: rgba(0, 0, 0, 1)"> res.userInfo.nickName;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> sessionKey = <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> ed =<span style="color: rgba(0, 0, 0, 1)"> res.encryptedData;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> eiv =<span style="color: rgba(0, 0, 0, 1)"> res.iv;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> appId = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">'</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">AppID(小程序ID)</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> APP_SECRET = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">'</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">AppSecret(小程序密钥)</span>
<span style="color: rgba(0, 0, 0, 1)"> wx.request({
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取openid接口</span>
url: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">https://api.weixin.qq.com/sns/jscode2session?appid=</span><span style="color: rgba(128, 0, 0, 1)">'</span> + appId + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">&secret=</span><span style="color: rgba(128, 0, 0, 1)">'</span> + APP_SECRET + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">&js_code=</span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)">
code </span>+ <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">&grant_type=authorization_code</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
data: {},
method: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">GET</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
success: function(res) {
console.log(res.data)
that.userId </span>= res.data.openid; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取到的openid </span>
<span style="color: rgba(0, 0, 0, 1)"> uni.setStorage({
key: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">lsopenid</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
data: res.data.openid
})
sessionKey </span>= res.data.session_key; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取到session_key
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">that.getPhoneNumber(res);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">得到res.encryptedData后,需要解码才能得到openId</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> pc = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> WXBizDataCrypt(appId, res.data.session_key);
console.log(pc)
</span><span style="color: rgba(0, 0, 255, 1)">var</span> data =<span style="color: rgba(0, 0, 0, 1)"> pc.decryptData(ed,eiv);
console.log(data)
}
});
</span><span style="color: rgba(0, 128, 0, 1)">
小程序端wx.getUserProfile()获取到userInfo,wx.login()获取到code,
这两个传给后端,code通过code2session接口获取到unionid,openid,session_key等;
原有的拿session_key解密encryptedData的逻辑不需要了,毕竟encryptedData也只是比userInfo多了openid和unionid。
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
},
fail: function(res) {
console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wx.getUserProfile=>用户拒绝了授权</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
console.log(res);
},
});<br></span></pre>
<pre><em id="__mceDel"> }});</em></pre>
<pre><span style="color: rgba(0, 0, 0, 1)"> </span></pre>
</div>
<p> </p>
<p> </p><br><br>
来源:https://www.cnblogs.com/feipengting/p/14685150.html
頁:
[1]