提交订单时如何生成 Alipay post URL?
支付老李
结论
提交订单时,Alipay 的 POST 地址通常是固定的网关地址:
https://openapi.alipaydev.com/gateway.do
无需将订单参数拼接成一个所谓的”新 URL”。正确的处理流程如下:
- 根据
create_forex_trade接口要求准备公共参数和业务参数。 - 删除空值以及
sign、sign_type,对其余参数排序后生成签名。 - 将签名写入
sign。 - 使用 HTML Form 或服务端 HTTP POST,将全部参数提交到网关。
你目前使用的地址末尾不需要加 ?。采用 POST 时,参数应放在请求体中,而不是全部拼接到 URL 后面。
需要哪些参数
旧版 create_forex_trade 接口通常包含以下公共参数:
| 参数 | 说明 |
|---|---|
service | 固定为 create_forex_trade |
partner | Alipay 分配的合作伙伴 ID |
_input_charset | 字符编码,通常为 utf-8 |
sign_type | 签名类型,例如合同约定的 MD5、RSA 或 RSA2 |
sign | 根据接口签名规则计算出的签名 |
notify_url | 支付结果异步通知地址 |
return_url | 用户支付完成后的浏览器返回地址 |
常用的业务参数有:
| 参数 | 说明 |
|---|---|
out_trade_no | 商户订单号,必须唯一 |
subject | 订单标题 |
currency | 交易币种,例如 USD |
total_fee | 订单金额 |
seller_id | 收款方 Alipay ID,部分签约模式要求提供 |
body | 订单描述,通常为可选参数 |
create_forex_trade 是较早期的跨境支付接口。不同地区、签约产品和接入版本要求的必填参数可能不同,因此上表仅用于说明请求的构建方式。实际接入时,应以商户签约产品对应的接口文档和 Alipay 提供的示例为准,不要照搬其他支付产品的参数表来补充字段。
生成 POST 请求
下面的示例通过 HTML Form 提交参数。签名必须在服务端生成,私钥或 MD5 key 不能发送到浏览器。
<form id="alipayForm"
method="post"
action="https://openapi.alipaydev.com/gateway.do">
<input type="hidden" name="service" value="create_forex_trade">
<input type="hidden" name="partner" value="YOUR_PARTNER_ID">
<input type="hidden" name="_input_charset" value="utf-8">
<input type="hidden" name="out_trade_no" value="ORDER_20260831_0001">
<input type="hidden" name="subject" value="Example order">
<input type="hidden" name="currency" value="USD">
<input type="hidden" name="total_fee" value="10.00">
<input type="hidden" name="notify_url"
value="https://merchant.example.com/alipay/notify">
<input type="hidden" name="return_url"
value="https://merchant.example.com/alipay/return">
<input type="hidden" name="sign_type" value="YOUR_SIGN_TYPE">
<input type="hidden" name="sign" value="SIGNATURE_GENERATED_ON_SERVER">
</form>
<script>
document.getElementById("alipayForm").submit();
</script>
实际的提交目标仍然是:
https://openapi.alipaydev.com/gateway.do
参数以 application/x-www-form-urlencoded 格式提交。请求体大致如下:
service=create_forex_trade&partner=YOUR_PARTNER_ID&_input_charset=utf-8&out_trade_no=ORDER_20260831_0001&subject=Example+order¤cy=USD&total_fee=10.00¬ify_url=https%3A%2F%2Fmerchant.example.com%2Falipay%2Fnotify&return_url=https%3A%2F%2Fmerchant.example.com%2Falipay%2Freturn&sign_type=YOUR_SIGN_TYPE&sign=...
签名处理
签名算法必须与账户的签约配置一致。一般按以下顺序处理:
- 收集所有待提交参数。
- 排除
sign、sign_type和值为空的参数。 - 按参数名的字典序排序。
- 根据接口规定的编码和格式,拼接待签名字符串。
- 使用约定的密钥或私钥计算签名。
- 对签名值进行 URL 编码并提交。
伪代码如下:
params = removeEmptyValues(params)
params.remove("sign")
params.remove("sign_type")
canonicalString = sortAndJoinAccordingToAlipayRules(params)
signature = sign(canonicalString, configuredKey, configuredSignType)
params["sign_type"] = configuredSignType
params["sign"] = signature
POST gatewayUrl WITH params
不要只对 JSON 字符串进行签名。签名完成后也不能修改金额、字符编码或回调地址,否则通常会导致验签失败。
注意事项
notify_url必须是 Alipay 服务器可以访问的公网 HTTPS 地址,不能使用localhost。- 收到异步通知后,应先验签,再核对
out_trade_no、金额、币种、商户身份和交易状态。 return_url仅用于浏览器跳转,不能单独作为确认支付成功的依据。- 金额应采用十进制定点格式,例如
10.00,避免直接使用浮点运算计算支付金额。 - 测试环境和生产环境的
partner、密钥及配置不能混用。 - 网关返回”缺少参数”或”签名错误”时,可以记录提交参数和待签名字符串,但不要记录私钥、MD5 key 等敏感信息。
- 如果当前账户的官方接入材料已不再提供
create_forex_trade,需要确认该产品是否仍对该商户开放,并改用签约产品指定的接口。迁移时不能只替换service参数。
备注:内容仅供参考。
