如何在不提供手机号的情况下使用 Satispay?
结论
如果当前使用的 Satispay API 或 JavaScript 组件要求在创建支付或打开弹窗前提供手机号,就无法通过前端配置跳过这一步。弹窗里的手机号输入框通常用于确认或修改号码,并不意味着初始化时可以不传手机号。
如果希望平台完全不收集手机号,需要使用 Satispay 提供的托管支付页、重定向流程、二维码或 App deep link,并且该流程不能要求商户预先传入手机号。如果官方文档和当前商户接口没有提供这类模式,可考虑以下方式:
- 在平台内征得用户同意后收集手机号;
- 改用 Satispay 的其他结账产品,前提是该产品支持由 Satispay 直接收集手机号;
- 联系 Satispay 商户技术支持,确认当前账户能否开通 hosted checkout、redirect、QR 或 deep-link 流程。
为什么弹窗仍然要求预传手机号
Satispay 的支付身份通常与用户手机号关联。在某些接入流程中,手机号并非普通的界面默认值,而是创建支付请求、定位付款用户或初始化组件所需的数据。
因此,即使组件随后会显示手机号输入框,该输入框也可能只是用于:
- 核对预填号码;
- 修改错误号码;
- 完成额外的身份确认;
- 在已经创建的支付上下文中继续操作。
能否省略手机号取决于服务端 API 的参数要求,与平台是否显示输入框无关。如果请求结构明确要求 phone_number 一类字段,传入空字符串、占位号码或随机号码都不可行。
可行的实现方式
方案一:由平台收集,并明确用途、减少保存
如果现有接口只能通过手机号发起支付,可以等用户选择 Satispay 后再要求填写手机号,不必在注册或浏览阶段提前收集。界面上应明确说明,该号码只用于发起本次 Satispay 支付。
<form id="satispay-form">
<label for="phone">
Satispay 手机号
</label>
<input
id="phone"
name="phone"
type="tel"
inputmode="tel"
autocomplete="tel"
required
aria-describedby="phone-help"
>
<p id="phone-help">
该号码仅用于发起本次 Satispay 支付。
</p>
<button type="submit">使用 Satispay 支付</button>
</form>
表单提交后,应由后端调用支付接口。API 密钥和签名逻辑不能放在浏览器中:
document
.getElementById("satispay-form")
.addEventListener("submit", async (event) => {
event.preventDefault();
const phoneNumber = event.currentTarget.phone.value.trim();
const response = await fetch("/api/payments/satispay", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
phoneNumber
})
});
if (!response.ok) {
throw new Error("Unable to create Satispay payment");
}
const payment = await response.json();
// 按当前 Satispay SDK 文档,使用后端返回的支付标识
// 初始化组件、打开弹窗或跳转到支付页面。
console.log(payment);
});
这里的 /api/payments/satispay、返回字段和组件初始化方式只是应用侧的结构示例,实际接入时必须替换为当前 Satispay 文档规定的接口和参数。
方案二:使用 Satispay 托管的支付入口
如果 Satispay 为当前账户提供托管结账页,后端可以先创建一个不绑定手机号的支付会话,再将用户重定向到该页面:
const response = await fetch("/api/payments/satispay/session", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
orderId: "ORDER-123"
})
});
const session = await response.json();
window.location.assign(session.checkoutUrl);
这种方式有一个必要前提:官方接口允许在不提交用户手机号的情况下创建会话,并由 Satispay 页面收集所需信息。不能只在自己的代码中删除手机号参数来模拟这一流程。
如果文档中没有对应的端点或产品说明,应向 Satispay 确认:
- 是否支持不传手机号的 hosted checkout 或 redirect flow;
- 是否支持二维码、支付链接或 App deep link;
- 这些功能是否需要单独签约或开通;
- Web 弹窗中的手机号字段为什么仍依赖初始化号码;
- 商户是否会收到或保存用户在 Satispay 页面输入的手机号。
不建议采用的做法
不要使用虚假手机号、固定测试号码或随机号码打开弹窗。这样做可能会让支付请求关联到错误用户,还可能触发风控、向无关用户发送通知,甚至导致订单与付款人不一致。
也不要试图从浏览器绕过 SDK 的必填校验。即使能修改前端校验,服务端仍可能拒绝请求,而且这种做法随时可能失效。
隐私与安全注意事项
如果最终仍需由平台收集手机号,应采取以下措施:
- 仅在用户主动选择 Satispay 后显示输入框;
- 说明手机号的用途、处理方和保存期限;
- 使用 HTTPS,并且只将号码发送到必要的后端接口;
- 不在 URL、日志、分析事件或错误追踪信息中记录完整号码;
- 支付完成后,如果不再需要该号码,应及时删除或脱敏;
- 根据适用的隐私法规更新隐私声明和数据处理流程。
用户能否只在 Satispay 弹窗中输入手机号,取决于支付产品本身。如果现有 API 要求在弹窗打开前提供手机号,商户端没有通用且安全的方式跳过这一要求。此时只能改用官方支持的其他支付流程,或在征得用户同意后收集手机号。
备注:内容仅供参考。
