my.navigatetominiprogram(object object)
基础库 或更高版本; 且 支付宝客户端 10.1.10 或更高版本; 若版本较低,建议采取 兼容处理 。
小程序开发者工具: 不支持。
主体: 企业支付宝小程序 、 个人支付宝小程序
相关文档: 小程序内嵌 & 外跳能力导航 、 联调设置 、 如何获取各种场景的启动参数 、 、 小程序间通信 、
跳转到其它小程序。配置指引请参考文档:
如需跳转到目标小程序的指定开发版本,可进行 联调设置。
如果已知目标小程序的 scheme,请参见后文常见问题:拿到目标小程序的 scheme (以 alipays:// 开头),应该如何跳转?
object object
查看示例
属性 | 类型 | 默认值 | 必填 | 兼容性 | 描述 |
---|---|---|---|---|---|
appid | string | - | 是 | - | 要跳转的目标小程序 appid |
path | string | - | 否 | - | 要打开的目标小程序页面路径。省略此参数则打开目标小程序凯发k8官方网娱乐官方首页。 |
query | object | - | 否 | 基础库: 2.7.16 |
用于设置目标小程序应用的 |
extradata | object | - | 否 | - | 传递给目标小程序的额外数据 |
events | object | - | 否 | 基础库: 2.9.41 |
小程序间通信接口,用于监听被打开小程序发送到当前小程序的数据。详见 小程序间通信 |
success | function | - | 否 | - | 调用成功的回调函数 |
fail | function | - | 否 | - | 调用失败的回调函数 |
complete | function | - | 否 | - | 调用结束的回调函数(调用成功、失败都会执行) |
success 回调函数
参数
object res
查看示例
属性 | 类型 | 兼容性 | 描述 |
---|---|---|---|
eventchannel | object | 基础库: 2.9.41 |
与被打开小程序进行通信。值为 eventchannel 实例。详见 小程序间通信 |
fail 回调的参数为 object,error
属性为错误码,errormessage
属性为错误消息。
错误码 | 错误消息 | 凯发app官方网站的解决方案 |
---|---|---|
2 | 参数无效 |
检查各参数类型/格式是否正确。 |
30 | 目标应用不允许被跳转。 |
请目标小程序检查设置。操作路径:小程序主账号/管理员账号登录 ,在 小程序信息 中切换到 基础设置 tab,在 小程序互相跳转 中设置 指定小程序跳转。 配置指引请参考文档: |
31 | 跳转失败,目标 appid 无效 | 检查目标应用 appid 参数。appid 为 16 位数字,由开放平台在小程序创建时分配。 |
跳转失败,请检查网络 | 支付宝 10.5.26 版本,网络出现问题时会报此错,可检查网络后重试;若重试若不能解决,请通过右下角 “在线咨询” 解决。 |
|
5001 | 跳转小程序不在允许可跳转的行业规范内 | 由于“支付宝小程序运营规范”升级,除特定行业(政务民生、身份验证、停车缴费)小程序外,默认不可跳转,需要联系跳转目标小程序在“小程序信息—基础设置—小程序互相跳转—指定小程序”中配置跳入方的小程序 appid;点此查看《支付宝小程序运营规范》—“ 具体运营规范 ”中的第17点 |
my.navigatetominiprogram({
appid: 'xxxxxxxxxxxxxxx', // 16 位
path: 'pages/index/index?p=1&q=2',
query: {
a: 'foo',
b: 'bar',
},
extradata: {
x: {
y: 'z',
},
},
success: function (res) {
console.log(res);
},
fail: function (err) {
console.log(err);
}
});
page({
onload(query) {
console.log('query:', query); // query: { p: 1, q: 2 }
},
});
app({
onlaunch(options) {
const { query, referrerinfo: { extradata } = {} } = options;
console.log('query:', query); // query: { a: 'foo', b: 'bar' }
console.log('extradata:', extradata); // extradata: { x: { y: 'z' } }
},
onsomebuttontap() {
const { query, referrerinfo: { extradata } = {} } = my.getlaunchoptionssync();
console.log('query:', query); // query: { a: 'foo', b: 'bar' }
console.log('extradata:', extradata); // extradata: { x: { y: 'z' } }
},
});
// 使用 scheme 跳转小程序
function navigatetominiprogramscheme({ scheme, success, fail }) {
var { params, message } = schemetoparams(scheme);
if (params) {
my.navigatetominiprogram({ ...params, success, fail });
} else {
fail && fail({ error: -1, errormessage: `无效的小程序 scheme ${scheme}: ${message}` });
}
}
// 将 scheme 转换为 my.navigatetominiprogram 的参数
function schemetoparams(scheme) {
if (!scheme.startswith('alipays:')) {
return { message: '! 非 alipays: 开头' };
}
var params = {};
var parsequery = (str) => {
return str.replace(/^.*?\?/, '').split('&').map(s => {
var p = s.includes('=') ? s.indexof('=') : s.length;
return [s.slice(0, p), s.slice(p 1)].map(decodeuricomponent);
});
};
for (var [k, v] of parsequery(scheme)) {
if (k == 'appid') {
if (v.length != 16) {
return { message: `! 非 16 位 appid '${v}'` };
}
} else if (k == 'page') {
k = 'path';
} else if (k == 'query') {
var o = {};
for (var [x, y] of parsequery(v)) {
o[x] = y;
}
v = o;
} else {
return { message: `! 不支持参数 '${k}' ` };
}
params[k] = v;
}
return { params };
}
// 调用示例
var scheme = 'alipays://platformapi/startapp?appid=2022061812345678&page=/pages/index/index&query=foo=bar';
navigatetominiprogramscheme({
scheme,
fail: (error) => {
console.error('navigatetominiprogramscheme fail: ', json.stringify(error));
},
});
function paramstoscheme(params) {
var { appid, path, query, extradata } = params;
var scheme = `alipays://platformapi/startapp?appid=${appid}`;
if (path) {
scheme = `&page=${encodeuricomponent(path)}`;
}
if (query) {
query = object.keys(query)
.map(k => `${encodeuricomponent(k)}=${encodeuricomponent(query[k])}`)
.join('&');
scheme = `&query=${encodeuricomponent(query)}`;
}
if (extradata && object.keys(extradata).length) {
console.log('! extradata 不支持在 scheme 中使用', params);
}
return scheme;
}
// 使用示例
var params = {
appid: '2022061812345678',
path: '/pages/index/index',
query: { foo: 'bar' },
};
console.log(paramstoscheme(params));
-
tip如果目标小程序未上架,调用本接口仍会触发 success 回调而非失败报错,未通过 联调设置 指定跳转开发版的用户将看到 “暂未找到此功能” 提示页。
-
tip在 10.5.36 以前的客户端版本中,即使是相同主体的小程序互跳,或已设置过允许的小程序跳转,也可能会出现
error: 30,errormessage: 目标应用不允许被跳转
的错误。此时,请升级客户端 10.5.36 及以上版本以解决问题。
q:拿到目标小程序的 scheme (以 alipays:// 开头),应该如何跳转?
将 scheme 转换为 my.navigatetominiprogram 的参数再跳转小程序 。
如果 scheme 中 appid 是 16 位,且只包含 page、query 参数,则应转换成 my.navigatetominiprogram 调用。推荐使用 检测并生成代码。 也可参考示例代码:q:my.navigatetominiprogram 的调用参数如何转换为等价的 scheme ?
如果调用参数只含 appid、path、query,则可以转换成等价的 scheme。extradata 不支持在 scheme 中使用。参考示例代码:将 my.navigatetominiprogram 的参数转换成 scheme 。
q:如果目标小程序已经打开,再次调用 my.navigatetominiprogram 向它跳转会怎样?
已打开的目标小程序将被切到前台,晚于目标小程序打开的小程序(包括当前小程序)会退出。例如,有 a b 两个小程序,发生以下跳转序列:
1、a 使用 my.navigatetominiprogram 跳转 b;
2、b 使用 my.navigatetominiprogram 跳转 a。则 b 会退出,a 被切到到前台。
3、如果 2 中跳转时传入了 path 参数,则 a 中当前已经打开的所有页面被关闭、path 指向的页面被打开。
有关小程序跳转的更多知识,可查看 小程序内嵌 & 外跳能力导航。
q:当前有哪些官方小程序 appid 可以跳转?
在小程序中跳转官方业务,请先查看官方公开的 appcode 列表 并使用 my.ap.openalipayapp 跳转;如果 appcode 中未找到,再参考下表 appid 使用 my.navigatetominiprogram 跳转:
小程序 | appid | 描述 |
---|---|---|
我的小程序 | 2018072560844004 | 支付宝小程序官方出品,与支付宝用户的小程序相关的内容和服务都在这。 |
集分宝 | 2019092567759928 | 集分宝的官方小程序。 |
支付宝校园缴费 | 2021002140649424 | 支付宝教育缴费是由支付宝推出的一款平台型的教育缴费服务。 |
如果 appcode 列表及上表均未包含所需跳转的官方小程序,并确实有强需求,可联系合作的支付宝业务人员。