Heim  >  Artikel  >  WeChat-Applet  >  Zusammenfassung des Problems fehlender Referrer (WeChat H5-Zahlung)

Zusammenfassung des Problems fehlender Referrer (WeChat H5-Zahlung)

藏色散人
藏色散人nach vorne
2021-08-16 11:29:524674Durchsuche

Kürzlich hat das Unternehmen die H5-Zahlung von WeChat beantragt. Die entsprechenden Zahlungsdokumente finden Sie hier: https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4. Nach dem Start der Zahlung Es wird weiterhin ein Fehler gemeldet. Das Format des Händlerparameters ist falsch. Bitte wenden Sie sich an den Händler, um das Problem zu beheben. Laut dem offiziellen WeChat-Dokument sollte die Fehlermeldung referer fehlen Nachdem ich es gefunden hatte, stellte ich fest, dass referer tatsächlich verloren ging. Dokumentieren Sie den Problemlösungsprozess. 商家参数格式有误,请联系商家解决 根据微信官方文档的错误提示 应该是 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 的作用

防盗链

比如你发现访问加载自己的资源 而 referer不是自己的站点 就可以屏蔽它

防止恶意请求

这点同上

高级用法

比如微信H5支付 也需要这个 就不知道他们做啥用了(hhh

Referer 丢失

关于 Referer 丢失的问题 首先 referer 是由客户端的浏览器发送到服务器上,且在客户端可以通过 document.referrer 来获取,也就是说referer的发送实际上是一个浏览器行为,发送与否的决定权是在浏览器手里。虽然这样说,但是HTTP协议对什么情况下,浏览器该发送,什么情况下不该发送有着严格的规定。

总结下 Referer 丢失的几种情况

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

自动生成URL链接HTTPS变HTTP

有时候需要在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;

Was ist Referer

HTTP-Referer ist die HTTP-Anfrage für den header-Header Informationen Wenn der Browser eine Anfrage an den Webserver sendet, bringt er normalerweise einen Referrer mit, um dem Server mitzuteilen, von welcher Seite ich verlinke, damit der Server einige Informationen zur Verarbeitung erhalten kann. Zum Beispiel können wir in der Konsole des Chrome-Browsers unter Request Headers ähnliche Informationen wie die folgenden sehen rrreeewo sich Referer befindet Diese Eigenschaft hat

🎜Die korrekte englische Schreibweise vonReferer istreferrer. Aufgrund von Rechtschreibfehlern in der frühen HTTP-Spezifikation war es ein Fehler, die Abwärtskompatibilität aufrechtzuerhalten🎜

🎜Die Rolle des Referers

🎜Anti-Hotlinking

🎜Wenn Sie beispielsweise feststellen, dass der Referrer nicht Ihre eigene Website ist, können Sie ihn blockieren🎜

🎜Böswillige Anfragen verhindern

🎜Dies ist das Gleiche wie oben🎜

🎜Erweiterte Verwendung

🎜Für Beispielsweise erfordert die WeChat H5-Zahlung dies auch. Wissen Sie, wofür sie verwendet werden (hhh🎜

🎜Referer ist verloren

🎜Über das Problem von Referer wird zunächst vom Browser des Clients an den Server gesendet, und der Client kann ihn über document.referrer abrufen. Das Senden des Referrs ist tatsächlich ein Browserverhalten, und die Entscheidung, ob es gesendet werden soll oder nicht, liegt in den Händen des Browsers. Obwohl es heißt, dass das HTTP-Protokoll strenge Vorschriften darüber hat, wann der Browser es senden soll und wann es nicht gesendet werden sollte. 🎜

🎜 Fassen Sie mehrere Situationen zusammen, in denen der Referrer verloren geht

🎜1 , die meisten Browser senden keinen Referrer🎜🎜2. Von einem Benutzer, der auf einen Link von einer HTTPS-Website zu einer anderen klickt. Bei einer HTTP-Website wird der Referrer nicht gesendet🎜🎜3. In .html5 ist das rel des a-Tags = „noreferrer“. " kann verhindern, dass der Browser den Referrer sendet🎜🎜4. Bei Links, die das Daten-URI-Schema verwenden, sendet der Browser den Referrer ebenfalls nicht🎜 🎜5. Verwenden Sie die Inhaltssicherheitsrichtlinie, um zu verhindern, dass der Browser Referrer sendet🎜🎜6. Verwenden Sie die Meta-Tag im HTML-Header, um zu steuern, dass der Browser keine Verweise senden darf🎜

🎜URL-Links von HTTPS zu HTTP automatisch generieren

🎜Manchmal ist das der Fall Es ist notwendig, einige URL-Links im API-Projekt zu generieren, um zurückzukehren, aber der Server wurde für die Unterstützung von HTTPS konfiguriert. Beim Zugriff über HTTPS ist die generierte URL immer noch HTTP🎜 🎜Bei diesem Problem handelt es sich tatsächlich um die Serverkonfiguration >. Das Problem ähnelt dem folgenden: 🎜🎜Um auf das WeChat-Zahlungsproblem zurückzukommen, habe ich nach dem Verfolgen einer Reihe von Browsersprüngen festgestellt, dass es sich um ein Attribut handelt, das von der HTTPS-Site stammt , die Site hat den Referrer verloren [ps: von HTTP zu HTTPS umgekehrt, es gibt kein Problem und der Referer geht nicht verloren] Er ist tief in der Mitte versteckt🎜🎜Natürlich habe ich dieses Problem zunächst nicht bemerkt, weil Es gab kein Problem von der Front-End-Anfrage bis zur API, und die Referrer-Informationen werden ebenfalls übertragen. Wenn jedoch im letzten Schritt die WeChat-Zahlungsanforderungs-URL erreicht wird, geht der Referrer verloren .🎜🎜 Später stellte ich fest, dass das API-Projekt beim Anfordern des API-Projekts eine URL an das Frontend zurückgegeben hat. Diese URL lautet: Der Back-End-Code wird gemäß den Regeln generiert (Aktionshilfsfunktion in Laravel). Diese Funktion selbst, aber der generierte URL-Link ist HTTP, was erneut Probleme verursacht! ! ! 🎜🎜Das API-Projekt ist mit HTTPS-Anfragen konfiguriert, aber die generierte URL ist HTTP. Ich habe den Betriebs- und Wartungsbruder um Hilfe gebeten und schließlich herausgefunden, dass es sich um ein Problem handelt, das im Nginx-Reverse-Proxy konfiguriert ist Das Serverkonfigurationsfragment lautet wie folgt: 🎜rrreee🎜Sie können sehen, dass die Parameter von „proxy_pass“ auf das HTTP-Protokoll verweisen, sodass die im Hintergrund erhaltenen URLs alle HTTP-Protokolle sind. Setzen Sie den Proxy auf https://114.114.114.114:443 ; und das Problem wird gelöst. Empfohlen: „🎜WeChat Development Tutorial🎜“                                                 

Das obige ist der detaillierte Inhalt vonZusammenfassung des Problems fehlender Referrer (WeChat H5-Zahlung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen