庞淑英 發表於 2021-4-21 14:41:00

uni APP 微信小程序获取授权的微信信息

<p>根据微信小程序开发文档,获取用户信息的接口有3个UserInfo,wx.getUserInfo,wx.getUserProfile。</p>
<p>UserInfo比较老就不用了。wx.getUserInfo基础库版本&nbsp;2.3.1&nbsp;以后支持,但是必须用户授权&nbsp;scope.userInfo。</p>
<p>wx.getUserProfile 基础库 2.10.4 开始支持,获取用户信息。页面产生点击事件(例如&nbsp;<code>button</code>&nbsp;上&nbsp;<code>bindtap</code>&nbsp;的回调中)后才可调用,每次请求都会弹出授权窗口,用户同意后返回&nbsp;<code>userInfo</code>。该接口用于替换&nbsp;<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>=&gt;<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 + '&amp;secret=' + APP_SECRET + '&amp;js_code=' +<span>
                              code + '&amp;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=&gt;用户允许了授权</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)">&amp;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)">&amp;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)">&amp;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=&gt;用户拒绝了授权</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)">&nbsp;</span></pre>
</div>
<p>&nbsp;</p>
<p>  </p><br><br>
来源:https://www.cnblogs.com/feipengting/p/14685150.html
頁: [1]
查看完整版本: uni APP 微信小程序获取授权的微信信息