支付宝小程序线上商城申请支付签约是否必须提供店铺信息?
明确结论
没有实体门店,也可以开通支付宝小程序线上商城或申请支付签约。
申请时出现的“店铺信息”,通常用于核验实际经营场景,并不一定只指线下实体门店。纯线上商城可以根据页面提供的类型,填写小程序名称、线上店铺链接、经营内容,并提交商品页面截图等材料。
最终能否完成签约,还要看商户主体、经营类目、营业执照经营范围、所售商品以及当前页面的审核规则。如果页面明确要求提供实体门店材料,又没有“线上店铺”“小程序”等选项,应先检查是否选错了支付产品或经营场景,不要虚构门店信息。
为什么会要求填写店铺信息
支付签约审核主要确认三个问题:在哪里经营、销售什么、由谁收款。这里的“店铺”可能是:
- 支付宝小程序商城
- 已上线的网页商城
- App 内的线上商城
- 电商平台店铺
- 线下实体门店
如果小程序还没有正式发布,审核页面可能要求提供测试页面、商品截图、服务说明,或其他能够证明真实经营场景的材料。
如果申请入口只提供线下门店地址、门头照片等字段,可能有以下原因:
- 选择了面向线下经营场景的支付产品。
- 商户行业或经营类目选择不准确。
- 当前申请的特殊类目需要额外资质。
- 商城页面还不完整,无法证明线上经营场景。
- 支付宝开放平台当时对该类目有特定的审核要求。
具体字段和材料要求可能发生调整,应以签约后台显示的内容和审核反馈为准。
建议的申请步骤
1. 准备合适的商户主体
通常需要使用与实际经营者一致的主体申请,例如企业、个体工商户或平台允许的其他主体类型。
申请前应核对:
- 支付宝商家账号的主体
- 小程序主体
- 营业执照主体
- 支付签约主体
- 实际收款和结算主体
如果这些主体不一致,可能需要补充授权关系或其他证明材料。
2. 选择线上经营场景
申请支付能力时,优先选择与“小程序”“线上商城”或类似线上交易场景对应的产品入口。
不要因为页面出现“店铺信息”,就填写并不存在的实体门店。如果系统允许选择经营场景类型,应选择线上店铺,并提交真实、可访问的经营页面。
3. 完善小程序商城
提交审核前,商城至少应清楚展示以下内容:
- 商户名称和联系方式
- 商品或服务的真实内容
- 商品价格
- 下单流程
- 退款或售后规则
- 用户协议和隐私政策
- 禁止销售或限制销售商品的管控说明
即使小程序还未正式上线,也应尽量提供完整的测试版本和页面截图。不要只提交空白首页或静态演示页面。
4. 提交线上店铺材料
实际所需材料以申请页面为准。一般可以提前准备:
- 小程序名称、App ID 和页面路径
- 商城首页截图
- 商品详情页截图
- 购物车及订单确认页截图
- 营业执照
- 行业相关许可证
- 客服联系方式
- 售后及退款规则
- 测试账号或体验方式
如果字段名称是“店铺地址”,先确认是否可以填写小程序链接、应用标识或线上经营地址。字段含义不清楚时,可通过开放平台工单或商家客服确认,以免提交错误材料。
5. 根据审核反馈补充材料
审核未通过时,应根据具体的驳回原因补充材料,不要反复提交相同信息。例如:
- “经营场景不完整”:补充可用的商品、订单和售后页面。
- “类目不匹配”:调整小程序类目或支付签约类目。
- “缺少行业资质”:提交对应许可证,或停止经营相关商品。
- “无法核验店铺”:提供体验路径、测试账号和页面截图。
- “主体不一致”:补充授权证明,或改用一致的主体申请。
支付接入示例
支付签约通过后,通常由服务端创建支付宝交易,再由小程序端调起收银台。订单金额、商户订单号和商品信息必须由服务端生成并校验,不能直接信任客户端提交的数据。
以下代码只展示典型的调用结构。实际接口权限、SDK 方法名和返回字段,应以接入时使用的支付宝开放平台文档及 SDK 版本为准。
服务端创建交易
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "ORDER_202609130001");
bizContent.put("total_amount", "99.00");
bizContent.put("subject", "商城订单");
bizContent.put("buyer_id", buyerId);
request.setBizContent(bizContent.toJSONString());
AlipayTradeCreateResponse response = alipayClient.execute(request);
if (!response.isSuccess()) {
throw new IllegalStateException(
response.getCode() + ": " + response.getSubMsg()
);
}
String tradeNo = response.getTradeNo();
其中:
out_trade_no应是商户系统内唯一的订单号。total_amount必须以服务端保存的订单金额为准。buyer_id应通过合规的支付宝用户授权流程取得。- 服务端不能只根据接口的同步返回结果,将订单标记为支付成功。
小程序端调起支付
服务端创建交易并返回交易号后,小程序端可以调起支付:
my.tradePay({
tradeNO: tradeNo,
success: (result) => {
console.log('支付调用完成', result);
// 不要只根据客户端回调修改订单状态。
// 应再次请求服务端查询最终支付结果。
refreshOrderStatus();
},
fail: (error) => {
console.error('支付调用失败', error);
}
});
客户端的成功回调只表示调用流程已经返回。最终是否支付成功,应由服务端结合异步通知或主动查询结果来判断。
服务端处理支付通知
@PostMapping("/alipay/notify")
public String handleNotify(HttpServletRequest request) {
Map<String, String> params = extractAlipayParams(request);
boolean verified = AlipaySignature.rsaCheckV1(
params,
alipayPublicKey,
"UTF-8",
"RSA2"
);
if (!verified) {
return "failure";
}
String appId = params.get("app_id");
String outTradeNo = params.get("out_trade_no");
String tradeStatus = params.get("trade_status");
String totalAmount = params.get("total_amount");
// 还应校验 app_id、商户身份、订单金额、订单状态等信息。
// 更新订单时必须保证幂等,防止重复通知造成重复入账。
updateOrderIfPaid(outTradeNo, tradeStatus, totalAmount, appId);
return "success";
}
extractAlipayParams 和 updateOrderIfPaid 需要由业务侧自行实现。验签、公钥配置及通知参数的处理方式,应以当前 SDK 文档为准。
注意事项
不要伪造实体门店
没有实体门店,就应按线上经营场景如实申请。虚构地址、门头照片或经营信息,可能导致审核失败,也可能影响后续支付权限。
签约通过不代表所有商品都能销售
部分行业需要许可证、备案证明或其他专项资质。开通支付能力后,所售商品仍须符合平台规则和相关法律要求。
保持经营内容一致
营业执照经营范围、小程序类目、支付签约类目和实际销售的商品应尽量一致。如果签约时申报普通零售,实际经营的却是需要特殊资质的商品,可能触发审核或风控。
支付结果必须由服务端确认
不要只依赖 my.tradePay 的客户端回调发货。服务端至少需要完成以下校验:
- 通知签名是否合法
app_id是否属于当前应用- 商户订单号是否存在
- 支付金额是否与订单一致
- 订单是否已经处理
- 交易状态是否满足业务要求
以实际申请页面为准
支付宝开放平台的产品入口、材料字段和审核规则可能变化。如果当前页面确实强制要求实体门店材料,应先核对申请的支付产品和经营类目。仍无法解决时,可将申请页面截图、商户主体类型、小程序 App ID 和驳回原因提交给支付宝开放平台客服或工单渠道确认。
备注:内容仅供参考。
