PAYATHON 2026

扫码支付成功或取消后如何关闭支付宝小程序并返回首页?

支付老李

结论

支付回调结束后,可以调用:

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' 只表示客户端支付流程返回成功。订单是否最终支付成功,应以服务端验签、支付宝异步通知或主动查询结果为准。

可以按以下流程处理:

  1. 小程序调用 my.tradePay。
  2. 收到支付回调后,小程序请求业务服务端查询订单。
  3. 服务端确认订单已经支付。
  4. 小程序短暂显示支付成功提示。
  5. 调用 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 实现。

备注:内容仅供参考。