
简介本资源是《网联条码支付收单机构联调环境接入指引》官方文档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必须是你自己在自助验证平台申请并下载的私钥对应证书的序列号而非网联提供的4000068829RSA或4000227191SM2加签。抄错会导致签名验签失败网联返回{code:SIGN_VERIFY_FAIL,msg:签名验证失败}。实操步骤以RSA为例登录自助验证平台https://221.122.73.123/login进入【证书管理】→【申请测试证书】→选择RSA算法 → 提交下载.pfx文件含私钥和.cer文件公钥用OpenSSL提取序列号openssl x509 -in ./ca.cer -noout -serial # 输出serial4002481432将该序列号填入联调配置表「联调测试证书序列号」栏若跳过第4步直接抄证书文件名如cert_4002481432.cer而实际证书序列号为4002481433常见于证书重发场景则签名永远无法通过网联验签。2.3 源IP白名单为什么必须一次性报全12个IP且不能含内网地址网联联调环境采用双向白名单机制你访问网联221.122.73.120:9443等需开放源IP白名单网联回调你交易完成通知需你开放目标IP白名单221.122.73.98文档列出12个测试源IP103.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包的源IPNAT设备若未开启SNAT或MASQUERADE真实源IP仍为内网地址导致白名单失效。验证方法在服务器执行curl -v https://221.122.73.120:9443/gateway/wechat/unifiedorder 21 | 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证书外网联服务端证书由CNnetunion-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.dat3.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: CNNETUNION ROOT CA # 若显示Issuer: CNyour-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_sftp221.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_typeHMAC-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 21 | grep -E (Verify return|CONNECTED|subject|issuer)✅ 正常输出Verify return code: 0 (ok)CONNECTED(00000003)subjectCN 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、回调地址四者缺一不可。希望帮到你。本文还有配套的精品资源点击获取