UNPKG

ali-jump

Version:

Applicable to Alipay small program universal jump.

194 lines (173 loc) 5.43 kB
/** * 万能跳转 * @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(/&amp;/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} }