關於微信支付走過的坑

錯誤:未定義數組索引:openid 。經過檢查發現是 :微信支付授權獲取 openId {「errcode」:40163,「errmsg」:「code been used」,}

原因為:微信支付code 只能使用一次,當第二次重複使用時就會出現此錯誤。

WxPay.JsApiPay.php【這個應該是老版本的做法,或者說經過二次跳轉的做法】

邏輯為將獲取到的openid以code為名存入session;當再次請求時,查詢該次請求中以code為名的session是否存在,以此防止二次使用code。

public function GetOpenid()

{
//通過code獲得openid

if (!isset($_GET['code']) ){
//觸發微信返回code碼

$baseUrl = urlencode('//'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);

$url = $this->__CreateOauthUrlForCode($baseUrl);

Header("Location: $url");

exit();

} else {
//獲取code碼,以獲取openid

$code = $_GET['code'];

if(session("?$code")){
$openid = $this->getOpenidFromMp($code);

}else{
$openid= session($code);

}

session($code, $openid);// 為解決code been used

return $openid;

}

}

還有一種原因:

微信支付獲取用戶openid時,報出錯誤。原因是同時配置了http和https,微信網頁oauth認證通知了兩次

解決方法:

時都會重定向鏈接redirect_uri都會自動請求兩次,由於並發導致了一些問題,

那麼,為什麼會請求兩次呢?,調試時發現會訪問兩次,一次是301,頁面重定向了,第二次跟第一次就差這個參數。加上後,不再報錯。code 可以了。

//open.weixin.qq.com/connect/oauth2/authorize?appid=xxx&redirect_uri=xxx&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect

&connect_redirect=1 在WxPay.JsApiPay.php該位置加入這個參數

 

 其實到這,我依然沒解決問題,而此時,我突然想起來,get_open_id的http也是缺少s,所以我在此修改了http為https,結果成功了

 

 

Tags: