Converge API 返回 error 6042 Invalid Request Format
支付阿杰
明确结论
请求中的 xmldata 不是完整的 XML,而是一串以空格分隔的值。有效的 XML 需要根元素、字段标签和正确闭合的标签,例如 <txn>...</txn>。服务器无法解析当前内容,因此返回:
6042 Invalid Request Format
XML request is not well-formed or request is incomplete.
请求还通过 xmldata=... 提交表单参数,却将 Content-Type 设置为 text/xml,实际请求体格式与声明的媒体类型不符。
正确的 XML 结构
按照 Converge XML API 常见的字段结构,请求内容应类似:
<txn>
<ssl_merchant_id>my_merchant_id</ssl_merchant_id>
<ssl_user_id>my_user_id</ssl_user_id>
<ssl_pin>my_pin</ssl_pin>
<ssl_transaction_type>ccsale</ssl_transaction_type>
<ssl_card_number>4000000000000002</ssl_card_number>
<ssl_exp_date>1124</ssl_exp_date>
<ssl_amount>1.00</ssl_amount>
<ssl_cvv2cvc2_indicator>1</ssl_cvv2cvc2_indicator>
<ssl_cvv2cvc2>786</ssl_cvv2cvc2>
<ssl_first_name>adolfo</ssl_first_name>
</txn>
具体需要哪些必填字段,可能与账户配置、交易类型和 Converge API 接入方式有关,请以当前账户对应的接口文档为准。
推荐的 curl 写法
如果接口要求通过名为 xmldata 的表单字段提交 XML,应将媒体类型设为 application/x-www-form-urlencoded,并让 curl 对 XML 内容进行 URL 编码:
curl -X POST \
'https://api.convergepay.com/VirtualMerchant/processxml.do' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'xmldata=<txn><ssl_merchant_id>my_merchant_id</ssl_merchant_id><ssl_user_id>my_user_id</ssl_user_id><ssl_pin>my_pin</ssl_pin><ssl_transaction_type>ccsale</ssl_transaction_type><ssl_card_number>4000000000000002</ssl_card_number><ssl_exp_date>1124</ssl_exp_date><ssl_amount>1.00</ssl_amount><ssl_cvv2cvc2_indicator>1</ssl_cvv2cvc2_indicator><ssl_cvv2cvc2>786</ssl_cvv2cvc2><ssl_first_name>adolfo</ssl_first_name></txn>'
也可以先将 XML 保存到 shell 变量中,以便检查:
XML_DATA='<txn>
<ssl_merchant_id>my_merchant_id</ssl_merchant_id>
<ssl_user_id>my_user_id</ssl_user_id>
<ssl_pin>my_pin</ssl_pin>
<ssl_transaction_type>ccsale</ssl_transaction_type>
<ssl_card_number>4000000000000002</ssl_card_number>
<ssl_exp_date>1124</ssl_exp_date>
<ssl_amount>1.00</ssl_amount>
<ssl_cvv2cvc2_indicator>1</ssl_cvv2cvc2_indicator>
<ssl_cvv2cvc2>786</ssl_cvv2cvc2>
<ssl_first_name>adolfo</ssl_first_name>
</txn>'
curl -X POST \
'https://api.convergepay.com/VirtualMerchant/processxml.do' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode "xmldata=${XML_DATA}"
原请求中的具体问题
原请求实际发送的内容近似于:
xmldata=my_merchant_id my_user_id my_pin ccsale ...
其中有几个问题:
- 缺少
<txn>这样的 XML 根元素。 - 每个值都没有对应的 XML 标签。
- XML 元素没有开始标签和结束标签。
xmldata=表示请求提交的是表单字段,而Content-Type: text/xml表示整个请求体是原始 XML,两者相互矛盾。- 如果直接拼接 XML 而不进行 URL 编码,特殊字符还可能破坏表单请求。
注意事项
示例中的有效期 1124 通常表示 2024 年 11 月,目前已经过期。即使修复了 XML 格式,这个值仍可能触发其他交易校验错误,需要换成测试环境允许的有效值。
不要在日志、工单或公开环境中记录真实的 ssl_pin、完整银行卡号和 CVV。示例卡号也只能用于 Converge 指定的测试环境。生产地址、测试地址、测试卡号和必填字段,请以实际账户使用的 Converge 接口文档为准。
备注:内容仅供参考。
