小程序如何打开服务窗并拉起拉卡拉支付页面?
结论
小程序不能直接调用拉卡拉的传统支付接口,也不能通过 navigateTo 把”服务窗”当作普通的小程序页面打开。
如果这里的”服务窗”是指支付宝生活号,通常有两种接入方式:
- 如果拉卡拉提供 H5 收银台地址,可以在小程序中通过
web-view打开。 - 如果拉卡拉要求用户进入指定生活号页面支付,需要由拉卡拉提供完整且可跳转的支付宝页面地址,再通过支付宝允许的页面跳转能力打开。
选择哪种方式,要看拉卡拉返回的是 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 的可用范围。
如果拉卡拉不能提供可供小程序调用的生活号跳转地址,通常只能引导用户搜索并关注相应的生活号,无法保证用户能从小程序直接进入指定支付页面。
支付结果不能以页面返回为准
用户从收银台返回小程序,不等于订单已经支付成功。关闭页面、网络中断或支付结果通知延迟,都可能导致前端显示的状态不准确。
可靠的支付流程如下:
- 服务端向拉卡拉创建订单;
- 小程序打开支付页面;
- 拉卡拉向公司服务端发送异步通知;
- 服务端验签并更新订单状态;
- 小程序重新查询公司服务端,获取订单结果。
查询示例:
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 支付方案。
备注:内容仅供参考。