question_uniapp/config/html5Utils.js
2025-06-10 17:10:40 +08:00

245 lines
7.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import base from '@/config/baseUrl';
import store from '@/config/store';
import $http from '@/config/requestConfig'
import { getLocation, setShare } from '@/plugins/wxJsSDK';
/**
* APP内嵌网页 -- 安卓IOS交互
* 交互区分名称shangChengView
* 示例appMutual("方法名称", "传递的参数")
* 相当与安卓交互window.shangChengView["方法名称"]("传递的参数");
*/
export const appMutual = (name, query = null, errCallback) => {
if (/android/i.test(navigator.userAgent)) {
if (window.shangChengView) {
if (typeof(query) == "object") {
query = JSON.stringify(query);
}
window.shangChengView[name](query);
} else {
errCallback && errCallback();
}
} else if (/ios|iphone|ipod|pad/i.test(navigator.userAgent)) {
if (window.webkit) {
window.webkit.messageHandlers[name].postMessage(query)
} else {
errCallback && errCallback();
}
}
};
/**
* 获取url中的参数
*/
export const getUrlData = () => {
var strs;
var url = window.location.href; //获取url中"?"符后的字串
var theRequest = new Object();
if (url.indexOf("?") != -1) {
url = url.substr(url.indexOf("?"));
var str = url.substr(1);
strs = str.split("&");
for (var i = 0; i < strs.length; i++) {
var index = strs[i].indexOf("=");
theRequest[strs[i].slice(0, index)] = unescape(strs[i].slice(index + 1, strs[i].length));
}
}
return theRequest;
}
//公众号微信支付
export const wxPublicPay = (payInfo, callback) => {
$http.get("api/pay/v1/pay_public_wx", {
orderNo: payInfo.orderNo
}).then(data => {
let wxConfigObj = {
appId: data.appId,
timeStamp: data.timeStamp,
nonceStr: data.nonceStr,
package: data.package,
signType: data.signType,
paySign: data.sign
};
function onBridgeReady() {
window.WeixinJSBridge.invoke("getBrandWCPayRequest", wxConfigObj, function(
res
) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
callback && callback(res);
} else // 使用以上方式判断前端返回,微信团队郑重提示res.err_msg将在用户支付成功后返回 ok但并不保证它绝对可靠。
if (res.err_msg == "get_brand_wcpay_request:cancel") {
// common.loadWarn('支付遇到问题,您取消了支付');
} else
if (res.err_msg == "get_brand_wcpay_request:fail") {
// common.myConfirm('支付遇到问题,您可能需要重新登录', '', function () {
// obj.wxLoginOAuth();
// });
}
});
}
if (typeof window.WeixinJSBridge == "undefined") {
if (document.addEventListener) {
document.addEventListener("WeixinJSBridgeReady", onBridgeReady, false);
} else if (document.attachEvent) {
document.attachEvent("WeixinJSBridgeReady", onBridgeReady);
document.attachEvent("onWeixinJSBridgeReady", onBridgeReady);
}
} else {
onBridgeReady();
}
});
};
// 浏览器判断
export const getBrowser = () => {
let ua = navigator.userAgent.toLowerCase();
if (ua.match(/MicroMessenger/i) == "micromessenger") {
return "微信";
}
return "其他";
};
// 获取地址信息(公众号获取 或 内嵌APP获取
export const getLatLonH5 = function(successCallback, errCallback) {
if (getBrowser() == '微信') {
getLocation().then(res => {
successCallback(res);
}, err => {
console.log("位置信息错误", err);
errCallback("位置信息获取失败");
});
} else {
let clearTime = setTimeout(() => {
errCallback("获取经纬度超时");
}, 5000);
window.getAppLatLon = function(res) {
clearTimeout(clearTime);
successCallback(res);
}
appMutual("getAppLatLon", true);
}
};
// 公众号分享
export const publicShareFun = function (info = {},callback) {
if (getBrowser() == "微信") {
let shareInfo = {
title: info.shareTitle || info.title || base.share.title,
desc: info.desc || info.shareContent || base.share.desc,
imgUrl: info.imgUrl || info.shareImg || base.share.imgUrl,
link: info.link || info.shareUrl || base.share.link,
};
if (store.state.userInfo.token) {
if (shareInfo.link.indexOf("?") >= 0) {
shareInfo.link += "&recommendCode=" + store.state.userInfo.uid;
} else {
shareInfo.link += "?recommendCode=" + store.state.userInfo.uid;
}
}
setShare(shareInfo, callback);
}
}
//公众号获取code
function getLogin(type) {
let urlNow = encodeURIComponent(window.location.href);
let url =
`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${
base.publicAppId
}&redirect_uri=${urlNow}&response_type=code&scope=snsapi_userinfo&state=${type}#wechat_redirect`;
window.location.replace(url);
}
// 获取Url上的推荐码
function getRecommendCode() {
var url = window.location.href;
let codeIndex = url.indexOf("recommendCode=");
if (codeIndex >= 0) {
let recommendCode = url.substr(codeIndex + 14);
if (recommendCode.indexOf("&") >= 0) {
return recommendCode.substr(0, recommendCode.indexOf("&"));
} else if (recommendCode.indexOf("?") >= 0) {
return recommendCode.substr(0, recommendCode.indexOf("?"));
} else if (recommendCode.indexOf("/") >= 0) {
return recommendCode.substr(0, recommendCode.indexOf("/"));
} else if (recommendCode.indexOf("#") >= 0) {
return recommendCode.substr(0, recommendCode.indexOf("#"));
}
return recommendCode;
} else {
return;
}
}
//判断是否登录,登录处理
let isGetOpenId = true;
// 公众号登录 || H5页面跳转到登录页面 || APP内嵌网页调取APP方法
export const h5Login = function(type = "judge", callback) {
var getRequest = getUrlData();
let recommendCode = getRecommendCode();
if (recommendCode && recommendCode !== "null" && recommendCode !== "undefined") {
uni.setStorageSync("recommendCode", recommendCode);
}
if (getBrowser() == "微信") {
if (getRequest.code) {
if (isGetOpenId) {
isGetOpenId = false;
let httpData = {
code: getRequest.code //微信公众号登录code
};
if (recommendCode && recommendCode !== "null" && recommendCode !== "undefined") {
httpData.recommendCode = recommendCode;
} else {
let recommendCode = uni.getStorageSync("recommendCode");
if (recommendCode && recommendCode !== "null" && recommendCode !== "undefined") {
httpData.recommendCode = recommendCode;
}
}
$http.get("api/open/v2/get_public_login", httpData)
.then(result => {
store.commit('setUserInfo', result);
//publicShare();
callback && callback();
uni.showToast({
title: "欢迎回来",
icon: "none"
});
}, () => {
isGetOpenId = true;
});
}
} else {
getLogin(type);
}
} else {
// 非微信浏览器环境如果有获取到URL上有用户token,将获取用户信息
if (getRequest.userToken) {
store.commit('setUserInfo', {
token: getRequest.userToken
});
$http.get("api/mime/v1/info").then(res => {
store.commit('setUserInfo', res);
callback && callback();
});
} else {
// APP内嵌网页调取APP方法
appMutual("jumpLogin", null, function() {
if (type == "force") {
setTimeout(() => {
uni.navigateTo({
url: "/pages/mine/login"
});
},500);
} else {
uni.showModal({
title: '',
content: "At this moment, we need you to log in~",
confirmText: "Go login",
cancelText: "Cancel",
success: (res) => {
if (res.confirm) {
uni.navigateTo({
url: "/pages/mine/login"
});
}
}
});
}
});
}
}
}