ali-jump
Version:
Applicable to Alipay small program universal jump.
194 lines (173 loc) • 5.43 kB
JavaScript
/**
* 万能跳转
* @param {*} page 小程序页面路径 或 h5链接
* @param {*} appId appid 或 h5链接
*/
export function UniversalJump(page, appId) {
let type = checkUrlType(appId)
let url = appId;
switch (type) {
case 'taobao':
url = decodeURIComponent(url)
while (url.indexOf('?') != -1 || url.indexOf('&') != -1) {
url = url.replace('?', "zsygwh")
url = url.replace('&', "zsygad")
url = url.replace(/&/g, "zsygad")
}
let { platform } = my.getSystemInfoSync();
if (platform == 'Android') {
url = `https://www.zhisanzhao.com/taobao_jump_android.html?${url}`
} else {
url = `https://www.zhisanzhao.com/taobao_jump_ios.html?${url}`
}
my.ap.navigateToAlipayPage({
path: encodeURIComponent('https://render.alipay.com/p/s/i/?scheme=alipays%3A%2F%2Fplatformapi%2Fstartapp%3FsaId%3D20000067%26url%3D' + encodeURIComponent(encodeURIComponent(url)))
})
break;
case 'h5Scan':
url = `alipays://platformapi/startapp?saId=10000007&qrcode=${url}`
my.ap.navigateToAlipayPage({
path: encodeURIComponent(`https://render.alipay.com/p/s/i/?scheme=${encodeURIComponent(url)}`)
})
break;
case 'render':
my.ap.navigateToAlipayPage({
path: encodeURIComponent(url)
})
break;
case 'h5':
my.ap.navigateToAlipayPage({
path: encodeURIComponent(`https://render.alipay.com/p/s/i/?scheme=alipays%3A%2F%2Fplatformapi%2Fstartapp%3FsaId%3D20000067%26url%3D${encodeURIComponent(encodeURIComponent(url))}`)
})
break;
case 'alipays':
my.ap.navigateToAlipayPage({
path: encodeURIComponent(`https://render.alipay.com/p/s/i/?scheme=${encodeURIComponent(url)}`)
})
break;
case 'mini':
page = decodeURIComponentFun(page, 2)
let pageObj = handleMiniJump(page);
let params = {
appId
}
if (pageObj.path) params.path = pageObj.path
if (pageObj.query) params.extraData = pageObj.query
let { appId: nowAppId } = my.getAppIdSync();
if (params.appId == nowAppId) {
my.navigateTo({
url: `/${params.path}`
})
} else my.navigateToMiniProgram(params);
break;
default:
my.alert({
title: '提示',
content: '跳转失败,请检查链接或稍后重试',
buttonText: '我知道了'
});
break;
}
}
/**
* 判断类型
*
* H5类型&&alipays: url url
* 小程序: page appId
*/
function checkUrlType(appId) {
let type;
if (appId.startsWith("tbopen://")) {
type = 'taobao' //淘宝
} else if (appId.startsWith("https://qr.alipay.com/")) {
type = 'h5Scan' //支付宝H5扫码
} else if (appId.startsWith("https://render.alipay.com/p/")) {
type = 'render' //支付宝render
} else if (appId.startsWith("http")) {
type = 'h5' //H5链接
} else if (appId.startsWith("alipays")) {
type = 'alipays' //alipays链接
} else if (Number(appId) > 10000) {
type = 'mini' //小程序跳转
} else {
type = 'unkown'
}
return type;
}
/**
* 处理各种alipays链接
*/
function handleEveryAlipaysUrl(url) {
let appIdPart, pathPart, pagesPart, paramsPart;
appIdPart = url.substring(0, 53)
if (url.length > 53) pathPart = url.substring(53, url.length); //获取路径+参数部分
// 判断有没有全局query参数
if (pathPart && pathPart.includes('&query=')) {
pagesPart = pathPart.substring(0, pathPart.indexOf('&query='))
paramsPart = pathPart.substring(pathPart.indexOf('&query='), pathPart.length)
} else {
pagesPart = pathPart
}
//判断页面路径中有没有页面参数
if (pagesPart && pagesPart.includes('?') ) {
let pageLfet, pageRight;
pageLfet = pagesPart.substring(0, pagesPart.indexOf('?') + 1)
pageRight = pagesPart.substring(pagesPart.indexOf('?') + 1, pagesPart.length)
pagesPart = `${pageLfet}${encodeURIComponent(pageRight)}`
}
// 处理全局参数
if (paramsPart && paramsPart.includes('&query=')) {
paramsPart = `&query=${encodeURIComponent(paramsPart.substring(paramsPart.indexOf('=') + 1, paramsPart.length))}`
}
let handleUrl = `${appIdPart}${pagesPart || ''}${paramsPart || ''}`
return handleUrl
}
/**
* 编码链接
*/
function encodeURIComponentFun(url, times) {
let i = 0 ;
while (i < times) {
url = encodeURIComponent(url)
i++
}
return url
}
/**
* 解码链接
*/
function decodeURIComponentFun(url, times) {
let i = 0 ;
while (i < times) {
url = decodeURIComponent(url)
i++
}
return url
}
/**
* 处理小程序跳转方式时的参数
*/
function handleMiniJump(page) {
let path,query;
if (page && page.includes('&query=')) {
path = page.substring(0, page.indexOf('&query='))
query = page.substring(page.indexOf('&query='), page.length)
} else {
path = page
}
if (query && query.includes('&query=')) {
let queryObject = {};
query = query.substring(query.indexOf('=') + 1, query.length)
var dataArr = query.split("&");
//获取要跳转的小程序的path
for (var i = 0; i < dataArr.length; i++) {
var row = dataArr[i];
var eqIndex = row.indexOf("=");
if (eqIndex > -1) {
queryObject[row.substring(0, eqIndex)] = row.substring(eqIndex + 1);
}
}
query = queryObject
}
return { path, query}
}