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.
qixie/shopro/wechat/wechat.js

240 lines
6.0 KiB

2 years ago
/**
* Wechat v1.2.1
* @Class Wechat
* @description shopro-wechat 1.2.1 wehcat第三方登录组件
* @Author lidongtony
* @Date 2022-12-12
* @Email lidongtony@qq.com
*/
import api from "@/shopro/request/index";
import $platform from "@/shopro/platform";
import store from "@/shopro/store";
import {
API_URL
} from "@/env";
export default {
eventMap(event) {
let map = "";
switch (event) {
case "login":
map = "登录中...";
break;
case "refresh":
map = "更新中...";
break;
case "bind":
map = "绑定中...";
break;
}
return map;
},
async login(payload) {
let token = "";
// #ifdef MP-WEIXIN
token = await this.wxMiniProgramOauth("login", payload);
return token;
// #endif
// #ifdef H5
this.wxOfficialAccountOauth("login");
// #endif
// #ifdef APP-PLUS
token = await this.wxOpenPlatformOauth("login");
return token;
// #endif
},
async refresh() {
let token = "";
// #ifdef MP-WEIXIN
token = await this.wxMiniProgramOauth("refresh");
return token;
// #endif
// #ifdef H5
this.wxOfficialAccountOauth("refresh");
// #endif
// #ifdef APP-PLUS
token = await this.wxOpenPlatformOauth("refresh");
return token;
// #endif
},
async bind(payload) {
let token = "";
// #ifdef MP-WEIXIN
token = await this.wxMiniProgramOauth("bind", payload);
return token;
// #endif
// #ifdef H5
this.wxOfficialAccountOauth("bind");
// #endif
// #ifdef APP-PLUS
token = await this.wxOpenPlatformOauth("bind");
return token;
// #endif
},
// #ifdef H5
// 微信公众号网页登录&刷新头像昵称&绑定
wxOfficialAccountOauth(event = "login") {
if ($platform.get() !== "wxOfficialAccount") {
uni.showToast({
title: "请在微信浏览器中打开",
icon: "none"
});
throw false;
}
let host = $platform.host();
let payloadObject = {
host: host,
event,
token: (event !== "login" && store.getters.isLogin) ? uni.getStorageSync("token") : ""
};
let payload = encodeURIComponent(JSON.stringify(payloadObject));
let redirect_uri = encodeURIComponent(`${API_URL}user/wxOfficialAccountOauth?payload=${payload}`);
let oauthUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + store.getters.initWechat.appid +
`&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_userinfo&state=1`;
uni.setStorageSync("lastPage", window.location.href);
window.location = oauthUrl;
},
// 微信公众号网页静默登录:临时登录获取OpenId 不入库不绑定用户
wxOfficialAccountBaseLogin() {
let state = encodeURIComponent(window.location.href);
window.location = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + store.getters.initWechat
.appid +
`&redirect_uri=${API_URL}user/wxOfficialAccountBaseLogin&response_type=code&scope=snsapi_base&state=${state}`;
throw "stop";
},
// #endif
// #ifdef APP-PLUS
// 微信开放平台登录
async wxOpenPlatformOauth(event = "login") {
let that = this;
const loginResult = await uni.login({
provider: 'weixin',
onlyAuthorize: true,
});
if (loginRes.errMsg !== 'login:ok') {
uni.showToast({
title: loginRes.errMsg,
icon: 'none',
});
return Promise.reject('');
}
const authResult = loginRes.authResult;
const res = await api("user.wxOpenPlatformOauth", {
authResult,
event
}, that.eventMap(event));
if (res.code === 1) {
return Promise.resolve(res.data.token);
} else {
uni.showToast({
title: res.msg,
icon: 'none',
});
}
return Promis.reject('');
},
// #endif
// #ifdef MP-WEIXIN
// 微信小程序静默登录
async getWxMiniProgramSessionKey(autoLogin = true) {
const loginResult = await uni.login();
if (loginResult[1].errMsg !== 'login:ok') {
uni.showToast({
title: loginResult[1].errMsg,
icon: "none"
});
return Promise.reject(loginResult[1].errMsg);
}
const res = await api("user.getWxMiniProgramSessionKey", {
code: loginResult[1].code,
autoLogin: autoLogin
});
if (res.code === 1) {
uni.setStorageSync("session_id", res
.data.session_id);
if (autoLogin) {
if (res.data.token) {
return Promise.resolve(res.data.token);
} else {
return Promise.resolve('');
}
}
return Promise.resolve(res.data.session_id);
} else {
return Promise.reject(res.msg);
}
},
// 微信小程序获取用户手机号登录
async wxMiniProgramOauth(event = "login", payload) {
let that = this;
uni.showLoading({
title: that.eventMap(event)
});
if (payload.detail.errMsg !== 'getPhoneNumber:ok') {
uni.showToast({
title: payload.detail.errMsg,
icon: "none"
});
return Promise.reject(payload.detail.errMsg);
}
const res = await api("user.wxMiniProgramOauth", {
event,
code: payload.detail.code,
iv: payload.detail.iv,
encryptedData: payload.detail.encryptedData,
session_id: uni.getStorageSync("session_id"),
});
if (res.code === 1) {
return Promise.resolve(res.data.token);
} else {
uni.removeStorageSync("session_id");
that.getWxMiniProgramSessionKey(false);
return Promise.resolve(false);
}
},
// 小程序更新
checkMiniProgramUpdate() {
if (uni.canIUse("getUpdateManager")) {
const updateManager = uni.getUpdateManager();
updateManager.onCheckForUpdate(function (res) {
// 请求完新版本信息的回调
if (res.hasUpdate) {
updateManager.onUpdateReady(function () {
uni.showModal({
title: "更新提示",
content: "新版本已经准备好,是否重启应用?",
success: function (res) {
if (res.confirm) {
// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
updateManager.applyUpdate();
}
}
});
});
updateManager.onUpdateFailed(function () {
// 新的版本下载失败
uni.showModal({
title: "已经有新版本了哟~",
content: "新版本已经上线啦~,请您删除当前小程序,重新搜索打开哟~"
});
});
}
});
}
},
// #endif
};