You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
216 lines
6.8 KiB
216 lines
6.8 KiB
<script setup>
|
|
import { onLoad } from '@dcloudio/uni-app';
|
|
import { reactive, ref } from 'vue';
|
|
import { showLoad, hideLoad, showModal, showNone, routeTo } from "@/utils/polish";
|
|
import { douyinMiniAppBaseAuth, douyinMiniAppLoginAndSync } from "../api";
|
|
|
|
let loginRes = ref(null);
|
|
let dyPhoneAuthorize = ref(false);
|
|
const APPID = tt.getEnvInfoSync()?.microapp?.appId ?? '';
|
|
const optionsQuery = ref(null)
|
|
onLoad(() => {
|
|
dysilentLogin();
|
|
console.log(process.env.NODE_ENV)
|
|
});
|
|
|
|
// 抖音获取登陆code, 手机解析需要获取code在点击之前
|
|
let dyGetLoginCode = async function(){
|
|
try{
|
|
let _loginRes = await uni.login();
|
|
if(!_loginRes.code)return showModal({ content: '获取登陆凭证失败!请稍后重试' });
|
|
return loginRes.value = _loginRes;
|
|
}catch(err){
|
|
return showModal({ content: '获取登陆凭证失败!请稍后重试' })
|
|
}
|
|
}
|
|
|
|
// 静默登陆,审核多按钮登陆不过
|
|
// 判断是否需要需要绑定手机,直接手机号登陆
|
|
const dysilentLogin = async function(){
|
|
try{
|
|
let _loginRes = await dyGetLoginCode();
|
|
let _bData = await douyinMiniAppBaseAuth({
|
|
data: { code: _loginRes.code, appid: APPID },
|
|
catch: true,
|
|
errorModal: false
|
|
})
|
|
.catch(err=>{
|
|
// 如果返回11005 则是用户从未授权过
|
|
if(err?.data?.code === 11005)return err;
|
|
return Promise.reject(err);
|
|
})
|
|
dyCheckPhoneStatus(_bData, true);
|
|
}catch(err){
|
|
hideLoad();
|
|
console.warn('silentLogin err --->', err);
|
|
}
|
|
}
|
|
|
|
|
|
// 抖音检查手机绑定状态
|
|
let dyCheckPhoneStatus = async function(_bData, isSilent = false){
|
|
if(_bData.data.code == 0){
|
|
let _data = _bData.data.data;
|
|
if(_data?.user?.extension?.is_auth_mobile === false){ // 手机登陆
|
|
let _codeInfo = await dyGetLoginCode();
|
|
if(_codeInfo&&_codeInfo.code){
|
|
dyPhoneAuthorize.value = true;
|
|
!isSilent&&showNone('未绑定手机,请用手机号登陆!');
|
|
}
|
|
return;
|
|
}
|
|
// 成功后登陆操作
|
|
console.log('成功后登陆操作')
|
|
// if(_data?.token&&!isSilent)return this.successOperate(_bData);
|
|
}else if(_bData.data.code == 11005){ // 手机登陆
|
|
let _codeInfo = await dyGetLoginCode();
|
|
if(_codeInfo&&_codeInfo.code){
|
|
dyPhoneAuthorize.value = true;
|
|
!isSilent&&showNone('未授权,请用手机号登陆!');
|
|
}
|
|
}else{
|
|
!isSilent&&showNone(_bData.data.message || '登陆失败!');
|
|
}
|
|
}
|
|
|
|
// 抖音获取手机号
|
|
async function douyinGetPhoneNumberHandler(e){
|
|
console.log('douyinGetPhoneNumberHandler', e);
|
|
let _detail = e.detail || {};
|
|
if(!_detail?.encryptedData || !_detail?.iv){
|
|
return showModal({
|
|
content: _detail?.errMsg ?? '授权手机失败,请重新操作',
|
|
showCancel: true,
|
|
success: mRes => {
|
|
if(mRes.confirm){
|
|
// 调试
|
|
if(process.env.NODE_ENV === 'development'){
|
|
showModal({
|
|
content: '调试登录',
|
|
showCancel: true,
|
|
success(debugRes){
|
|
if(debugRes?.confirm)debugLogin();
|
|
}
|
|
})
|
|
}
|
|
|
|
}
|
|
if(mRes.cancel){ showNone('已取消登录!'); }
|
|
}
|
|
})
|
|
}
|
|
douyinLoginReq({ phoneDetail: _detail });
|
|
}
|
|
|
|
|
|
function debugLogin(){
|
|
douyinMiniAppLoginAndSync({ data: {
|
|
code: loginRes?.value?.code ?? '',
|
|
appid: APPID,
|
|
version: 'dev',
|
|
dev_data: { phoneNumber: 15521015328 }
|
|
} })
|
|
.then(res=>{
|
|
successOperate(res);
|
|
})
|
|
}
|
|
|
|
|
|
// 抖音后台登陆
|
|
function douyinLoginReq({ phoneDetail = null, }){
|
|
let _query = {
|
|
appid: APPID ?? '',
|
|
code: loginRes?.value?.code ?? '',
|
|
};
|
|
if(phoneDetail){
|
|
_query = {
|
|
..._query,
|
|
encryptedData: phoneDetail?.encryptedData ?? '',
|
|
iv: phoneDetail?.iv ?? '',
|
|
}
|
|
}
|
|
douyinMiniAppLoginAndSync({ data: _query, catch: true })
|
|
.then(res=>{
|
|
successOperate(res);
|
|
})
|
|
.catch(err=>{
|
|
setTimeout(_=>dyGetLoginCode(), 1000);
|
|
})
|
|
}
|
|
|
|
// 获取token 成功&缓存查个人信息
|
|
function successOperate(res){
|
|
console.log(res);
|
|
showNone(res?.message || '登陆成功!');
|
|
let _data = res?.data ?? {};
|
|
uni.setStorageSync('token',_data?.token ?? '');
|
|
setTimeout(routeOperate, 1200);
|
|
}
|
|
|
|
// 授权成功后路由
|
|
function routeOperate(){
|
|
let _pageLs = getCurrentPages();
|
|
let _opts = optionsQuery?.value ?? {}
|
|
if(+_opts?.type === 2 &&_opts?.path){
|
|
let _path = decodeURIComponent(_opts?.path);
|
|
// getCurrentPages的微信小程序二维码的secne值会encodeURIComponent两次
|
|
return routeTo(decodeURIComponent(_path), 'rT');
|
|
}
|
|
if(+_opts?.type === 1&&_pageLs.length > 1)return routeTo();
|
|
if(_pageLs.length <= 1)return routeTo('/pages/index/index', 'sT');
|
|
routeTo();
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<view class="authorize-index">
|
|
<view class="ac-tit">您还未登录</view>
|
|
<view class="ac-tip">请先登录再进行操作</view>
|
|
<image class="ac-img" mode="aspectFit" src="@/subpackage/authorize/static/images/authorize.png"></image>
|
|
<view class="ac-btns">
|
|
<button v-if="dyPhoneAuthorize" plain class="ab-btn" open-type="getPhoneNumber" @getphonenumber="douyinGetPhoneNumberHandler">抖音手机号授权快捷登录</button>
|
|
<button v-else plain class="ab-btn" >抖音用户信息授权登录</button>
|
|
<button plain class="ab-btn" hover-class="hover-active" @click="cancel">暂不登录</button>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<style lang="scss" scoped>
|
|
.authorize-index{
|
|
padding-top: 124upx;
|
|
.ac-tit{
|
|
text-align: center;
|
|
@include flcw(32upx, 44upx, #333, 500);
|
|
}
|
|
.ac-tip{
|
|
margin-top: 20upx;
|
|
text-align: center;
|
|
@include flcw(28upx, 40upx, #9A9A9D);
|
|
}
|
|
.ac-img{
|
|
display: block;
|
|
margin: 2upx auto 0;
|
|
width: 578upx;
|
|
height: 578upx;
|
|
}
|
|
.ac-btns{
|
|
margin-top: 62upx;
|
|
width: 100%;
|
|
padding: 0 20upx;
|
|
.ab-btn{
|
|
@include clearBtn;
|
|
margin-top: 24upx;
|
|
text-align: center;
|
|
border: 2upx solid $mColor;
|
|
border-radius: 44upx;
|
|
background-color: $mColor;
|
|
@include flcw(28up, 84upx, #fff);
|
|
&+.ab-btn{
|
|
border-color: #C9C9CB;
|
|
color: #9a9a9d;
|
|
background-color: transparent;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|