최근 회사는 WeChat의 H5 결제를 신청했습니다. 관련 결제 서류는 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4에서 확인할 수 있습니다.판매자 매개변수 형식이 잘못되었습니다. 판매자에게 문의하여 문제를 해결하세요.
공식 WeChat 문서에 따르면 오류 메시지는referer
가 누락되어야 합니다. 그래서 찾아보니referer
가 없어진 것을 발견했습니다. 문제 해결 과정을 문서화하세요.商家参数格式有误,请联系商家解决
根据微信官方文档的错误提示 应该是referer
丢失的问题 于是定位一通发现还真是referer
丢失了 记录下解决问题过程。
HTTP Referer是HTTP
请求header
头信息的一部分 当浏览器向web服务器发送请求的时候,一般会带上Referer
告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。
比如我们在Chrome
浏览器的控制台下 可以看到Request Headers
下有类似如下的信息
Provisional headers are shown Accept: / Origin: local.test5.show Referer: local.test5.show/test/show User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
其中Referer
就是该属性了
Referer的正确英语拼法是referrer。由于早期 HTTP 规范的拼写错误,为了保持向后兼容就将错就错了
比如你发现访问加载自己的资源 而 referer不是自己的站点 就可以屏蔽它
这点同上
比如微信H5支付 也需要这个 就不知道他们做啥用了(hhh
关于Referer
丢失的问题 首先 referer 是由客户端的浏览器发送到服务器上,且在客户端可以通过document.referrer
来获取,也就是说referer的发送实际上是一个浏览器行为,发送与否的决定权是在浏览器手里。虽然这样说,但是HTTP协议对什么情况下,浏览器该发送,什么情况下不该发送有着严格的规定。
1.当网站使用refresh字段进行跳转的时候,大多数浏览器不发送referer
2.从用户从一个HTTPS的网站点击链接到另一个HTTP的网站时,不发送referer
3.html5中,a标签的rel = “noreferrer”, 可以让浏览器不发送referer
4.使用Data URI scheme链接的,浏览器也不发送referer
5.使用Content Security Policy, 也可以让浏览器不发送referer
6.在html头部中使用meta标签来控制不让浏览器发送referer
有时候需要在API项目中生成一些URL链接返回 但是服务器端已经配置了支持HTTPS,通过HTTPS访问的时候生成的URL仍然是HTTP
关于这个问题其实是服务器配置问题 和 下面类似
回到我遇到的微信支付问题 跟踪了一圈浏览器的跳转之后发现是属性第二种情况 从 HTTPS 站点跳到 HTTP 站点 丢失了 Referer【ps:反过来从HTTP到HTTPS是没问题的 不会丢失 Referer】 中间藏的比较深
当然我一开始没有发现这个问题 因为从前端请求到 API 整个都没有问题 全部项目已经全线部署了 HTTPS , Referer 信息也有携带 然后到最后一步微信的支付请求URL的时候 Referer 就丢失了.
后面发现在请求到API项目的时候 API项目返回了一个 URL 给前端 这个 URL 是后端代码根据规则生成的(Laravel 里的 action 辅助函数) 这个函数本身并没有什么问题 但是生成的URL链接 是 HTTP 了 又搞事情!!!
API项目配置的是 HTTPS 请求 但是生成的URL是 HTTP 问题就是这里了 请求运维哥协助 最后发现是 Nginx 反向代理中配置的问题
nginx服务器配置片段如下:
location / { proxy_pass http://114.114.114.114:80; }
可以看到 proxy_pass 参数 指向的是 HTTP的协议 所以在 后台获取的 URL 都是HTTP协议的
把代理这设置成https://114.114.114.114:443;
HTTP Referer는header
헤더에 대한HTTP
요청입니다. 정보 브라우저가 웹 서버에 요청을 보낼 때 일반적으로 서버는 내가 링크하고 있는 페이지가 무엇인지 알려주기 위해 리퍼러를 가져옵니다. 그러면 서버는 처리를 위한 일부 정보를 얻을 수 있습니다.예를 들어Chrome
브라우저의 콘솔에서Referer
가 있는요청 헤더
rrreee에서 다음과 유사한 정보를 볼 수 있습니다. 이 속성에는
document.referrer
를 통해 이를 얻을 수 있습니다. 리퍼러의 전송은 실제로 브라우저 동작이며, 이를 전송할지 여부에 대한 결정은 브라우저의 손에 있다고 알려져 있지만 HTTP 프로토콜은 브라우저가 이를 언제 전송해야 하는지에 대해 엄격한 규정을 두고 있습니다.
https://114.114.114.114:443으로 설정합니다. ;
그러면 문제가 해결됩니다. 권장사항: "WeChat 개발 튜토리얼"
위 내용은 추천인 누락 문제 요약(WeChat H5 결제)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!