集团多子公司如何开通支付宝WAP手机网站支付
结论
各子公司使用自己的企业支付宝账号收款时,通常要分别完成实名认证、产品签约和接口配置。每笔支付交易都必须使用对应子公司的 app_id、应用私钥、支付宝公钥或证书等配置,资金也会进入该子公司的支付宝账户。不能使用集团某个应用的密钥临时切换收款主体。
集团可以统一建设一个移动支付站点,不必机械地为每家公司单独建设一套 WAP 站点。不过,同一站点能否接入多个子公司的支付宝账号,要看支付宝是否认可该站点与各签约主体之间的关系。实际申请时,应准备集团关系证明、网站运营授权、隐私政策和服务协议等材料,再由各子公司分别提交产品签约或应用审核。
备案问题需要分开看:
- 网站部署在中国大陆并通过域名提供服务,通常应依法完成 ICP 备案。
- 支付宝审核还会检查网站、备案主体、应用主体与收款主体是否一致,或者是否存在合理的关联关系。
所以,“每个支付宝账号必须对应一个独立备案网站”并不准确,但每个签约主体都要证明自己有权在申报的站点上开展业务。如果多个彼此没有授权关系的支付宝账号反复填写同一个集团站点地址,审核可能无法通过。
支付宝的产品名称、准入条件和审核材料可能调整。最终以各子公司登录支付宝开放平台或商家平台后看到的签约页面和审核结果为准。
各子公司如何开通手机网站支付
建议各子公司分别办理:
- 使用本公司的企业支付宝账号完成企业实名认证。
- 在支付宝开放平台创建网页或移动网页应用。
- 提交应用名称、业务说明、网站地址、支付场景、服务协议和隐私政策等资料。
- 申请并签约“手机网站支付”能力。如果平台使用了其他产品名称,以页面实际显示的名称为准。
- 完成应用审核和产品签约。
- 为应用选择接口加签方式:
- 普通公钥模式;或
- 支付宝公钥证书模式。
- 配置并验证异步通知地址
notify_url。 - 使用该子公司的应用参数调用
alipay.trade.wap.pay。 - 根据异步通知更新本公司的订单状态。
常见的准入条件包括:
- 企业支付宝账号已经完成实名认证;
- 企业经营状态正常;
- 实际业务属于营业执照载明的经营范围;
- 网站能够正常访问,并清楚展示经营主体、商品或服务、价格、联系方式、退款规则、用户协议和隐私政策;
- 域名和网站符合法律法规以及部署地的备案要求;
- 网站经营主体与签约主体一致,或者可以提供合法、清晰的授权和关联关系证明;
- 业务不属于支付宝禁止或限制接入的行业;
- 特殊行业能够提供相应的许可证或资质;
- 支付页面使用 HTTPS,并具备基本的订单保护、防篡改和风险控制措施。
开通企业支付宝账号不等于已经取得接口支付权限。产品签约、应用审核和接口密钥配置是三个独立环节,都需要完成。
是否每个支付宝账号都要有一个已备案网站
不能简单地把备案要求理解成“一个账号对应一个备案域名”。
ICP备案约束的是网站及其互联网信息服务主体,并不是支付宝账号本身。一个已备案的网站可以为集团内多家公司提供服务,但需要满足以下条件:
- 网站备案信息真实有效;
- 页面明确说明网站运营主体;
- 各子公司的业务入口、商品或服务以及收款主体都能被清楚识别;
- 备案主体、网站运营主体和支付宝签约主体不一致时,可以证明彼此之间的集团关系和授权关系;
- 支付宝在签约审核中认可这种运营安排。
网站部署在中国大陆服务器上时,一般需要完成 ICP 备案。如果业务还涉及依法需要许可的经营性互联网信息服务,则要根据实际情况判断是否需要办理 ICP 许可证等资质,普通备案不能代替行政许可。
以下情况在审核中容易出现问题:
- 网站备案在集团公司名下,却没有说明子公司如何使用该网站;
- 页面展示的是集团品牌,实际收款方却是子公司,而且付款前没有明确提示;
- 多个支付宝账号提交同一个网站,但网站上没有对应公司的业务页面;
- 备案主体与签约主体之间没有股权、管理或书面授权关系;
- 网站只有登录页或测试页,审核人员无法查看完整业务流程。
集团共用一个域名是可行的,但最好为每个子公司设置可以单独审核的业务入口,例如:
https://pay.example.com/company-a/
https://pay.example.com/company-b/
https://pay.example.com/company-c/
每个入口都应明确展示公司全称、服务内容、联系方式、退款规则和实际收款主体。
多个子公司共用一个 WAP 站点的推荐方案
多个子公司可以使用同一套站点程序,但支付配置必须按商户隔离。
钉钉消息中的支付链接
↓
集团统一 WAP 站点
↓
根据已登录员工、子公司和订单确定 merchant_id
↓
读取该子公司的 app_id、密钥或证书配置
↓
调用 alipay.trade.wap.pay
↓
支付宝完成支付
↓
通知地址验证签名并更新对应子公司的订单
每个子公司至少需要独立拥有以下账号、配置和权限:
- 企业支付宝账号;
- 产品签约;
- 支付宝开放平台应用,支付宝批准其他服务商模式的情况除外;
app_id;- 应用私钥;
- 支付宝公钥或支付宝公钥证书;
- 商户订单号命名空间;
- 对账和退款权限;
- 支付通知验签配置;
- 财务账务及交易数据权限。
集团站点可以统一部署代码,但不同子公司不能共用同一份应用私钥,也不能根据订单参数随意修改收款账号。支付宝会根据实际调用的应用及其签约关系确定交易归属。前端传入的公司名称或账号无法改变收款主体。
接口调用示例
下面是支付宝 Java SDK 的常见调用方式。具体 SDK 版本、证书模式的配置方法和依赖坐标,应以接入时的官方文档为准。
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
merchantConfig.getAppId(),
merchantConfig.getAppPrivateKey(),
"json",
"UTF-8",
merchantConfig.getAlipayPublicKey(),
"RSA2"
);
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.setNotifyUrl("https://pay.example.com/alipay/notify");
request.setReturnUrl("https://pay.example.com/payment/result");
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setOutTradeNo(order.getMerchantOrderNo());
model.setSubject(order.getSubject());
model.setTotalAmount(order.getTotalAmount().toPlainString());
model.setProductCode("QUICK_WAP_WAY");
model.setQuitUrl("https://pay.example.com/payment/cancel");
request.setBizModel(model);
AlipayTradeWapPayResponse response = alipayClient.pageExecute(request);
if (!response.isSuccess()) {
throw new IllegalStateException(
"Failed to create Alipay WAP payment: "
+ response.getCode()
+ " "
+ response.getSubCode()
);
}
String paymentForm = response.getBody();
服务端必须根据订单所属的子公司确定这里的 merchantConfig,不能直接接受浏览器传入的 app_id 或密钥标识。
例如,可以维护以下商户配置关系:
company_a -> app_id_A -> key_A -> notify policy A
company_b -> app_id_B -> key_B -> notify policy B
company_c -> app_id_C -> key_C -> notify policy C
创建订单时,服务端先根据当前员工、钉钉组织身份和业务权限确定子公司,然后读取对应的配置:
Company company = companyService.resolveCompany(
currentUser.getDingTalkCorpId(),
paymentRequest.getBusinessOrderId()
);
Order order = orderService.findOwnedOrder(
company.getId(),
paymentRequest.getBusinessOrderId()
);
MerchantConfig merchantConfig =
merchantConfigService.getByCompanyId(company.getId());
不要使用下面的写法:
// 错误示例:不能信任前端提交的商户标识
MerchantConfig config =
merchantConfigService.getByAppId(request.getParameter("app_id"));
否则,攻击者可能通过修改请求,把订单路由到错误的收款主体。
异步通知处理
支付成功不能只看 return_url。用户付款后可能直接关闭支付宝或浏览器,因此订单的最终状态应以支付宝异步通知或主动查询结果为准。
通知处理至少包括以下步骤:
- 根据通知中的
app_id找到对应子公司的验签配置。 - 使用该应用对应的支付宝公钥或证书验证签名。
- 检查
app_id是否与订单预期使用的应用一致。 - 检查
out_trade_no、金额和币种。 - 检查交易状态。
- 以幂等方式更新订单。
- 验证成功并完成处理后,返回支付宝要求的成功响应。
示意代码如下:
String appId = request.getParameter("app_id");
MerchantConfig config = merchantConfigService.getByAppId(appId);
Map<String, String> parameters = extractParameters(request);
boolean verified = AlipaySignature.rsaCheckV1(
parameters,
config.getAlipayPublicKey(),
"UTF-8",
"RSA2"
);
if (!verified) {
throw new SecurityException("Invalid Alipay notification signature");
}
Order order = orderService.findByMerchantOrderNo(
parameters.get("out_trade_no")
);
if (!appId.equals(order.getExpectedAppId())) {
throw new SecurityException("Unexpected app_id");
}
BigDecimal paidAmount =
new BigDecimal(parameters.get("total_amount"));
if (paidAmount.compareTo(order.getAmount()) != 0) {
throw new SecurityException("Payment amount mismatch");
}
orderService.markPaidIdempotently(
order.getId(),
parameters.get("trade_no")
);
正式接入时,还要按照所选 SDK 和签名模式处理证书序列号、字符编码及通知字段。
钉钉内跳转需要注意什么
在这个方案中,钉钉主要用于识别身份和提供消息入口,支付由支付宝完成。钉钉消息中的链接建议只携带短时有效的支付令牌,例如:
https://pay.example.com/p?t=eyJhbGciOi...
服务端收到令牌后,再解析对应的员工、公司和订单。不要在 URL 中直接暴露金额、支付宝账号或可以修改的订单参数。
接入时还要注意:
- 使用 HTTPS;
- 为支付令牌设置较短的有效期;
- 将令牌与员工、子公司和订单绑定;
- 防止同一订单被重复创建或重复支付;
- 跳转支付宝前,明确显示收款公司的全称和金额;
- 兼容钉钉内置浏览器、系统浏览器和支付宝 App 之间的跳转差异;
- 不要把应用私钥、证书私钥或支付接口签名逻辑放进 H5 页面;
- 上线前分别测试 Android、iOS,以及取消支付、支付失败、重复通知和通知延迟等情况。
网站备案和签约材料建议
集团共用站点时,可以提前准备以下材料:
- 集团公司及各子公司的营业执照;
- 能够证明股权或控制关系的材料;
- 集团站点允许各子公司开展业务的书面授权;
- 网站运营和数据处理责任说明;
- 各子公司的业务介绍及对应页面;
- 各子公司的服务协议、退款规则和联系方式;
- 网站 ICP 备案信息;
- 特殊行业许可证;
- 钉钉应用场景和完整支付流程截图;
- 付款页面、支付结果页及售后入口截图。
授权书只能证明网站的使用和运营关系,不能代替子公司的支付产品签约,也不会自动赋予集团应用替子公司收款的权限。
方案选择建议
如果各子公司需要独立收款、退款和对账,较稳妥的结构是:
- 共用一个已经备案的集团 WAP 站点;
- 为每个子公司设置独立的业务页面;
- 各子公司使用自己的企业支付宝账号分别签约;
- 各子公司创建并配置自己的支付应用;
- 后端根据订单所属公司选择应用配置;
- 在付款确认页明确展示实际收款主体。
如果支付宝不认可“集团为备案主体、子公司为签约主体”的安排,就需要按照审核意见采用以下方案之一:
- 将相应业务页面或域名备案到子公司名下;
- 为各子公司使用独立域名或子域名,并分别完成所需备案;
- 使用支付宝认可的服务商、平台型或多商户解决方案。
最后一种方案不能通过普通 WAP 支付接口自行模拟。服务商代接入、平台分账、二级商户或代收后结算涉及不同的产品资质、资金路径和合规要求。应先向支付宝确认可用产品及准入条件,再据此确定系统架构。
备注:内容仅供参考。
