优化H5登录逻辑

This commit is contained in:
Gaoxs
2020-08-15 20:07:33 +08:00
parent a65d09015e
commit 0c50a9ebb2
12 changed files with 878 additions and 199 deletions

View File

@ -2,6 +2,8 @@ import { cancelOrder, takeOrder, delOrder, payOrder } from "@/api/order";
import dialog from "@/utils/dialog";
import { weappPay } from "@/libs/wechat";
import { _router } from '@/utils'
export function cancelOrderHandle(orderId) {
return new Promise((resolve, reject) => {
uni.showModal({
@ -70,49 +72,92 @@ export function delOrderHandle(orderId) {
});
}
// 使用订单号进行支付
export function payOrderHandle(orderId, type, from) {
console.log(orderId, type, from, '支付')
return new Promise((resolve, reject) => {
uni.showLoading({ title: '加载中' })
// dialog.loading.open("");
payOrder(orderId, type, from)
.then(res => {
console.log(res)
console.log('微信支付参数')
const data = res.data;
uni.hideLoading()
switch (data.status) {
case "WECHAT_H5_PAY":
location.replace(data.result.jsConfig.mweb_url);
reject(data);
break;
case "ORDER_EXIST":
case "EXTEND_ORDER":
case "PAY_ERROR":
case "PAY_DEFICIENCY":
uni.showToast({ title: res.msg, icon: 'none', duration: 2000 });
reject(data);
break;
case "SUCCESS":
uni.showToast({ title: res.msg, icon: 'none', duration: 2000 });
resolve(data);
break;
case "WECHAT_PAY":
weappPay(data.result.jsConfig).then(res => {
resolve(data);
});
break;
case "WECHAT_APP_PAY":
weappPay(data.result.jsConfig).then(res => {
resolve(data);
});
break;
}
handleOrderPayResults(res.data)
})
.catch(err => {
uni.hideLoading()
uni.showToast({
title: '订单支付失败', icon: 'none', duration: 2000
});
dialog.loading.close();
dialog.toast({ mes: err.msg || "订单支付失败" });
});
});
}
// 处理调用支付接口的逻辑
// @type create(创建订单)||pay(支付订单)
export function handleOrderPayResults(data, type) {
switch (data.status) {
// 订单号已存在
case "ORDER_EXIST":
// 取消支付
case "EXTEND_ORDER":
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000,
});
goOrderDetails(data.result.orderId, type)
break;
case "PAY_DEFICIENCY":
break;
// 支付出错
case "PAY_ERROR":
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000,
});
goOrderDetails(data.result.orderId, type)
break;
// 未传递支付环境
case "SUCCESS":
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000,
});
goOrderDetails(data.result.orderId, type)
break;
// H5支付
case "WECHAT_H5_PAY":
goOrderDetails(data.result.orderId, type)
console.log(data)
setTimeout(() => {
// #ifdef H5
// "https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx15171343713577e9f3a418b0865ef90000&package=2547890641"
// location.href = data.result.jsConfig.mweb_url;
// #endif
}, 100);
break;
// 小程序支付
case "WECHAT_PAY":
weappPay(data.result.jsConfig).finally(() => {
goOrderDetails(data.result.orderId, type)
});
break;
// APP支付
case "WECHAT_APP_PAY":
weappPay(data.result.jsConfig).finally(() => {
goOrderDetails(data.result.orderId, type)
});
break;
}
}
export function goOrderDetails(id, type) {
// 创建订单时跳转到详情
if (type == 'create') {
console.log(_router)
_router.replace({
path: "/pages/order/OrderDetails/index",
query: {
id
},
});
}
}

View File

@ -41,3 +41,288 @@ export const weappPay = (option) => {
// })
})
}
import WechatJSSDK from "wechat-jssdk/dist/client.umd";
import { getWechatConfig, wechatAuth } from "@/api/public";
import { parseQuery } from "@/utils";
import cookie from "@/utils/store/cookie";
import store from "@/store";
import dayjs from "dayjs";
const STATE_KEY = "wx_authorize_state";
const WX_AUTH = "wx_auth";
const BACK_URL = "login_back_url";
const LOGINTYPE = "loginType";
let instance;
let wechatObj;
export function wechat() {
console.log('初始化微信配置')
return new Promise((resolve, reject) => {
if (instance) return resolve(instance);
getWechatConfig()
.then(res => {
const _wx = WechatJSSDK(res.data);
console.log(_wx)
wechatObj = _wx;
_wx
.initialize()
.then(() => {
instance = _wx.wx;
instance.initConfig = res.data;
resolve(instance);
})
.catch(reject);
})
.catch(err => {
console.log(err);
reject(err);
});
});
}
export function clearAuthStatus() {
cookie.remove(WX_AUTH);
cookie.remove(STATE_KEY);
}
export function oAuth() {
console.log('处理微信授权')
return new Promise((resolve, reject) => {
if (cookie.has(WX_AUTH) && store.state.app.token) {
reject()
return;
}
const { code } = parseQuery();
if (!code) {
toAuth();
return
}
resolve()
})
}
export function auth(code) {
console.log('获取微信授权')
return new Promise((resolve, reject) => {
let loginType = cookie.get(LOGINTYPE);
wechatAuth(code, parseInt(cookie.get("spread")), loginType)
.then(({ data }) => {
const expires_time = dayjs(data.expires_time);
const newTime = Math.round(new Date() / 1000);
store.commit("LOGIN", data.token, expires_time - newTime);
cookie.set(WX_AUTH, code, expires_time);
cookie.remove(STATE_KEY);
loginType && cookie.remove("loginType");
resolve();
})
.catch(reject);
});
}
export function toAuth() {
wechat().then(wx => {
location.href = getAuthUrl(wx.initConfig.appId);
});
}
function getAuthUrl(appId) {
const redirect_uri = encodeURIComponent(
`${location.origin}/auth/` +
encodeURIComponent(
encodeURIComponent(
cookie.has(BACK_URL)
? cookie.get(BACK_URL)
: location.pathname + location.search
)
)
);
cookie.remove(BACK_URL);
const state = encodeURIComponent(
("" + Math.random()).split(".")[1] + "authorizestate"
);
cookie.set(STATE_KEY, state);
return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_userinfo&state=${state}#wechat_redirect`;
}
function toPromise(fn, config = {}) {
return new Promise((resolve, reject) => {
fn({
...config,
success(res) {
resolve(res);
},
fail(err) {
reject(err);
},
complete(err) {
reject(err);
},
cancel(err) {
reject(err);
}
});
});
}
export function pay(config) {
return toPromise(instance.chooseWXPay, config);
}
export function openAddress() {
return new Promise((resolve, reject) => {
wechatEvevt("openAddress", {})
.then(res => {
resolve(res);
})
.catch(res => {
if (res.is_ready) {
res.wx.openAddress({
fail(res) {
reject(res);
},
success(res) {
resolve(res);
}
});
} else {
reject(res);
}
});
});
}
export function openShareAll(config) {
config || {};
config.type = config.type == undefined ? "link" : config.type;
return new Promise(resolve => {
getWechatConfig().then(res => {
wechatObj.signSignature({
nonceStr: res.data.nonceStr,
signature: res.data.signature,
timestamp: res.data.timestamp
});
instance = wechatObj.getOriginalWx();
instance.ready(() => {
instance.updateAppMessageShareData(config);
instance.updateTimelineShareData(config);
resolve();
});
});
});
}
export function openShareAppMessage(config) {
instance.updateAppMessageShareData(config);
instance.onMenuShareAppMessage && instance.onMenuShareAppMessage(config);
}
export function openShareTimeline(config) {
instance.updateTimelineShareData(config);
instance.onMenuShareTimeline && instance.onMenuShareTimeline(config);
}
export function wechatEvevt(name, config) {
return new Promise((resolve, reject) => {
let wx;
let configDefault = {
fail(res) {
console.log(res);
if (wx) return reject({ is_ready: true, wx: wx });
getWechatConfig().then(res => {
wechatObj.signSignature({
nonceStr: res.data.nonceStr,
signature: res.data.signature,
timestamp: res.data.timestamp
});
wx = wechatObj.getOriginalWx();
reject({ is_ready: true, wx: wx });
});
},
success(res) {
resolve(res);
}
};
Object.assign(configDefault, config);
if (typeof instance !== "undefined") {
instance.ready(() => {
if (typeof name === "object") {
name.forEach(item => {
instance[item] && instance[item](configDefault);
});
} else instance[name] && instance[name](configDefault);
});
} else {
getWechatConfig().then(res => {
const _wx = WechatJSSDK(res.data);
_wx.initialize().then(() => {
instance = _wx.getOriginalWx();
instance.ready(() => {
if (typeof name === "object") {
name.forEach(item => {
instance[item] && instance[item](configDefault);
});
} else instance[name] && instance[name](configDefault);
});
});
});
}
});
}
export function ready() {
return new Promise(resolve => {
if (typeof instance !== "undefined") {
instance.ready(() => {
resolve(instance);
});
} else {
getWechatConfig().then(res => {
const _wx = WechatJSSDK(res.data);
_wx.initialize().then(() => {
instance = _wx.wx;
instance.ready(() => {
resolve(instance);
});
});
});
}
});
}
export function wxShowLocation() {
return new Promise(() => {
wechatEvevt("getLocation", { type: "wgs84" })
.then(res => {
let latitude = res.latitude; // 纬度
let longitude = res.longitude; // 经度
cookie.set(LATITUDE, latitude);
cookie.set(LONGITUDE, longitude);
})
.catch(res => {
if (res.is_ready) {
res.wx.getLocation({
success(res) {
let latitude = res.latitude; // 纬度
let longitude = res.longitude; // 经度
cookie.set(LATITUDE, latitude);
cookie.set(LONGITUDE, longitude);
},
cancel() {
cookie.remove(LATITUDE);
cookie.remove(LONGITUDE);
this.$dialog.error("取消获取位置");
},
fail() {
cookie.remove(LATITUDE);
cookie.remove(LONGITUDE);
this.$dialog.error("授权失败");
}
});
}
});
});
}