PAYATHON 2026

小程序如何打开服务窗并拉起拉卡拉支付页面?

支付小周

结论

小程序不能直接调用拉卡拉的传统支付接口,也不能通过 navigateTo 把”服务窗”当作普通的小程序页面打开。

如果这里的”服务窗”是指支付宝生活号,通常有两种接入方式:

  1. 如果拉卡拉提供 H5 收银台地址,可以在小程序中通过 web-view 打开。
  2. 如果拉卡拉要求用户进入指定生活号页面支付,需要由拉卡拉提供完整且可跳转的支付宝页面地址,再通过支付宝允许的页面跳转能力打开。

选择哪种方式,要看拉卡拉返回的是 H5 支付链接、支付宝页面链接,还是只能在生活号内部使用的业务页面。支付地址不能自行拼接。

推荐方案:打开拉卡拉 H5 收银台

小程序先向公司服务端发起下单请求,由服务端调用拉卡拉接口创建订单。拿到拉卡拉返回的支付地址后,小程序再跳转到承载 web-view 的页面。

1. 服务端创建支付订单

支付金额、订单号、回调地址和签名都必须在服务端生成,不能将商户密钥放入小程序。

服务端可以向小程序返回类似的数据:

{
  "orderNo": "202609130001",
  "payUrl": "https://pay.example.com/cashier?token=xxxx"
}

这里的 payUrl 只是结构示例,实际使用的地址必须由拉卡拉接口返回。

2. 跳转到收银台页面

支付宝小程序示例:

my.request({
  url: 'https://api.example.com/payment/create',
  method: 'POST',
  data: {
    amount: 100,
    productId: 'PRODUCT_001'
  },
  success(res) {
    const payUrl = res.data && res.data.payUrl;

    if (!payUrl) {
      my.alert({
        title: '支付失败',
        content: '未获取到支付页面地址'
      });
      return;
    }

    my.navigateTo({
      url: `/pages/cashier/index?payUrl=${encodeURIComponent(payUrl)}`
    });
  },
  fail() {
    my.alert({
      title: '请求失败',
      content: '暂时无法创建支付订单,请稍后重试'
    });
  }
});

收银台页面负责接收并校验地址:

Page({
  data: {
    payUrl: ''
  },

  onLoad(query) {
    if (!query.payUrl) {
      my.alert({
        title: '参数错误',
        content: '缺少支付页面地址'
      });
      return;
    }

    const payUrl = decodeURIComponent(query.payUrl);

    if (!/^https:\/\//i.test(payUrl)) {
      my.alert({
        title: '地址错误',
        content: '支付地址不合法'
      });
      return;
    }

    this.setData({ payUrl });
  }
});

页面模板:

<web-view src=""></web-view>

采用这种方式前,需要确认以下事项:

  • 当前支付宝小程序是否允许 web-view 打开该页面;
  • 拉卡拉支付域名,以及页面跳转涉及的其他域名,是否已经配置为业务域名;
  • 拉卡拉返回的收银台是否支持支付宝客户端内的 H5 环境;
  • 页面跳转和支付完成后的返回地址是否符合平台要求。

如果拉卡拉的 H5 页面依赖外部浏览器、特定 Cookie,或使用支付宝小程序不支持的 URL Scheme,那么页面即使能够显示,也可能无法完成支付。

跳转到支付宝生活号页面

如果拉卡拉明确要求用户进入支付宝生活号支付,应要求拉卡拉提供以下信息:

  • 生活号的准确标识;
  • 可以从小程序打开的官方页面路径或跳转链接;
  • 支付订单传递到生活号的方式;
  • 支付完成后的同步返回方式;
  • 服务端异步通知地址和验签规则。

支付宝小程序不能通过下面的方式打开生活号:

my.navigateTo({
  url: '/拉卡拉生活号页面'
});

my.navigateTo 只能打开当前小程序中已经注册的页面。

部分支付宝环境提供跳转到支付宝业务页面的能力,例如 my.ap.navigateToAlipayPage。它能否用于目标生活号,以及 path 应该传入什么内容,需要以当前支付宝小程序基础库和拉卡拉提供的跳转地址为准:

my.ap.navigateToAlipayPage({
  path: alipayPagePath,
  success() {
    console.log('跳转成功');
  },
  fail(error) {
    console.error('跳转失败', error);
  }
});

alipayPagePath 必须来自可信的服务端或支付服务商,不能照搬网上的示例自行拼接。支付宝页面协议、生活号标识和准入范围可能发生调整,接入前应在支付宝开放平台确认当前 API 的可用范围。

如果拉卡拉不能提供可供小程序调用的生活号跳转地址,通常只能引导用户搜索并关注相应的生活号,无法保证用户能从小程序直接进入指定支付页面。

支付结果不能以页面返回为准

用户从收银台返回小程序,不等于订单已经支付成功。关闭页面、网络中断或支付结果通知延迟,都可能导致前端显示的状态不准确。

可靠的支付流程如下:

  1. 服务端向拉卡拉创建订单;
  2. 小程序打开支付页面;
  3. 拉卡拉向公司服务端发送异步通知;
  4. 服务端验签并更新订单状态;
  5. 小程序重新查询公司服务端,获取订单结果。

查询示例:

my.request({
  url: 'https://api.example.com/payment/status',
  method: 'GET',
  data: {
    orderNo: '202609130001'
  },
  success(res) {
    if (res.data.status === 'PAID') {
      my.showToast({
        content: '支付成功'
      });
    } else if (res.data.status === 'PENDING') {
      my.showToast({
        content: '支付结果确认中'
      });
    } else {
      my.showToast({
        content: '订单尚未支付'
      });
    }
  }
});

订单状态、金额和商品信息应由服务端根据订单号查询,不能信任前端传回的”支付成功”参数。

注意事项

  • 先向拉卡拉确认当前商户产品是 H5 支付、生活号支付,还是其他收银台产品。不同产品的接入方式不能混用。
  • 商户号、私钥、签名密钥和验签逻辑只能放在服务端。
  • 不要将任意外部 URL 直接传给 web-view。服务端应校验协议、域名和订单归属。
  • 支付链接可能有有效期。建议在每次支付时重新创建或获取,不要长期缓存。
  • 创建订单接口需要做幂等控制,避免用户连续点击后生成多笔订单。
  • 收到异步通知后必须验签,同时校验商户号、订单号、金额和支付状态。
  • 如果收银台会跳转到多个域名,需要逐一确认这些域名是否符合支付宝小程序的业务域名要求。
  • 如果拉卡拉只支持生活号内部支付,又不能提供小程序可调用的跳转链接,该流程就无法只靠小程序前端完成。此时需要拉卡拉调整产品权限,或提供适配的小程序支付或 H5 支付方案。

备注:内容仅供参考。