鄙人用的是php的H5支付模式, 需要將交易類型改爲MWEB, 之前玩的好好的, 現在出問題了。騰訊官方文档上,只說你有誤, 也不告訴你爲啥有誤。逼著你細細品他們那屎糊的文档,大佬說的大意是, 這回又又又又又變了, 不許你傳127.0.0.1這種本地虛擬ip了, 讓你來個真的客戶耑ip。文档地址 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_5
說一千到一萬, 玩法改了, 以前調試的路子跑不通了, 筆者費了半天勁, 用了以下代碼來搞:
$notify = new NativePay(); $input = new WxPayUnifiedOrder(); $input->SetBody("test"); $input->SetAttach("test"); // 不能像以前一樣虛擬一個ip出來, 必須寫真實ip, 不然bug $input->SetSpbill_create_ip(getRealIp()); $input->SetOut_trade_no("sdkphp123456789" . date("YmdHis")); $input->SetTotal_fee("1"); $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetGoods_tag("test"); $input->SetNotify_url(" $input->SetTrade_type("MWEB"); $input->SetProduct_id("123456789"); $weixinpay_result = $notify->GetPayUrl($input);
打出來這個weixinpay_result變量, 統統都是好的。
並不給面子, 報錯。筆者項目中引用的getRealIp()函數長這樣:
/** * 讀取真實IP方法 */ function getRealIp(){ if ((bool) filter_var(_header('remote_addr'),FILTER_VALIDATE_IP,FILTER_FLAG_IPV4 |FILTER_FLAG_NO_PRIV_RANGE |FILTER_FLAG_NO_RES_RANGE)) { return _header('remote_addr'); } return false; }
平時100%能獲取到用戶ip, 斷點也打了,獲取的就是我的本機外網出口ip。
但是仍然不行,無論如何都是報一樣的錯。
解決方案: 查phpsdk庫
回頭看了一下phpsdk的庫, 發現WxPay.Api.php裡有這一行代碼
// --------------坑-------------- $inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']); //終耑ip
哦, 原來是這樣, 這是哪個控制欲強的大佬寫的代碼, 他們爲什麽不在sdk的demo裡寫, 而是藏在庫裡? 他們不知道現在已經不流行php-fpm模式了嘛, 趕快把這行注釋掉!
結果, 果然跑通了。