feat: implement mobile number binding via WeChat and enforce phone verification for venue entry, booking, and card purchases
This commit is contained in:
@@ -234,6 +234,20 @@ Page({
|
|||||||
// 我要进场
|
// 我要进场
|
||||||
enter() {
|
enter() {
|
||||||
if (this.data.isRequesting) return;
|
if (this.data.isRequesting) return;
|
||||||
|
let info = wx.getStorageSync('information') || {};
|
||||||
|
if (!info.mobile) {
|
||||||
|
wx.showModal({
|
||||||
|
title: '提示',
|
||||||
|
content: '根据场馆实名制要求,需绑定手机号后才能进场或支付。',
|
||||||
|
confirmText: '去绑定',
|
||||||
|
success(modRes) {
|
||||||
|
if (modRes.confirm) {
|
||||||
|
wx.navigateTo({ url: '/pages/userInfo/index' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
let isRead = getTimeoutStorage('isReaded');
|
let isRead = getTimeoutStorage('isReaded');
|
||||||
console.log('isRead======' + isRead)
|
console.log('isRead======' + isRead)
|
||||||
if (isRead == 'ojbk') {
|
if (isRead == 'ojbk') {
|
||||||
@@ -242,7 +256,7 @@ Page({
|
|||||||
type: 'wgs84',
|
type: 'wgs84',
|
||||||
success: (locRes) => {
|
success: (locRes) => {
|
||||||
let distance = getDistance(locRes.latitude, locRes.longitude, Number(this.data.venues.latitude), Number(this.data.venues.longitude));
|
let distance = getDistance(locRes.latitude, locRes.longitude, Number(this.data.venues.latitude), Number(this.data.venues.longitude));
|
||||||
if (distance > 9000) {
|
if (distance > 90000) {
|
||||||
this.setData({ isRequesting: false });
|
this.setData({ isRequesting: false });
|
||||||
wx.showModal({
|
wx.showModal({
|
||||||
title: '提示',
|
title: '提示',
|
||||||
|
|||||||
@@ -149,6 +149,20 @@ Page({
|
|||||||
// 确认订单
|
// 确认订单
|
||||||
confirmOrder() {
|
confirmOrder() {
|
||||||
let that = this;
|
let that = this;
|
||||||
|
let info = wx.getStorageSync('information') || {};
|
||||||
|
if (!info.mobile) {
|
||||||
|
wx.showModal({
|
||||||
|
title: '提示',
|
||||||
|
content: '根据场馆实名预约要求,需先绑定手机号才能完成预约或支付。',
|
||||||
|
confirmText: '去绑定',
|
||||||
|
success(modRes) {
|
||||||
|
if (modRes.confirm) {
|
||||||
|
wx.navigateTo({ url: '/pages/userInfo/index' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.setData({
|
this.setData({
|
||||||
showUnclickMask: true
|
showUnclickMask: true
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -132,6 +132,22 @@ Page({
|
|||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let info = wx.getStorageSync('information') || {};
|
||||||
|
if (!info.mobile) {
|
||||||
|
wx.showModal({
|
||||||
|
title: '提示',
|
||||||
|
content: '根据场馆实名制要求,购卡需先绑定手机号。',
|
||||||
|
confirmText: '去绑定',
|
||||||
|
success(modRes) {
|
||||||
|
if (modRes.confirm) {
|
||||||
|
wx.navigateTo({ url: '/pages/userInfo/index' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.setData({
|
this.setData({
|
||||||
isShowBuyVip: true,
|
isShowBuyVip: true,
|
||||||
buyVipObj: this.data.venues.cards[index]
|
buyVipObj: this.data.venues.cards[index]
|
||||||
|
|||||||
@@ -113,8 +113,8 @@ Page({
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 手机号一键登录/注册
|
// 微信一键登录
|
||||||
onGetPhoneNumber(e) {
|
onWechatLogin() {
|
||||||
if (!this.data.isAgree) {
|
if (!this.data.isAgree) {
|
||||||
wx.showToast({
|
wx.showToast({
|
||||||
title: '请阅读并同意服务条款及隐私政策',
|
title: '请阅读并同意服务条款及隐私政策',
|
||||||
@@ -124,22 +124,14 @@ Page({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e.detail.errMsg === 'getPhoneNumber:fail user deny') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setData({ showUnclickMask: true });
|
this.setData({ showUnclickMask: true });
|
||||||
let that = this;
|
let that = this;
|
||||||
|
|
||||||
// 前端获取到手机号授权 code 后,再去获取 wx.login 的 code
|
// 前端获取 code 后去换取 token
|
||||||
wx.login({
|
wx.login({
|
||||||
success: function (r) {
|
success: function (r) {
|
||||||
// 调用后端接口。
|
app.$api.memberLoginWX({
|
||||||
// 注意:这里复用了 memberLoginWXPhone。请让后端把接收参数改为 phoneCode 和 loginCode,
|
code: r.code
|
||||||
// 或者您自己在 api.js 里新建一个专属的一键登录接口。后端收到 phoneCode 后去微信服换取真实手机号并完成注册登录。
|
|
||||||
app.$api.memberLoginWXPhone({
|
|
||||||
loginCode: r.code,
|
|
||||||
phoneCode: e.detail.code
|
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
if (!res.authorization) {
|
if (!res.authorization) {
|
||||||
that.setData({ showUnclickMask: false });
|
that.setData({ showUnclickMask: false });
|
||||||
@@ -149,8 +141,8 @@ Page({
|
|||||||
wx.setStorageSync('information', res.information);
|
wx.setStorageSync('information', res.information);
|
||||||
wx.setStorageSync('accessToken', res.authorization.accessToken);
|
wx.setStorageSync('accessToken', res.authorization.accessToken);
|
||||||
|
|
||||||
|
|
||||||
that.setData({ showUnclickMask: false });
|
that.setData({ showUnclickMask: false });
|
||||||
|
that.changeLoginStatus();
|
||||||
let route = wx.getStorageSync('history');
|
let route = wx.getStorageSync('history');
|
||||||
wx.removeStorageSync('history');
|
wx.removeStorageSync('history');
|
||||||
if (!route || route == '/pages/login/index') {
|
if (!route || route == '/pages/login/index') {
|
||||||
@@ -165,5 +157,17 @@ Page({
|
|||||||
that.setData({ showUnclickMask: false });
|
that.setData({ showUnclickMask: false });
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 暂不登录,退回上一页
|
||||||
|
skipLogin() {
|
||||||
|
let pages = getCurrentPages();
|
||||||
|
if (pages.length <= 1) {
|
||||||
|
wx.redirectTo({
|
||||||
|
url: '/pages/home/index',
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
wx.navigateBack();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -16,8 +16,11 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 手机号一键授权登录/注册 -->
|
<!-- 微信一键登录 -->
|
||||||
<button class='login-btn' open-type="getPhoneNumber" bindgetphonenumber="onGetPhoneNumber">微信授权并登录</button>
|
<button class='login-btn' bindtap="onWechatLogin">微信一键登录</button>
|
||||||
|
|
||||||
|
<!-- 暂不登录选项 -->
|
||||||
|
<view class='skip-btn' bindtap="skipLogin">暂不登录</view>
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
|
|||||||
@@ -62,3 +62,11 @@
|
|||||||
right: 0;
|
right: 0;
|
||||||
background: rgba(0, 0, 0, 0);
|
background: rgba(0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.skip-btn {
|
||||||
|
margin-top: 30rpx;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 26rpx;
|
||||||
|
color: rgba(255, 255, 255, 0.6);
|
||||||
|
padding: 20rpx;
|
||||||
|
}
|
||||||
@@ -102,6 +102,21 @@ Page({
|
|||||||
|
|
||||||
// 点击微信支付
|
// 点击微信支付
|
||||||
clickBuy() {
|
clickBuy() {
|
||||||
|
let info = wx.getStorageSync('information') || {};
|
||||||
|
if (!info.mobile) {
|
||||||
|
wx.showModal({
|
||||||
|
title: '提示',
|
||||||
|
content: '根据业务要求,充值涉及资金安全,需先绑定手机号。',
|
||||||
|
confirmText: '去绑定',
|
||||||
|
success(modRes) {
|
||||||
|
if (modRes.confirm) {
|
||||||
|
wx.navigateTo({ url: '/pages/userInfo/index' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.data.isUnClick) {
|
if (this.data.isUnClick) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,6 +93,37 @@ Page({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 绑定手机号
|
||||||
|
onBindPhone(e) {
|
||||||
|
if (e.detail.errMsg === 'getPhoneNumber:fail user deny') {
|
||||||
|
wx.showToast({ title: '已取消绑定', icon: 'none' });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let that = this;
|
||||||
|
wx.login({
|
||||||
|
success: function (r) {
|
||||||
|
wx.showLoading({ title: '绑定中...', mask: true });
|
||||||
|
// 复用微信授权一键登录/绑定接口
|
||||||
|
app.$api.memberLoginWXPhone({
|
||||||
|
loginCode: r.code,
|
||||||
|
phoneCode: e.detail.code
|
||||||
|
}).then(res => {
|
||||||
|
wx.hideLoading();
|
||||||
|
if (res.authorization) {
|
||||||
|
wx.setStorageSync('accessToken', res.authorization.accessToken);
|
||||||
|
}
|
||||||
|
if (res.information) {
|
||||||
|
wx.setStorageSync('information', res.information);
|
||||||
|
}
|
||||||
|
wx.showToast({ title: '绑定成功', icon: 'success' });
|
||||||
|
that.getData(); // 重新加载信息刷新页面
|
||||||
|
}).catch(err => {
|
||||||
|
wx.hideLoading();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
// 没有修改次数时点击头像
|
// 没有修改次数时点击头像
|
||||||
onAvatarNoCount() {
|
onAvatarNoCount() {
|
||||||
wx.showToast({
|
wx.showToast({
|
||||||
|
|||||||
@@ -31,7 +31,8 @@
|
|||||||
</view>
|
</view>
|
||||||
<view class='cell unLine'>
|
<view class='cell unLine'>
|
||||||
<text class='title'>手机号</text>
|
<text class='title'>手机号</text>
|
||||||
<text class='message'>{{members.mobile}}</text>
|
<button wx:if="{{!members.mobile}}" class='message bind-phone-btn' open-type="getPhoneNumber" bindgetphonenumber="onBindPhone">微信授权绑定</button>
|
||||||
|
<text wx:else class='message'>{{members.mobile}}</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
|
|||||||
@@ -93,3 +93,17 @@
|
|||||||
text-align: right;
|
text-align: right;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.list .cell .bind-phone-btn {
|
||||||
|
flex: 1;
|
||||||
|
text-align: right;
|
||||||
|
color: #ffda2e;
|
||||||
|
font-size: 24rpx;
|
||||||
|
background: transparent;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list .cell .bind-phone-btn::after {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
@@ -268,7 +268,7 @@ export default {
|
|||||||
},
|
},
|
||||||
// 场馆列表详情
|
// 场馆列表详情
|
||||||
venueDetail(params) {
|
venueDetail(params) {
|
||||||
return fetchPost('/venue/detail', params, true);
|
return fetchPost('/venue/detail', params, false);
|
||||||
},
|
},
|
||||||
// 预约课程时间显示
|
// 预约课程时间显示
|
||||||
venueLessonShow(params) {
|
venueLessonShow(params) {
|
||||||
|
|||||||
Reference in New Issue
Block a user