wechat.js 7.6 KB
/**
 * 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,
				});
				console.log('====  loginResult:',loginResult[1].code );
				console.log('====  loginResult:',loginResult[1] );
				if (loginResult[1].errMsg !== 'login:ok') {
					uni.showToast({
						title: loginResult.errMsg,
						icon: 'none',
					});
					return Promise.reject('').catch(()=>{});
				}
				const authResult = loginResult[1].authResult;
				const codeVal = []
				codeVal.push(loginResult[1].code)
				console.log('==== codeVal :',codeVal );
				console.log('==== event :', event);
				const res = await api("user.wxOpenPlatformOauth", {
					event:event,
					code:codeVal
				}, that.eventMap(event));
				console.log('==== res :', res);
				if (res.code === 1) {
					return Promise.resolve(res.data.token);
				} else {
					console.log('==== res.msg :', res.msg);
					uni.showToast({
						title: res.msg,
						icon: 'none',
					});
				}
				return Promise.reject('').catch(()=>{});
		// uni.login({ 
		// 	"provider": "weixin",
		// 	"onlyAuthorize": true, // 微信登录仅请求授权认证
		// 	success: function(event){
		// 		const {code} = event
		// 		//客户端成功获取授权临时票据(code),向业务服务器发起登录请求。
		// 		console.log('==== code :', code);
		// 	},
		// 	fail: function (err) {
		// 		console.log('==== err :', err);
		//         // 登录授权失败  
		//         // err.code是错误码
		//     }
		// })
		// const loginResult = await uni.login({
		// 	provider: 'weixin',
		// 	onlyAuthorize: true,
		// });
		// console.log('====  loginResult:', loginResult);
		// if (loginResult.errMsg !== 'login:ok') {
		// 	uni.showToast({
		// 		title: loginResult.errMsg,
		// 		icon: 'none',
		// 	});
		// 	return Promise.reject('');
		// }
		// const authResult = loginResult.authResult;
		// console.log('====  authResult:', 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


};