深圳水贝珠宝 發表於 2021-5-16 21:00:00

uni-app 第三方授权登录

<p>注意:在使用uni-app第三方登录时采用的是手机真机调试</p>
<p>授权登录html</p>
<div class="cnblogs_code">
<pre>&lt;view type="primary" <span style="color: rgba(0, 0, 255, 1)">class</span>="login_type" v-<span style="color: rgba(0, 0, 255, 1)">for</span>="(value,key) in providerList" @click="tologin(value)"
                :<span style="color: rgba(0, 128, 128, 1)">key</span>="key"&gt;
       &lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>="login_type_name"&gt;{{value.name}}&lt;/view&gt;
&lt;/view&gt;</pre>
</div>
<div class="cnblogs_code">
<pre>&lt;script&gt;<span style="color: rgba(0, 0, 0, 1)">
    import {
      mapState</span>,<span style="color: rgba(0, 0, 0, 1)">
      mapMutations
    } from </span>'vuex'<span style="color: rgba(0, 0, 0, 1)">

    export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
      data() {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
                title</span>: 'login',<span style="color: rgba(0, 0, 0, 1)">
                providerList</span>: [],<span style="color: rgba(0, 0, 0, 1)">
                openid</span>:''<span style="color: rgba(0, 0, 0, 1)">

            }
      }</span>,<span style="color: rgba(0, 0, 0, 1)">
      computed</span>:<span style="color: rgba(0, 0, 0, 1)"> {
            </span>...mapState(['hasLogin'<span style="color: rgba(0, 0, 0, 1)">])
      }</span>,<span style="color: rgba(0, 0, 0, 1)">
      onLoad() {
            uni</span>.<span style="color: rgba(0, 0, 0, 1)">getProvider({
                service</span>: 'oauth',<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">服务类型</span>
                success: (result) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                  this</span>.providerList = result.provider.map((value) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                        let providerName </span>= ''<span style="color: rgba(0, 0, 0, 1)">;
                        </span><span style="color: rgba(0, 0, 255, 1)">switch</span><span style="color: rgba(0, 0, 0, 1)"> (value) {
                            </span><span style="color: rgba(0, 0, 255, 1)">case</span> 'weixin':<span style="color: rgba(0, 0, 0, 1)">
                              providerName </span>= '微信'
                              <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                            </span><span style="color: rgba(0, 0, 255, 1)">case</span> 'qq':<span style="color: rgba(0, 0, 0, 1)">
                              providerName </span>= 'QQ'
                              <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                            </span><span style="color: rgba(0, 0, 255, 1)">case</span> 'sinaweibo':<span style="color: rgba(0, 0, 0, 1)">
                              providerName </span>= '微博'
                              <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                        }
                        </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
                            name</span>: providerName,<span style="color: rgba(0, 0, 0, 1)">
                            id</span>:<span style="color: rgba(0, 0, 0, 1)"> value
                        }
                  });

                }</span>,<span style="color: rgba(0, 0, 0, 1)">
                fail</span>: (error) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                  console</span>.<span style="color: rgba(0, 128, 128, 1)">log</span>('获取登录通道失败',<span style="color: rgba(0, 0, 0, 1)"> error);
                }
            });
      }</span>,<span style="color: rgba(0, 0, 0, 1)">
      methods</span>:<span style="color: rgba(0, 0, 0, 1)"> {
            </span>...mapMutations(['login']),<span style="color: rgba(0, 0, 0, 1)">
            tologin(provider) {
                uni</span>.<span style="color: rgba(0, 0, 0, 1)">login({
                  provider</span>: provider.id,
                  <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> #ifdef MP-ALIPAY</span>
                  scopes: 'auth_user', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">支付宝小程序需设置授权类型
                  // #endif</span>
                  success: (res) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                        console</span>.<span style="color: rgba(0, 128, 128, 1)">log</span>('login success:',<span style="color: rgba(0, 0, 0, 1)"> res);
                        this</span>.openid=res.authResult.<span style="color: rgba(0, 0, 0, 1)">openid;
                        uni</span>.setStorageSync('openid', res.authResult.<span style="color: rgba(0, 0, 0, 1)">openid);
                        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 更新保存在 store 中的登录状态</span>
                        this.login(provider.<span style="color: rgba(0, 0, 0, 1)">id);<br>                //根据openid获取当前授权的信息
                        uni</span>.<span style="color: rgba(0, 0, 0, 1)">getUserInfo({
                            provider</span>: this.loginProvider,<span style="color: rgba(0, 0, 0, 1)">
                            success</span>: (result) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                              console</span>.<span style="color: rgba(0, 128, 128, 1)">log</span><span style="color: rgba(0, 0, 0, 1)">(result);
                              </span><span style="color: rgba(0, 0, 255, 1)">var</span> _this=<span style="color: rgba(0, 0, 0, 1)">this;
                              </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> // 将第三方信息添加入库</span>
                              this.<span style="color: rgba(128, 0, 128, 1)">$api</span>.baseRequest("partyRegister", "POST",<span style="color: rgba(0, 0, 0, 1)"> {
                                    patient_name</span>: result.userInfo.nickName,<span style="color: rgba(0, 0, 0, 1)">
                                    openid</span>: _this.openid,<span style="color: rgba(0, 0, 0, 1)">
                                    figure_url</span>: result.userInfo.<span style="color: rgba(0, 0, 0, 1)">avatarUrl
                              })</span>.then(res =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                               返回值</span><span style="color: rgba(0, 0, 0, 1)">
                              });

                            }</span>,<span style="color: rgba(0, 0, 0, 1)">
                            fail</span>: (error) =&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)"> console.log('getUserInfo fail', error);</span>
                              uni.<span style="color: rgba(0, 0, 0, 1)">navigateTo({
                                    url</span>: "../login/login"<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)"> // #ifdef MP-WEIXIN
                        // console.warn('如需获取openid请参考uni-id: https://uniapp.dcloud.net.cn/uniCloud/uni-id');
                        // #endif</span>
                  },<span style="color: rgba(0, 0, 0, 1)">
                  fail</span>: (err) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                        console</span>.<span style="color: rgba(0, 128, 128, 1)">log</span>('login fail:',<span style="color: rgba(0, 0, 0, 1)"> err);
                  }
                });
            }</span>,<span style="color: rgba(0, 0, 0, 1)">
            formSubmit</span>: <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e) {
                </span><span style="color: rgba(0, 0, 255, 1)">var</span> phone_number = e.detail.value.<span style="color: rgba(0, 0, 0, 1)">phone_number;
                </span><span style="color: rgba(0, 0, 255, 1)">var</span> password = e.detail.value.<span style="color: rgba(0, 0, 0, 1)">password;
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (phone_number.length == ''<span style="color: rgba(0, 0, 0, 1)">) {
                  uni</span>.<span style="color: rgba(0, 0, 0, 1)">showToast({
                        title</span>: '手机号必填',<span style="color: rgba(0, 0, 0, 1)">
                        icon</span>: 'none'<span style="color: rgba(0, 0, 0, 1)">
                  })
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</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, 255, 1)">if</span> (phone_number.length != 11<span style="color: rgba(0, 0, 0, 1)">) {
                  uni</span>.<span style="color: rgba(0, 0, 0, 1)">showToast({
                        title</span>: '手机号格式有误',<span style="color: rgba(0, 0, 0, 1)">
                        icon</span>: 'none'<span style="color: rgba(0, 0, 0, 1)">
                  })
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
                }
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (password.length == ''<span style="color: rgba(0, 0, 0, 1)">) {
                  uni</span>.<span style="color: rgba(0, 0, 0, 1)">showToast({
                        title</span>: '密码必填',<span style="color: rgba(0, 0, 0, 1)">
                        icon</span>: 'none'<span style="color: rgba(0, 0, 0, 1)">
                  })
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
                }
                </span><span style="color: rgba(0, 0, 0, 1)">
            }</span>,<span style="color: rgba(0, 0, 0, 1)">

      }
    }
</span>&lt;/script&gt;
&lt;style&gt;<span style="color: rgba(0, 0, 0, 1)">
    @import </span>"./login.css"<span style="color: rgba(0, 0, 0, 1)">;
</span>&lt;/style&gt;</pre>
<img src="https://img2020.cnblogs.com/blog/2330586/202105/2330586-20210516205844835-52265715.png">
<p>&nbsp;</p>
<p>&nbsp;</p>
</div>
<p>&nbsp;</p>
<p>获取授权信息</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> uni.getUserInfo({
            //   provider: this.loginProvider,
            //   success: (result) =&gt; {
            //         console.log(result)
            //         // 用户名称
            //         this.patient=result.userInfo.nickName;
            //         this.openid=result.userInfo.openId;
            //         // 用户头像
            //         this.info.image=result.userInfo.avatarUrl;
            //         this.hasUserInfo = true;
            //         this.userInfo = result.userInfo;      
            //   }
            // });</span></pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/jerry-min/p/14774832.html
頁: [1]
查看完整版本: uni-app 第三方授权登录