微信支付宝双端兼容获取手机号头像昵称

简介: 微信支付宝双端兼容获取手机号头像昵称

微信支付宝双端兼容获取手机号头像昵称

1. 页面效果

参考上一篇的 微信小程序获取用户头像昵称手机号最新版

2. 授权手机号弹窗

<u-modal v-model="showAuthorizePhone" :show-title="false"
                 :show-confirm-button="false">
       <view class="slot-content">
           <div class="auth-card">
               <div class="img">
                   <img class="avatar-img"
                        src="@/static/logo-min.png"
                        mode="widthFix">
               </div>
               <div class="title">{{bname}}</div>
               <div class="content">申请获得您的手机号</div>
           </div>
           <div class="auth-btncard">
               <!--  #ifdef  MP-WEIXIN -->
               <div class="btn-unok"><u-button :hair-line='false' :custom-style="customStyleUnOk" @click="showAuthorizePhone=false"> 拒绝</u-button></div>
               <div class="btn-ok"><u-button :hair-line='false' :custom-style="customStyleOk" open-type="getPhoneNumber" @getphonenumber="authPhone"> 允许</u-button></div>
               <!--  #endif -->
               <!--  #ifdef  MP-ALIPAY -->
               <div class="btn-unok"><button class="alibtn" @click="showAuthorizePhone=false"> 拒绝</button></div>
               <div class="btn-ok"><button class="alibtn" style="color:#157DFB" @getAuthorize="authPhone" scope='phoneNumber' open-type="getAuthorize"> 允许</button></div>
               <!--  #endif -->
           </div>
       </view>
</u-modal>

3. 授权头像和昵称的弹窗

 <u-modal v-model="showAuthorizeUser" :show-title="false"
          :show-confirm-button="false">
     <view class="slot-content">
         <div class="auth-card">
             <div class="img">
                 <img class="avatar-img"
                      src="@/static/logo-min.png"
                      mode="widthFix">
             </div>
             <div class="title">{{bname}}</div>
             <div class="content">申请获得您的公开信息<br>昵称、头像、地区及性别)</div>
             <!--  #ifdef  MP-WEIXIN -->
             <div style="margin-left: 100rpx;margin-right: 100rpx">
                 <u-form :model="user" ref="uForm">
                     <u-form-item label="头像">
                         <button class="avatar-wrapper" open-type="chooseAvatar" @chooseavatar="onChooseAvatar" slot="right">
                             <image class="avatar" :src="user.avatarUrl"></image>
                         </button>
                     </u-form-item>
                     <u-form-item label="昵称">
                         <input type="nickname" class="weui-input" @blur="userNameInput" placeholder="请输入昵称"/>
                     </u-form-item>
                 </u-form>
             </div>
             <!--  #endif -->
         </div>
         <div class="auth-btncard">
             <!--  #ifdef  MP-WEIXIN -->
             <div class="btn-unok"><u-button :hair-line='false' :custom-style="customStyleUnOk" @click="showAuthorizeUser=false"> 拒绝</u-button></div>
             <div class="btn-ok"><u-button :hair-line='false' :custom-style="customStyleOk" @click="authUser"> 允许</u-button></div>
             <!--  #endif -->
             <!--  #ifdef  MP-ALIPAY -->
             <div class="btn-unok"><button class="alibtn" @click="showAuthorizeUser=false"> 拒绝</button></div>
             <div class="btn-ok"><button class="alibtn" style="color:#157DFB" @getAuthorize="authUser" scope='userInfo' open-type="getAuthorize"> 允许</button></div>
             <!--  #endif -->
         </div>
     </view>
</u-modal>

4. 逻辑部分

微信登录的逻辑

  1. 进入页面先静默获取code。后续需要获取code去后台换用户的手机号。打开授权手机号的弹窗
  2. 用户在授权手机号的弹窗点击允许后
<u-button :hair-line='false' :custom-style="customStyleOk" open-type="getPhoneNumber" @getphonenumber="authPhone"> 允许</u-button>

按钮点击回调方法中可以获得encryptedData


然后拿code和encryptedData去获取用户的手机号,完成注册功能。


注册成功后,把返回的用户信息放入userinfo的缓存中。然后判断用户有无头像信息,如果没有就打开授权用户头像昵称的弹窗。


用户通过chooseAvatar的button获取微信头像或者自定义上传头像


用户通过nickname的input的@blur方法获取昵称。然后保存给用户


支付宝登录的逻辑

  1. 进入页面弹出授权手机号弹窗。用户通过点击
<button class="alibtn" style="color:#157DFB" @getAuthorize="authPhone" scope='phoneNumber' open-type="getAuthorize"> 允许</button>             

该按钮会拉起支付宝的授权手机号的底部弹窗。点击同意后


调用my.getAuthCode获取code,在获取code成功事件中再调用my.getPhoneNumber获取到encryptedData


把code和encryptedData传递给后台服务解析成手机号,从而实现用户的注册功能。


注册成功后把返回的用户信息放入userinfo的缓存中。然后判断用户有无头像信息,如果没有就打开授权用户头像昵称的弹窗。


通过点击授权获取用户信息的按钮

<button class="alibtn" style="color:#157DFB" @getAuthorize="authUser" scope='userInfo' open-type="getAuthorize"> 允许</button>     
  1. 按钮回调方法中调用my.getOpenUserInfo方法,该方法会返回用户的头像和昵称信息

代码如下

export default {
    data() {
        return {
            user:{   avatarUrl:'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0',
                nickName:'',
            },
            hasUserInfo:false,
            // 用户基本信息
            userInfo: null,
            // 微信,支付宝用户code
            code: '',
            // 是否弹出登录注册授权弹窗
            showAuthorizeUser: false,
            showAuthorizePhone: false,
        }
    },
     onShow() {
         this.getWxCode()
         setTimeout(() => {
             this.showAuthorizePhone = true
         }, 100);
    },
    methods: {
          // 静默获取code
        async getWxCode() {
            const loginResult = await uni.login()
            const { code } = loginResult[1]
            this.code = code
            console.log('-------------------code', code)
        },
        //获取昵称输入内容
        userNameInput(e){
            this.user.nickName = e.detail.value
        },
        onChooseAvatar(e) {
            console.log('头像信息》')
            console.log(e)
            this.user.avatarUrl = e.detail.avatarUrl;
        },
        authUser(){
            let userInfo = uni.getStorageSync('userInfo')
            //#ifdef MP-WEIXIN
            if(this.user.nickName==''){
                this.$interactive.toast('请输入您的昵称!')
                return;
            }
            userInfo.avatarurl = this.user.avatarUrl;
            userInfo.nickname =  this.user.nickName;
            this.userInfo = userInfo;
            uni.setStorageSync('userInfo', userInfo)
            this.user.id = userInfo.id;
            this.$api.saveUserInfo(this.user, res => {
                this.hasUserInfo = true;
                this.showAuthorizeUser = false;
            },res =>{})
            //#endif
            //#ifdef MP-ALIPAY
            my.getOpenUserInfo({
                fail: (err) => {
                    console.log('>>>>>>>>>>>>>>>>>err', err)
                },
                success: (res) => {
                    let userInfoAli = JSON.parse(res.response).response // 以下方的报文格式解析两层 response
                    if( userInfoAli.nickName =='' || userInfoAli.nickName==undefined){
                        userInfoAli.nickName =  userInfo.phone;
                    }
                    userInfo.avatarurl = userInfoAli.avatar
                    userInfo.nickname = userInfoAli.nickName
                    this.userInfo = userInfo;
                    this.hasUserInfo = true;
                    uni.setStorageSync('userInfo', userInfo)
                    this.showAuthorizeUser = false;
                    let data = {
                        id:userInfo.id,
                        avatarUrl:userInfoAli.avatar,
                        nickName:userInfoAli.nickName,
                        province:userInfoAli.province,
                        city:userInfoAli.city
                    }
                    this.$api.saveUserInfo(data, res => {},res =>{})
                }
            });
            //#endif
        },
        async authPhone(e){
            let data;
            let _this = this;
            //#ifdef MP-WEIXIN
            const { errMsg, iv, encryptedData } = e.detail;
            if (errMsg !== 'getPhoneNumber:ok') return;
            data = {
                code: this.code,
                encryptedData: encryptedData,
                iv: iv
            }
            this.$api.commRegister(data, res => {
                if(res.data.data.avatarurl){
                    _this.hasUserInfo = true;
                    _this.userInfo = res.data.data;
                }else{
                    _this.showAuthorizeUser = true
                }
                this.getLocksNum(res.data.data.id)
                uni.setStorageSync('userInfo', res.data.data)
                uni.setStorageSync('token', res.data.data.token)
                setTimeout(() => {
                    _this.$interactive.toast('登陆成功')
                }, 300);
            })
            //#endif
            //#ifdef MP-ALIPAY
            my.getAuthCode({
                scopes: 'auth_base',
                success: ({ authCode }) => {
                    my.getPhoneNumber({
                        success: (res) => {
                            data = {
                                code: authCode,
                                encryptedData: res.response
                            }
                            this.$api.commRegister(data, res => {
                                if(res.data.data.avatarurl){
                                    _this.hasUserInfo = true;
                                    _this.userInfo = res.data.data;
                                }else{
                                    _this.showAuthorizeUser = true
                                }
                                uni.setStorageSync('userInfo', res.data.data)
                                uni.setStorageSync('token', res.data.data.token)
                                setTimeout(()=>{
                                    this.getLocksNum(res.data.data.id)
                                    _this.$interactive.toast('登陆成功')
                                },300)
                                console.log('---------登陆成功')
                            })
                        },
                        fail: (err) => {
                            console.log('getPhoneNumber_fail');
                        }
                    });
                },
            });
            //#endif
            this.showAuthorizePhone = false
        },
        openAuth(){
            let userInfo = uni.getStorageSync('userInfo')
            console.log(userInfo)
            if(userInfo){
                this.showAuthorizeUser = true;
            }else{
                this.showAuthorizePhone = true;
            }
        }
    }
}        

5. 结尾

下一篇:springboot微信支付宝双端兼容授权手机号后台接口(待完善)

目录
相关文章
|
2月前
|
应用服务中间件 网络安全 Apache
Discuz! X3.5 开启ssl证书加密后微信、公众号无消息、支付宝通讯中断等
Discuz! X3.5 开启ssl证书加密后微信、公众号无消息、支付宝通讯中断等、支付宝支付实际支付成功,显示未支付等,都属于通讯中断,需要联系DZ官方付费修改程序,屏蔽防CC!
65 4
|
5月前
|
小程序
【微信小程序-原生开发】实用教程12 - 注册页(含获取用户微信昵称,原生form的表单提交,t-result 的使用)
【微信小程序-原生开发】实用教程12 - 注册页(含获取用户微信昵称,原生form的表单提交,t-result 的使用)
54 0
|
6月前
|
存储 小程序 前端开发
【微信小程序 - 工作实战分享】1.微信小程序发送手机短信验证码(阿里云)
【微信小程序 - 工作实战分享】1.微信小程序发送手机短信验证码(阿里云)
541 0
|
2月前
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
1096 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
4月前
|
小程序 安全 Java
|
4月前
|
存储 前端开发 算法
|
4月前
|
存储 小程序 JavaScript
|
4月前
|
存储 小程序 JavaScript
|
5月前
|
存储
支付系统36-------订单表优化,添加payment_type字段,无论是微信支付还是支付宝支付都放到 t_order_info表中了,payment_type用来判断支付宝还是微信支付的
支付系统36-------订单表优化,添加payment_type字段,无论是微信支付还是支付宝支付都放到 t_order_info表中了,payment_type用来判断支付宝还是微信支付的
|
5月前
|
前端开发 小程序
【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)
【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)
426 0