流程:登录注册功能, 通过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>