流程:登录注册功能,通过uni.getUserProfile获取wxcode,通过wxcode传给后端获取openid,sessionkey,unionid。
通过<u-button type="success" open-type="getPhoneNumber" @getphonenumber="decryptPhoneNumber">一键登录</u-button>,
传到后端这些参数:
'session_key': $this.openidData.sessionKey,
'encryptedData': e.detail.encryptedData,
'iv': e.detail.iv
获取手机号,
再将手机号,unionid,openid传到后端进行登录
<template><view class="page"><!-- 自定义头部 navbar --><u-navbar back-icon-name="arrow-left" title=" " :custom-back="navbarBack":background="{ backgroundColor: 'rgba(0,0,0,0)' }" :border-bottom="false":is-back="pageStatus != 'home'"></u-navbar><!-- logo --><view class="logo-wrap" v-if="pageStatus == 'home' || pageStatus == 'getWxRole'"><image class="logo"src="xxxxxxxxxxxxxx/static/login/login_logo.png"></image><view class="app-name">欢迎登录</view><view class="app-title">弘云艺术中心</view></view><!-- 默认登录页面显示 --><view style="width: 100%;" v-if="pageStatus == 'home'"><view class="text-area" @click="loginByWx">手机号快捷登录</view></view><!-- 微信授权登录,获取用户信息 --><view style="width: 100%;" v-if="pageStatus == 'getWxRole'"><view class="info">为提供优质服务,需要获取你的以下信息 :</view><view class="public"><view class="public-dot"></view><view class="public-text">你的公开信息(头像、昵称等)</view></view><view class="text-enter" @click="getWxLoginRole">授权进入</view></view><!-- 微信登录小程序,再授权获取用户信息之后 --><view class="loginWx" v-if="pageStatus == 'loginByWx'"><view class="title">欢迎使用 弘云艺术中心</view><view class="desc">立即登录享受优质服务</view><view class="avatar"><image mode="aspectFill" :src="wxLoginUserInfo.userInfo.avatarUrl"></image></view><u-button type="success" open-type="getPhoneNumber" @getphonenumber="decryptPhoneNumber">一键登录</u-button></view><!-- 协议勾选 --><view class="agree" v-if="pageStatus == 'home' || pageStatus == 'getWxRole' "><view class="agree_img" @click="changeAgreeFlag" v-show="!agree_flag"><image src="xxxxxxxxxxx/static/mine/check.png"></image></view><view class="agree_img" @click="changeAgreeFlag" v-show="agree_flag"><image src="xxxxxxxxxxxxxxxxx/static/operate/checked.png"></image></view><view class="agree_text">登录代表您已同意<span>《用户服务协议》《隐私权政策》</span></view></view></view>
</template><script>import FunUniappTheme from '@/theme.scss';export default {data() {return {pageStatus: 'home',agree_flag: false,wxLoginUserInfo: {},openId: '',userInfo: {},openidData: {}};},onShow() {},onLoad(ops) {if (ops && ops.interceptcard && ops.interceptcard === "true") {uni.showToast({title: '购买商品,请先登录注册。',icon: 'none',duration: 4000,});}if (ops && ops.goods_id_detail) {console.log(ops.goods_id_detail, '二维码商品详情')uni.setStorageSync('goods_id_detail', ops.goods_id_detail)}console.log(FunUniappTheme);},onReady() {},methods: {changeAgreeFlag() {this.agree_flag = !this.agree_flag;},loginByWx() {if (!this.agree_flag) {uni.showToast({icon: 'none',title: '请先阅读并勾选协议'});return;}this.getUserInfoByWx(() => {this.getWxCode(code => {let $this = this;console.log('执行了吗', code)uni.request({url: "xxxxxxxxxxxxxx/mobile/index.php?m=user&c=indexapi&a=oauth2",method: 'POST',header: {'Content-Type': 'application/x-www-form-urlencoded'},data: {'wxcode': code,'parent_unionid': uni.getStorageSync('unionid')},success(res) {$this.openidData = res.data.data;console.log(res.data.data, 9999, $this.openidData);uni.setStorageSync('OPEN_ID', res.data.data.openid)}});});});},navbarBack() {if (this.pageStatus == 'getWxRole' || this.pageStatus == 'loginByWx' ) {this.pageStatus = 'home';} else if (this.pageStatus == 'forgetPwd' || this.pageStatus == 'resetPwd') {this.pageStatus = 'loginByPwd';} else if (this.pageStatus == 'loginByPwd') {this.pageStatus = 'loginByCode';}},getWxLoginRole() {if (!this.agree_flag) {uni.showToast({icon: 'none',title: '请先阅读并勾选协议'});return;}this.getUserInfoByWx(() => {this.getWxCode(code => {let $this = this;console.log('执行了吗', code)uni.request({url: "xxxxxxxxxxxxxxx/mobile/index.php?m=user&c=indexapi&a=oauth2",method: 'POST',header: {'Content-Type': 'application/x-www-form-urlencoded'},data: {'wxcode': code,'parent_unionid': uni.getStorageSync('unionid')},success(res) {$this.openidData = res.data.data;console.log(res.data.data, 9999, $this.openidData);uni.setStorageSync('OPEN_ID', res.data.data.openid)}});});});},userinfo() {uni.request({url: "xxxxxxxxxxxxxindex.php?m=user&c=indexapi&a=userinfo",method: 'POST',header: {'Content-Type': 'application/x-www-form-urlencoded'},data: {'open_id': uni.getStorageSync('OPEN_ID')},success(res) {console.log(res.data.data, '个人中心222');uni.setStorageSync('USER_ID', res.data.data.info.user_id)uni.setStorageSync('user_rank', res.data.data.info.user_rank)if (uni.getStorageSync('goods_id_detail')) {uni.reLaunch({url: '/pages-mall/pages/goods/detail?goods_id_detail=' + uni.getStorageSync('goods_id_detail')});} else {uni.reLaunch({url: '/pages/home/index'});}}});},getWxCode(callBack) {uni.login({provider: 'weixin',onlyAuthorize: true,success: loginRes => {console.log(loginRes, '获取信息')callBack(loginRes.code);},fail(e) {}});},getOpenId(code, callBack) {this.$u.api.getOpenId(code).then(res => {callBack(res);});},getUserInfoByWx(callBack) {let $this = this;uni.getUserProfile({desc: '获取你的昵称、头像',success: function(data) {console.log(data, '用户信息')uni.setStorageSync({key: 'APP_WX_USERINFO',data: data});$this.wxLoginUserInfo = data;$this.pageStatus = 'loginByWx';callBack();},fail: function(error) {}});},decryptPhoneNumber(e) {let $this = this;console.log(e.detail, 9898)uni.request({url: "xxxxxxxxxxxxxxx/index.php?m=user&c=indexapi&a=decryptwechatdata",method: 'POST',header: {'Content-Type': 'application/x-www-form-urlencoded'},data: {'session_key': $this.openidData.sessionKey,'encryptedData': e.detail.encryptedData,'iv': e.detail.iv},success(res) {console.log(res.data, '手机号');uni.request({url: "xxxxxxxxxxxxxxxxxxxxxx/index.php?m=oauth&c=indexapi&a=bind_register",method: 'POST',header: {'Content-Type': 'application/x-www-form-urlencoded'},data: {'mobile': res.data.data.phoneNumber,'unionid': $this.openidData.unionid,'openid': $this.openidData.openid},success(res) {console.log(res.data, '登录成功');if (res.data.code === 0) {$this.userinfo()uni.setStorageSync('IS_LOGIN', true);uni.setStorageSync('fh_type',0)console.log(uni.getStorageSync('IS_LOGIN'), '成功了?', uni.getStorageSync('USER_ID'))}}});}});},loginByOpenId() {const openid = uni.getStorageSync('OPEN_ID');this.$u.api.loginByOpenId(openid).then(res => {this.userInfo = res;});},}};
</script><style lang="scss" scoped>.page {padding: 0 40rpx;background-color: $app-theme-bg-color;}.logo-wrap {display: flex;padding-top: 100rpx;padding-bottom: 52rpx;flex-wrap: wrap;.logo {height: 168rpx;width: 166rpx;margin-left: 76rpx;margin-top: 50rpx;}.app-name {width: 100%;padding-top: 80rpx;margin-left: 78rpx;font-size: 38rpx;font-weight: 600;color: #333333;line-height: 52rpx;}.app-title {width: 100%;padding-top: 16rpx;margin-left: 78rpx;font-size: 38rpx;font-weight: 600;color: #333333;line-height: 52rpx;}}.text-area {width: 100%;height: 96rpx;background: #19be6b;font-weight: 400;border-radius: 56rpx;color: $app-theme-text-white-color;line-height: 16px;font-size: 32rpx;text-align: center;line-height: 96rpx;}.info {font-size: 28rpx;font-weight: 400;color: $app-theme-text-black-color;line-height: 28rpx;margin-top: 180rpx;}.public {display: flex;align-items: center;margin-top: 30rpx;.public-dot {width: 6rpx;height: 6rpx;background: #999999;margin-right: 10rpx;}.public-text {font-size: 24rpx;font-weight: 400;color: #8f92a1;line-height: 24rpx;}}.text-enter {width: 100%;margin-top: 50rpx;height: 96rpx;background: $app-theme-color;font-weight: 400;border-radius: 56rpx;color: #ffffff;line-height: 16px;font-size: 32rpx;text-align: center;line-height: 96rpx;}.head {margin-top: 70rpx;width: 100%;display: flex;justify-content: space-between;}.back {width: 40rpx;height: 40rpx;}.agree {position: fixed;left: 50%;transform: translate(-50%, 0);bottom: 66rpx;width: 100vw;display: flex;align-items: center;justify-content: center;}.agree_img image {width: 32rpx;height: 32rpx;display: flex;align-items: center;}.agree_text {margin-left: 8rpx;font-size: 24rpx;font-weight: 400;color: #8f92a1;line-height: 24rpx;display: flex;align-items: center;span {color: $app-theme-color;}}.loginWx {width: 100%;padding-top: 64rpx;.title {text-align: left;font-size: 22px;font-family: PingFang-SC-Regular, PingFang-SC;font-weight: 400;color: #171717;line-height: 30px;margin-bottom: 12rpx;}.desc {text-align: left;font-size: 14px;font-family: PingFang-SC-Regular, PingFang-SC;font-weight: 400;color: #8f92a1;line-height: 14px;}.avatar {width: 160rpx;height: 160rpx;overflow: hidden;border-radius: 50%;display: flex;align-items: center;justify-content: center;margin: 128rpx auto 160rpx auto;image {width: 100%;height: 100%;}}}
</style>