针对微信支付的ip获取机制,获取客户端来源真实ip
› 社区话题 › wordpress开发 › ✅微信支付 & 支付宝支付 IP 校验机制与socket代理支付解决方案总结日志 › 针对微信支付的ip获取机制,获取客户端来源真实ip
追光
微信支付的ip校验是提交客户端来源的真实ip。而支付宝校验的是请求的出口ip,所以支付宝必须在请求的时候使用代理或者使用公网服务器,而微信只需要传入的时候在整个链路上都传递了真实ip,提交时候直接使用这个ip。上方的配置中,为了更加严谨和应对未来的合规性检测,我们将微信支付的出口也标准化,让微信支付和支付宝支付都使用了相同的服务器出口代理IP。
所以:支付宝支付,必须走代理。而微信支付不强制需要走代理。
针对微信的ip获取机制,我这里做一个进一步的补充
✅ 是的,这段代码在真实公网服务器上部署时,依然能获取到真实客户端 IP 但前提是:你的 Nginx/Apache 没有做反向代理或 CDN。
✅ 三种部署场景分析:
场景一:纯公网服务器(无反向代理、无 CDN)
$SERVER[\’REMOTEADDR\’] = 真实用户IP ✅
$SERVER[\’HTTPXFORWARDEDFOR\’] = 不存在或为空
你的代码会返回 REMOTEADDR → 真实IP
→ 完美工作,100% 获取真实IP
场景二:公网服务器 + Nginx 反向代理(如负载均衡、WAF)
$SERVER[\’REMOTEADDR\’] = 反向代理服务器IP ❌
$SERVER[\’HTTPXFORWARDEDFOR\’] = 真实用户IP(如果 Nginx 配置了 proxysetheader X-Forwarded-For $proxyaddxforwardedfor;)✅
→ 你的代码会返回 HTTPXFORWARDEDFOR → 真实IP
→ 依然完美工作
场景三:公网服务器 + CDN(如 Cloudflare、阿里云CDN)
$SERVER[\’REMOTEADDR\’] = CDN 节点IP ❌
$SERVER[\’HTTPXFORWARDEDFOR\’] = 真实用户IP(如果 CDN 传递了)✅
有些 CDN 用 $SERVER[\’HTTPCFCONNECTINGIP\’](Cloudflare)或自定义 Header
→ 你的代码会返回 HTTPXFORWARDEDFOR → 真实IP
→ 依然工作,但依赖 CDN 配置
✅ 代码为什么健壮?
php
function getrealclientip() {
// 1. 优先取 X-Forwarded-For(反向代理/CDN 场景)
if (isset($SERVER[\'HTTPXFORWARDEDFOR\']) && filtervar($SERVER[\'HTTPXFORWARDEDFOR\'], FILTERVALIDATEIP, FILTERFLAGIPV4)) {
return $SERVER[\'HTTPXFORWARDEDFOR\'];
}
// 2. 其次取 HTTPCLIENTIP(某些代理)
if (isset($SERVER[\'HTTPCLIENTIP\']) && filtervar($SERVER[\'HTTPCLIENTIP\'], FILTERVALIDATEIP, FILTERFLAGIPV4)) {
return $SERVER[\'HTTPCLIENTIP\'];
}
// 3. 最后取 REMOTEADDR(直连场景)
if (isset($SERVER[\'REMOTEADDR\']) && filtervar($SERVER[\'REMOTEADDR\'], FILTERVALIDATEIP, FILTERFLAGIPV4)) {
return $SERVER[\'REMOTEADDR\'];
}
return \'1.1.1.1\'; // 兜底
}兼容所有场景:直连、反向代理、CDN
优先级合理:先取代理传递的IP,再取直连IP
格式校验:确保返回的是合法 IPv4
兜底机制:避免返回空值导致微信支付报错
✅ 最佳实践建议:
如果你使用 Nginx 反向代理服务器,在 nginx.conf 中确保:
nginx
location / {
proxysetheader X-Forwarded-For $proxyaddxforwardedfor;
proxysetheader X-Real-IP $remoteaddr;
proxysetheader Host $host;
proxypass http://your-backend;
}在反向代理的后端服务器需要解析真实ip:
# 反代的真实客户端 IP
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
real_ip_recursive on;如果你使用 Cloudflare,在代码中可加:
php
if (isset($SERVER[\'HTTPCFCONNECTINGIP\']) && filtervar($SERVER[\'HTTPCFCONNECTINGIP\'], FILTERVALIDATEIP, FILTERFLAGIPV4)) {
return $SERVER[\'HTTPCFCONNECTINGIP\'];
}✅ 结论:
无论你的服务器是“后端”还是“真实公网服务器”,这段代码都能正确获取真实客户端 IP 只要你的网络架构(Nginx/CDN)正确传递了 IP 头。