time:2017-03-10
問題:手機端訪問網頁沒問題,電腦端微信測試就會出現code過時狀況,致使服務器錯誤
錯誤狀況:php
只要出現上述申請訪問鏈接,點擊後code就會過時
code過時致使服務器報錯
問題緣由:json
客戶端以及微信方同時帶code請求服務器屢次,用戶真實請求時code已通過期
解決方法:緩存
萬金油解決方法,第一次經過code獲取到信息後就把code存入session中,短期內直接從session中獲取,再也不請求微信防止服務器報錯,下面的php代碼給用戶30秒緩存時間.服務器
session_start(); if(isset($_SESSION['user'])){ $time = time()-$_SESSION['session_time']; if($time>30){ unset($_SESSION['user']); unset($_SESSION['session_time']); } } if(isset($_SESSION['user'])){ $userinfo = $_SESSION['user']; }else{...}
分析請求頭找出用戶真是請求,加以排除.注意要有上述狀況的再嘗試此方法微信
if(!isset($_SERVER['HTTP_UPGRADE_INSECURE_REQUESTS'])){ if(!isset($_GET['nsukey'])||$_SERVER['HTTP_CONNECTION']=='close'){ die; } }
後面發現本身剛開始用.top域名訪問時候老是出現這個緣由,後期換成.com就不會讓申請跳轉直接進去落地頁了.多是微信設置緣由.session
下方闡述緣由以及排錯通過,無聊發泄,沒事幹的能夠看看
網頁寫好後,電腦版微信測試時候老是平白無故500報錯,找到報錯緣由就是code失效,一頭霧水,檢查本身代碼檢查了很久,最後手機端一看頁面好好的! 艹!
很明顯code是電腦版使用時候,在用戶訪問以前已經被用了,啥都不說了,先打開抓包工具看一看
微信開發
能夠看到我還沒點繼續訪問的時候,就已經有一個請求衝到個人服務器把code用掉啦!
在我點完以後多了一個請求過去,不過明顯已經晚了..code已經失效工具
如今找到緣由很明顯要區別哪一個是用戶真正的請求,分析下請求頭髮現後面訪問的url參數裏有有一個叫nsukey的參數,那就好辦了 有這個參數的再請求獲取code,沒有的直接退出唄,代碼上傳一試
測試
靠!繼續報錯!
目測還有別的請求也訪問了服務器,本地抓包沒抓到,八成是微信本身訪問的,怎麼辦呢?url
$file = fopen("HELLO.TXT",'a+'); $txt = json_encode($_SERVER); fwrite($file, "\n".$txt); fclose($file); die;
生氣了,只要有請求就把信息打印出來看看唄,寫好後在用電腦版試一試
打開hello.txt,乖乖!微信也請求了兩次!
再次分析信息,發現微信請求的HTTP_CONNECTION沒有開啓,如今就辦了
if(!isset($_GET['nsukey'])||$_SERVER['HTTP_CONNECTION']=='close'){ die; }
這兩種狀況屏蔽掉最後就是真是請求了唄,看着很完美,試一下也鏈接成功啦!
惋惜最重要的手機端試一下GG,沒辦法在用上面方法把手機端的也打印出來看看
發現手機端有一個獨特的HTTP_UPGRADE_INSECURE_REQUESTS
OK,那就再判斷下吧..
if(!isset($_SERVER['HTTP_UPGRADE_INSECURE_REQUESTS'])){ if(!isset($_GET['nsukey'])||$_SERVER['HTTP_CONNECTION']=='close'){ die; } }
坑爹的微信,本身設置code只有一次機會,本身還跑去請求那麼屢次.