简介:本资源是《网联条码支付收单机构联调环境接入指引》官方文档(2018年5月版),面向互联网支付领域收单机构的技术对接人员与系统集成工程师,解决条码支付系统联调接入中的身份认证、网络白名单配置、接口地址调用及证书管理等核心问题。文档为单文件Word格式(.docx),共1个文件,大小96KB,内容结构清晰,涵盖收单机构基本信息填报规范、12组测试源IP白名单要求、支付宝/微信全链路交易接口(统一下单、退款查询等)及SFTP对账地址、证书序列号申请流程与HTTPS回调约束等实操要点。目前已有173人学习下载,读者可直接获取标准化接入参数模板、平台侧联调地址清单、签名算法选型建议(RSA/SM2)、自助验证平台入口及关键注意事项(如仅支持IP回调、需一次性提交全部测试IP),大幅降低联调环境部署门槛,保障合规高效接入网联条码支付体系。
1. 网联条码支付收单机构联调环境接入指引:不是说明书,是收单系统上线前的「白名单+证书+IP」三重校验清单
你手上有微信/支付宝扫码收单能力,也跑通了自家商户进件、订单生成、支付回调,但一连网联联调环境就卡在「403 Forbidden」或「SSL handshake failed」——不是代码写错了,而是你根本没看清这份《网联条码支付_收单机构联调环境接入指引_20180504_1030.docx》里埋的三个硬性准入条件:白名单IP必须一次性报全、证书序列号不能抄错位、回调地址连域名都不让用。这不是开发文档,是网联侧对收单机构网络身份、密钥体系、通信路径的联合校验单。它不教你写Java还是Python,只告诉你:哪几个IP要提前备案、哪个证书序列号该填在哪张表、为什么用SFTP对账却要单独开22端口白名单、以及为什么你测试时能下单却收不到交易完成通知——八成是HTTPS回调地址写了域名而非IP。适合正在对接网联条码支付的收单技术负责人、支付中台工程师、以及被业务方催着“下周必须过联调”的后端同学。别急着写接口,先拿这份指引核对你的网络拓扑和密钥管理流程。
2. 收单机构侧准入准备:从金融机构编码到源IP白名单的实操闭环
2.1 金融机构编码与机构身份绑定:为什么Z2026742000018不能填错一位
网联平台所有接口调用的身份校验,不依赖API Key或AppID,而直接锚定「金融机构编码」这一央行颁发的唯一标识。以示例中的Z2026742000018为例,其结构为:
Z:表示非银行支付机构(区别于银行类B开头)2026742:机构注册地行政区划代码(武汉东湖新技术开发区)000018:该区域内机构序号
提示:该编码需与你在网联自助验证平台注册时提交的《支付业务许可证》信息完全一致。若曾变更过公司名称或注册地址,务必确认许可证副本上的编码未更新,否则证书申请会因主体不一致被拒。
实际操作中,该编码将嵌入以下两处关键位置:
- HTTP Header 中的
X-Inst-Code字段(所有网联交易请求必传) - SFTP 对账文件命名规则(如
Z2026742000018_20240520.zip)
若漏传或错传,网联网关返回{"code":"INVALID_INST_CODE","msg":"机构编码无效"},且不记录日志——这意味着你查Nginx access log或业务日志都看不到失败痕迹,只能靠抓包确认Header是否携带。
2.2 联调测试证书:RSA vs SM2选型决策与序列号填坑指南
文档明确标注「√RSA □SM2」,但这不是勾选题,而是合规性前置判断:
- RSA:适用于已具备国密改造计划但尚未落地的机构,兼容性高,调试工具链成熟(OpenSSL、Postman均原生支持)
- SM2:强制用于新接入机构或金融监管重点检查场景,需额外部署国密SSL库(如
gmssl),且网联侧SM2证书分加签证书(序列号4000227191)与加密证书(序列号4000227192),二者不可混用
关键动作不是“选算法”,而是确认证书序列号归属:
注意:文档强调“收单机构的证书序列号 ≠ 网联的证书序列号”。你填在联调配置表里的
4002481432,必须是你自己在自助验证平台申请并下载的私钥对应证书的序列号,而非网联提供的4000068829(RSA)或4000227191(SM2加签)。抄错会导致签名验签失败,网联返回{"code":"SIGN_VERIFY_FAIL","msg":"签名验证失败"}。
实操步骤(以RSA为例):
- 登录自助验证平台
https://221.122.73.123/login - 进入【证书管理】→【申请测试证书】→选择RSA算法 → 提交
- 下载
.pfx文件(含私钥)和.cer文件(公钥) - 用OpenSSL提取序列号:
openssl x509 -in ./ca.cer -noout -serial # 输出:serial=4002481432- 将该序列号填入联调配置表「联调测试证书序列号」栏
若跳过第4步直接抄证书文件名(如cert_4002481432.cer),而实际证书序列号为4002481433(常见于证书重发场景),则签名永远无法通过网联验签。
2.3 源IP白名单:为什么必须一次性报全12个IP且不能含内网地址
网联联调环境采用双向白名单机制:
- 你访问网联(
221.122.73.120:9443等)需开放源IP白名单 - 网联回调你(交易完成通知)需你开放目标IP白名单(
221.122.73.98)
文档列出12个测试源IP(103.25.21.32–103.25.21.45,其中1103.25.21.38疑似笔误应为103.25.21.38),这不是“可选范围”,而是网联侧负载均衡节点列表。若你只报了其中3个IP,其余9个节点发出的请求将被防火墙直接丢弃,表现为:
- 部分请求成功(命中已白名单IP)
- 部分请求超时(命中未白名单IP,无响应)
- 日志显示“connection refused”而非“timeout”
更隐蔽的坑在于:禁止使用NAT后的真实出口IP。例如你服务器内网IP为192.168.1.100,经NAT后出口为103.25.21.32,则必须填写103.25.21.32,而非192.168.1.100。网联网关校验的是TCP连接建立时SYN包的源IP,NAT设备若未开启SNAT或MASQUERADE,真实源IP仍为内网地址,导致白名单失效。
验证方法:在服务器执行
curl -v https://221.122.73.120:9443/gateway/wechat/unifiedorder 2>&1 | grep "Connected to" # 正常应显示:Connected to 221.122.73.120 (221.122.73.120) port 9443 (#0) # 若显示:Failed to connect to 221.122.73.120 port 9443: Connection refused → 白名单未生效3. 网联平台侧联调地址解析:从统一下单到SFTP对账的协议级约束
3.1 微信统一下单接口:HTTPS + 双向TLS + 回调地址IP硬限制
网联提供的微信统一下单地址:https://221.122.73.120:9443/gateway/wechat/unifiedorder
表面看是标准HTTPS,实则隐含三层协议约束:
- 端口强制9443:非443,且网联未提供HTTP重定向,直接访问
http://或https://:443均返回400 Bad Request - 双向TLS认证:除客户端证书(即你申请的
4002481432证书)外,网联服务端证书由CN=netunion-gateway签发,需在客户端信任该CA(证书链中包含NETUNION ROOT CA) - 回调地址(notify_url)必须为IP:微信侧要求
notify_url参数值为https://103.25.21.32:8443/callback,若填https://pay.yourdomain.com/callback,网联网关在构造微信请求时会直接拒绝,返回{"code":"INVALID_NOTIFY_URL","msg":"回调地址格式错误"}
实操中易错点:
- 开发环境用
localhost或127.0.0.1测试,上线时未替换为白名单IP → 回调失败 - Nginx反向代理配置中
proxy_set_header Host $host未改为proxy_set_header Host 103.25.21.32→ 微信回调时Host头为域名,网联校验不通过
3.2 SFTP对账通道:为何22端口独立白名单且不走HTTPS
网联对账文件传输不使用HTTPS API,而采用SFTP协议(SSH File Transfer Protocol),地址为:221.122.73.126:22
这带来三个硬性要求:
- 22端口需单独开通白名单:与交易API的9443端口白名单无关,必须向网联提交
221.122.73.126的22端口访问权限申请 - SFTP用户凭证非HTTP Token:需在自助验证平台生成SFTP专用账号(格式如
Z2026742000018_sftp)及密码,该密码与证书密码无关 - 文件命名与解密强绑定:下载的
Z2026742000018_20240520.zip需用网联提供的SM4密钥解密(密钥通过自助平台下载),而非证书私钥
典型错误流程:
- 用OpenSSL私钥解压zip → 报错
invalid password - 以为密码是证书密码 → 浪费2小时
- 实际应下载
sm4_key_20240520.dat,用gmssl sm4 -d -in Z2026742000018_20240520.zip -out data.csv -keyfile sm4_key_20240520.dat
3.3 支付宝交易地址:看似简单却卡在证书链验证
支付宝接口地址:https://221.122.73.120:9443/gateway/alipay
表面与微信同域,但支付宝侧要求:
- 客户端证书必须包含完整证书链:仅上传
.cer文件不够,需合并CA证书(NETUNION ROOT CA.cer)到同一PEM文件 - HTTP Header 必须带
X-Channel-Type: ALIPAY:否则网关路由至微信通道,返回{"code":"UNSUPPORTED_CHANNEL","msg":"不支持的渠道类型"}
验证证书链完整性命令:
openssl s_client -connect 221.122.73.120:9443 -servername 221.122.73.120 -cert ./client.pem -key ./client.key 2>/dev/null | openssl x509 -noout -text | grep "Issuer:" # 正常应显示:Issuer: CN=NETUNION ROOT CA # 若显示:Issuer: CN=your-company-CA → 证书链缺失4. 常见问题排查:12个IP白名单已开,为什么还连不上?
4.1 现象:curl测试返回curl: (35) SSL connect error
原因:客户端证书未正确加载,或证书私钥密码错误。网联网关在TLS握手阶段即断开,不进入HTTP层。
解决:
- 确认
.pfx导出时勾选“包括所有证书到证书链” - 用
openssl pkcs12 -info -in cert.pfx验证私钥密码 - 在curl中显式指定证书和私钥:
curl --cert ./client.pem --key ./client.key --cacert ./ca.pem \ -H "X-Inst-Code: Z2026742000018" \ https://221.122.73.120:9443/gateway/wechat/unifiedorder4.2 现象:SFTP连接成功但ls命令无响应,或get超时
原因:网联SFTP服务启用SFTP Subsystem而非SCP,部分老旧SFTP客户端(如FileZilla旧版)默认使用SCP协议。
解决:
- FileZilla中【编辑】→【设置】→【连接】→【SFTP】→【添加密钥文件】→ 选择
id_rsa(非证书) - 或改用命令行
scp替代:
scp -P 22 -i ./sftp_key Z2026742000018_sftp@221.122.73.126:/home/ftp/in/Z2026742000018_20240520.zip .4.3 现象:交易成功但收不到transaction_complete回调
原因:回调地址虽为IP,但服务器未监听该IP的443端口,或防火墙拦截。网联回调源IP固定为221.122.73.98,需在你服务器放行该IP的443端口入站。
解决:
iptables -L INPUT -n | grep 221.122.73.98确认规则存在netstat -tlnp | grep :443确认Web服务绑定0.0.0.0:443而非127.0.0.1:443- 用
tcpdump -i any port 443 and host 221.122.73.98抓包确认请求是否到达
4.4 现象:退款接口返回{"code":"INVALID_SIGN","msg":"签名参数错误"}
原因:微信退款要求sign_type=HMAC-SHA256,但网联网关强制转换为RSA签名,且签名原文需按网联规范排序(非微信原始顺序)。
解决:
- 不直接复用微信SDK的
generateSign(),而用网联提供的Java签名工具类NetUnionSignUtil.sign() - 关键参数顺序必须为:
appid、mch_id、nonce_str、out_refund_no、out_trade_no、refund_fee、total_fee、transaction_id(缺一不可,顺序不可变)
4.5 现象:自助验证平台登录后空白页,F12显示net::ERR_CERT_DATE_INVALID
原因:平台地址https://221.122.73.123/login使用自签名证书,且有效期截至2023年。浏览器拒绝加载。
解决:
- Chrome地址栏输入
thisisunsafe(无需回车,页面自动刷新) - 或临时导入网联根证书:下载
NETUNION ROOT CA.cer→ Chrome【设置】→【隐私和安全】→【安全】→【管理证书】→【受信任的根证书颁发机构】→【导入】
5. 联调环境验证技巧:用三组curl命令快速定位90%的问题
5.1 TLS握手层验证:确认证书与白名单双生效
执行以下命令,观察输出中Verify return code和CONNECTED状态:
openssl s_client -connect 221.122.73.120:9443 \ -servername 221.122.73.120 \ -cert ./client.pem \ -key ./client.key \ -CAfile ./ca.pem \ -verify_hostname 221.122.73.120 2>&1 | grep -E "(Verify return|CONNECTED|subject|issuer)"- ✅ 正常输出:
Verify return code: 0 (ok)+CONNECTED(00000003)+subject=CN = Z2026742000018 - ❌ 异常:
Verify return code: 21 (unable to verify the first certificate)→ CA证书未加载 - ❌ 异常:
CONNECTED(00000000)→ 白名单未开或IP不对
5.2 HTTP协议层验证:绕过业务逻辑直击网关路由
构造最简请求,仅验证网关是否接收:
curl -k -X POST \ -H "Content-Type: application/json" \ -H "X-Inst-Code: Z2026742000018" \ -d '{"mch_id":"Z2026742000018"}' \ https://221.122.73.120:9443/gateway/wechat/unifiedorder- ✅ 返回
{"code":"MISSING_PARAM","msg":"缺少必要参数"}→ 网关已接收,参数校验层生效 - ❌ 返回
curl: (7) Failed to connect to 221.122.73.120 port 9443: Connection refused→ 白名单或防火墙问题 - ❌ 返回
{"code":"CERT_NOT_FOUND","msg":"未找到对应证书"}→ 证书序列号未在网联后台注册
5.3 业务逻辑层验证:用预置测试用例触发真实交易流
网联提供固定测试商户号1900000109和测试密钥893423DCD2344A13358182ECF7AB0001,构造统一下单请求:
curl -k -X POST \ -H "Content-Type: application/json" \ -H "X-Inst-Code: Z2026742000018" \ -d '{ "appid": "wx1234567890", "mch_id": "1900000109", "nonce_str": "a1b2c3d4e5f67890", "body": "test", "out_trade_no": "TEST'$(date +%s)'", "total_fee": 1, "spbill_create_ip": "103.25.21.32", "notify_url": "https://103.25.21.32:8443/callback", "trade_type": "NATIVE" }' \ https://221.122.73.120:9443/gateway/wechat/unifiedorder- ✅ 返回
{"code":"SUCCESS","result_code":"SUCCESS","code_url":"weixin://..."}→ 全链路打通 - ❌ 返回
{"code":"INVALID_MCH_ID","msg":"商户号无效"}→ 未在网联后台开通测试商户权限
从那以后我每次启动联调,都强制走一遍这三组curl:先openssl s_client看证书,再curl -H X-Inst-Code看网关,最后用测试商户号跑通一笔NATIVE下单。少一个环节,后面三天都在查日志。这份指引不是让你读完就懂,而是给你一张可逐项打钩的检查清单——白名单、证书、IP、回调地址,四者缺一不可。希望帮到你。
本文还有配套的精品资源,点击获取