钉钉小程序支付是否需要开通支付宝 App 支付
结论
通常需要。
如果钉钉小程序通过支付宝收款,服务端通过 alipay.trade.app.pay 创建支付订单,就必须先在支付宝开放平台创建应用,为该应用开通 App 支付,并完成签约、密钥配置和上线等流程。
钉钉小程序应用和支付宝开放平台应用是两套独立配置。钉钉小程序应用承载业务,支付宝开放平台应用负责创建支付宝订单、验签和接收支付结果通知。只创建钉钉小程序,不能代替创建支付宝应用。
为什么需要开通 App 支付
钉钉客户端只是发起支付的入口,交易订单仍由商户服务端向支付宝开放平台提交。
一般流程是:
- 钉钉小程序向业务服务端提交订单。
- 服务端调用支付宝支付接口创建订单。
- 支付宝返回供客户端支付使用的订单字符串。
- 小程序调用钉钉提供的支付 API,拉起支付宝收银台。
- 支付宝通过异步通知把最终支付结果发送给服务端。
如果服务端调用的是:
alipay.trade.app.pay
支付宝开放平台中的对应应用就需要具备 App 支付权限。未完成签约、应用尚未上线、应用主体不正确或密钥配置有误,都可能导致创建订单或拉起支付失败。
接入步骤
1. 创建支付宝开放平台应用
使用实际收款主体的支付宝开放平台账号创建应用,并完成主体认证。
创建后需要妥善保存以下信息:
app_id
应用私钥
支付宝公钥或支付宝公钥证书
应用公钥证书
支付宝根证书
使用普通公钥模式还是证书模式,必须与支付宝开放平台中的应用配置一致。
2. 开通对应的支付产品
如果接入方案需要调用 alipay.trade.app.pay,应为对应应用签约并开通 App 支付。
不能只因为业务运行在小程序中,就据此判断需要开通哪种支付产品。应以服务端实际调用的支付宝接口为准:
- 调用
alipay.trade.app.pay:通常对应 App 支付。 - 调用其他交易接口:需要核对该接口对应的产品权限和适用场景。
- 使用第三方服务商或组织统一支付平台:可能不需要自行创建支付宝应用,但服务商需要提供应用、商户授权和签名配置。
3. 在服务端创建支付订单
支付签名必须由服务端完成,不能把支付宝应用私钥放入钉钉小程序。
下面是使用支付宝 Java SDK 创建 App 支付订单的简化示例:
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
ALIPAY_APP_ID,
APP_PRIVATE_KEY,
"json",
"UTF-8",
ALIPAY_PUBLIC_KEY,
"RSA2"
);
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
request.setNotifyUrl("https://example.com/api/payment/alipay/notify");
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setOutTradeNo("ORDER_202609130001");
model.setSubject("订单支付");
model.setTotalAmount("99.00");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
String orderString = response.getBody();
在生产环境中,订单号、金额和商品信息必须根据服务端的可信数据生成,不能直接使用客户端提交的金额。
4. 在钉钉小程序中拉起支付
客户端从业务服务端取得 orderString 后,再调用当前钉钉小程序运行环境提供的支付 API。
不同的钉钉小程序运行时或接入方案,使用的 API 名称和参数可能不同。下面的代码只用于展示调用结构:
const result = await requestPaymentOrder();
dd.trade.pay({
orderStr: result.orderString,
success(res) {
console.log("支付调用完成", res);
queryOrderStatus(result.outTradeNo);
},
fail(err) {
console.error("支付调用失败", err);
}
});
部分钉钉客户端版本或旧版接入文档可能使用其他 API 名称和回调格式。开发时应以钉钉开放平台中对应能力的当前文档及客户端版本要求为准,不要直接照搬示例中的 API 名称。
5. 验证异步通知
客户端显示”支付成功”,不能作为最终入账依据。服务端收到支付宝异步通知后,至少要检查:
- 通知签名是否有效;
app_id是否属于当前应用;out_trade_no是否存在;total_amount是否与服务端订单金额一致;seller_id是否为预期收款方;- 订单是否已经处理,避免重复发货;
trade_status是否符合业务成功条件。
完成验签和业务处理后,再按照支付宝接口要求返回成功响应。
注意事项
不要在小程序中保存应用私钥
应用私钥只能保存在服务端。把私钥写入小程序代码、配置文件或接口响应,可能导致他人伪造支付请求。
App 支付权限必须与 app_id 对应
服务端签名所使用的 app_id、私钥和支付产品权限,必须属于同一个支付宝开放平台应用。混用不同应用的配置,通常会导致签名失败或权限不足。
沙箱与生产环境不能混用
沙箱应用、沙箱账号、网关地址和密钥必须配套使用。切换到生产环境时,需要改用正式应用的 app_id、密钥、网关和商户配置。
先确认实际支付方案
如果项目使用钉钉提供的聚合支付、服务商代开发方案,或企业内部已有统一支付中台,所需权限可能不同于直接调用 alipay.trade.app.pay 的方案。此时应先确认服务端最终调用的支付宝接口,再判断是否需要单独创建应用并开通 App 支付。
判断的依据不是”钉钉小程序是否天然要求 App 支付”,而是支付链路是否使用支付宝开放平台应用和 alipay.trade.app.pay。如果采用这条标准支付链路,就需要创建支付宝应用,并为其开通 App 支付。
备注:内容仅供参考。
