扫码支付成功或取消后如何关闭支付宝小程序并返回首页?
支付老李
结论
支付回调结束后,可以调用:
my.exitMiniProgram()
该 API 会退出当前支付宝小程序。如果用户通过支付宝扫码直接进入小程序,退出后通常会返回进入小程序前的支付宝界面。
小程序只能请求退出自身,无法指定退出后必须显示支付宝“首页”。最终返回扫码页、首页还是其他来源页面,取决于支付宝客户端的进入路径。my.reLaunch() 和 my.navigateBack() 只能控制小程序内部页面,无法返回支付宝 App 首页。
实现方式
先调用 my.tradePay 发起支付,根据支付结果更新业务状态,再退出小程序:
function startPayment(tradeNO) {
my.tradePay({
tradeNO,
success: (res) => {
const resultCode = String(res.resultCode)
if (resultCode === '9000') {
// 不能只依赖前端结果确认订单,应向服务端查询支付状态
confirmPaymentOnServer(tradeNO)
.then((paid) => {
if (paid) {
exitMiniProgram()
} else {
my.alert({
title: '支付结果确认中',
content: '暂时无法确认支付结果,请稍后查看订单状态。'
})
}
})
.catch(() => {
my.alert({
title: '支付结果确认失败',
content: '请稍后在订单页面查看支付状态。'
})
})
return
}
if (resultCode === '6001') {
// 用户取消支付
exitMiniProgram()
return
}
// 其他状态,例如支付失败、结果未知
my.alert({
title: '支付未完成',
content: res.memo || '请稍后重试。'
})
},
fail: (error) => {
// API 调用失败不一定等同于用户取消支付
console.error('tradePay failed:', error)
my.alert({
title: '支付调用失败',
content: '请检查网络后重试。'
})
}
})
}
function exitMiniProgram() {
if (typeof my.exitMiniProgram === 'function') {
my.exitMiniProgram()
} else {
my.alert({
title: '提示',
content: '当前支付宝客户端暂不支持自动退出,请点击右上角关闭小程序。'
})
}
}
function confirmPaymentOnServer(tradeNO) {
return new Promise((resolve, reject) => {
my.request({
url: 'https://example.com/api/orders/payment-status',
method: 'POST',
data: {
tradeNO
},
success: (res) => {
resolve(res.data && res.data.paid === true)
},
fail: reject
})
})
}
如果通过 orderStr 发起支付,只需更换支付参数,退出逻辑保持不变:
my.tradePay({
orderStr,
success: handlePaymentResult,
fail: handlePaymentError
})
支付成功后不要立即相信前端结果
resultCode === '9000' 只表示客户端支付流程返回成功。订单是否最终支付成功,应以服务端验签、支付宝异步通知或主动查询结果为准。
可以按以下流程处理:
- 小程序调用
my.tradePay。 - 收到支付回调后,小程序请求业务服务端查询订单。
- 服务端确认订单已经支付。
- 小程序短暂显示支付成功提示。
- 调用
my.exitMiniProgram()。
例如:
my.showToast({
type: 'success',
content: '支付成功',
duration: 1200,
success: () => {
setTimeout(() => {
my.exitMiniProgram()
}, 1200)
}
})
这里的延迟只是为了让用户看清支付结果,并非必需。
取消支付的判断
通常可以通过支付结果码判断用户是否取消支付,例如:
if (String(res.resultCode) === '6001') {
my.exitMiniProgram()
}
不要把所有 fail 回调都视为用户取消。网络异常、参数错误和客户端环境异常等情况也可能触发 fail。具体字段和结果码应以当前使用的支付宝小程序支付 API 文档以及真机返回结果为准。
无法强制返回支付宝首页
my.exitMiniProgram() 只能退出小程序,不能跳转到支付宝首页。小程序通常没有下面这种指定客户端首页的能力:
// 不存在这种可指定客户端首页的标准用法
my.exitMiniProgram({
target: 'alipayHome'
})
如果扫码进入小程序后,调用退出 API 仍然返回扫码结果页或其他来源页面,这是支付宝客户端的返回栈行为,小程序无法可靠地改变它。
如果业务要求用户看到固定页面,可以在小程序内提供支付结果页,再用 my.reLaunch() 返回小程序自己的首页:
my.reLaunch({
url: '/pages/index/index'
})
这只会返回“小程序首页”,不会退出小程序,也不会跳转到“支付宝 App 首页”。
注意事项
- 应在支付宝真机客户端中测试。开发者工具可能无法完整模拟退出过程和客户端返回栈。
- 需要确认基础库和支付宝客户端支持
my.exitMiniProgram,调用前可先进行能力判断。 - 用户取消支付后是否直接退出,应根据业务设计决定。直接退出可能让用户误以为订单已经取消,但订单实际上可能仍处于待支付状态。
- 支付成功必须由服务端确认,不能只凭前端回调发货或更新权益。
- 其他网站展示的返回效果,可能与其使用的支付产品、扫码入口或支付宝客户端内部页面有关,不一定完全由小程序 API 实现。
备注:内容仅供参考。
