支付宝 SDK 转 H5 支付链接实战:Java 生成地址、页面跳转与结果确认
“后端明明生成了支付参数,为什么前端还是跳不进收银台?”
做支付宝 SDK 转 H5 相关接入时,常见的问题不是少写了一次跳转,而是把三个不同结果混在了一起:SDK 订单串、HTML 支付表单、浏览器跳转 URL。
这篇直接从实现入手,讲清 Java 后端怎样生成 H5 支付入口、前端怎样使用,以及页面返回之后该如何确认订单结果。
先明确本文的实现范围:这里采用商户后端直接接入手机网站支付的方式,需要业务订单、签名配置和相应产品权限。它提供的是网页支付入口,并非一个接收任意已有 App 签名串、自动转出会话链接的通用转换器。
一、接口和产品码先选对
普通 App 支付参数与手机网站支付参数之间,存在明确的接口差异:
| 对比项 | App 支付 | 手机网站支付 |
|---|---|---|
| 常见接口 | alipay.trade.app.pay | alipay.trade.wap.pay |
| 常见产品码 | QUICK_MSECURITY_PAY | QUICK_WAP_WAY |
| 面向的入口 | 客户端 SDK | 手机网页支付流程 |
| Java SDK 常用调用 | sdkExecute(request) | pageExecute(request) |
产品码和模型定义来自支付宝官方的 App 支付模型与手机网站支付模型。
选用 Java SDK,不等于选用 App 支付产品。同一个服务端 SDK 可以构造不同产品的请求,这正是“SDK 生成 H5 地址”容易让人误解的地方。
对于已经存在的 App 支付尝试,切换入口前要核对交易状态,并设计好业务订单与支付尝试的关联关系。不要让多个入口各自创建不受控的支付尝试,最后出现重复支付或对账混乱。
二、准备工作:哪些参数放在服务端?
本文示例使用普通公钥模式,以下配置均由服务端管理:
| 配置 | 用途 |
|---|---|
| App ID | 标识接入应用 |
| 应用私钥 | 为支付请求签名 |
| 支付宝公钥 | 对支付宝返回或通知进行验签 |
notify_url | 接收服务端异步通知 |
return_url | 用户支付流程结束后的页面返回入口 |
应用公钥和支付宝公钥承担不同职责,配置时要区分。证书模式则使用对应证书配置与验签方法,具体初始化方式见支付宝官方 Java SDK 说明。
业务请求可以传入订单标识,但金额、商品名称和当前支付状态应从后端订单记录中读取。客户端提交的total_amount不应直接成为最终签名金额。
下面使用 v2 Java SDK 的接口形式。Maven 依赖示例采用官方仓库说明中的一个明确版本,实际项目应固定经过自身回归测试的版本:
<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.40.1014.ALL</version></dependency>三、Java 示例:生成可跳转的 H5 URL
这段代码的输入是后端确认过的支付尝试信息,输出是签名后的网页支付请求 URL。它没有接收原 App 订单串,也没有沿用原订单串的sign。
importcom.alipay.api.AlipayApiException;importcom.alipay.api.AlipayClient;importcom.alipay.api.domain.AlipayTradeWapPayModel;importcom.alipay.api.request.AlipayTradeWapPayRequest;importjava.math.BigDecimal;importjava.math.RoundingMode;publicfinalclass