PAYATHON 2026

提交订单时如何生成 Alipay post URL?

支付老李

结论

提交订单时,Alipay 的 POST 地址通常是固定的网关地址:

https://openapi.alipaydev.com/gateway.do

无需将订单参数拼接成一个所谓的”新 URL”。正确的处理流程如下:

  1. 根据 create_forex_trade 接口要求准备公共参数和业务参数。
  2. 删除空值以及 sign、sign_type,对其余参数排序后生成签名。
  3. 将签名写入 sign。
  4. 使用 HTML Form 或服务端 HTTP POST,将全部参数提交到网关。

你目前使用的地址末尾不需要加 ?。采用 POST 时,参数应放在请求体中,而不是全部拼接到 URL 后面。

需要哪些参数

旧版 create_forex_trade 接口通常包含以下公共参数:

参数说明
service固定为 create_forex_trade
partnerAlipay 分配的合作伙伴 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&currency=USD&total_fee=10.00&notify_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=...

签名处理

签名算法必须与账户的签约配置一致。一般按以下顺序处理:

  1. 收集所有待提交参数。
  2. 排除 sign、sign_type 和值为空的参数。
  3. 按参数名的字典序排序。
  4. 根据接口规定的编码和格式,拼接待签名字符串。
  5. 使用约定的密钥或私钥计算签名。
  6. 对签名值进行 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 参数。

备注:内容仅供参考。