ThinkPHP框架下微信支付功能總結(jié)踩坑筆記
本文實例講述了ThinkPHP框架下微信支付功能總結(jié)。分享給大家供大家參考,具體如下:
摘要
- 此文主要為個人解決 ThinkPHP3.2.3 下微信支付所遇到的一些坑的解決方案,僅供參考
- 詳情請參考 原文 : 微信公眾平臺開發(fā)教程之ThinkPHP框架下微信支付功能
踩坑記錄
為便于參考,此處附錄部分 weixinpay.class代碼截圖
①. 驗證不嚴(yán)謹(jǐn),損失教訓(xùn)
- 補充時間:【2017-01-02】
- 情況描述
【我尊重你,但不認(rèn)同你】
恰逢元旦期間,遭到微信支付被大牛攻破的情況,損失近 80k,好在公司并沒有追究,畢竟一直在趕時間,測試不全面(壓根沒測試人員),慶幸的的對方 24小時未收款,基本全部退還
問題集中在驗證不足的紅包發(fā)放上,不屬于我的編碼范圍,分析后,明白一點,盡全力不要使用前端的數(shù)據(jù)提交,需要進行后端的數(shù)據(jù)判斷,考慮盡量多的情況。
②. “total_fee” 參數(shù)報錯
- 補充時間:【2017-02-05】
- 情況描述
今天發(fā)現(xiàn)一種情況,如果打開微信支付密碼的界面后,未支付而從待付款進行再支付,會有時候報錯一個“total_fee” 參數(shù)報錯,找到一種解決方法,即將 “out_trade_no” 以時間戳來重新配置,個人猜測或許是因為一次支付未完成后因為某種原因限制再付款 …
代碼參考如下:
$total_fee = floatval($order_amount)*100; $order=array( 'body'=>'testMsg',// 商品描述(需要根據(jù)自己的業(yè)務(wù)修改) 'total_fee'=>$total_fee,// 訂單金額 以(分)為單位(需要根據(jù)自己的業(yè)務(wù)修改) 'out_trade_no'=>$out_trade_no.'M'.time(),// 訂單號(需要根據(jù)自己的業(yè)務(wù)修改) 'product_id'=>'1',// 商品id(需要根據(jù)自己的業(yè)務(wù)修改) 'trade_type'=>'JSAPI',// JSAPI公眾號支付 'openid'=>$openid// 獲取到的openid );
③. 批量支付問題
- 補充時間:【2017-02-08】
- 情況描述
今天在做批量支付時發(fā)現(xiàn),會有 total_fee 報錯
個人最初簡單的想法是將所有待支付的批量訂單拼接為 state 參數(shù)傳入微信,然后再進入 notify() 方法中進行分離整理,此時發(fā)現(xiàn)微信有參數(shù)長度的限制,大概最多 50 個字符 ,不可以無限制的拼接
后來的解決方案是進行新訂單的創(chuàng)建,由此新訂單號去查詢關(guān)聯(lián)的其他批量訂單信息,并且已完成需求
④. 回調(diào)函數(shù)的注意
- 情況描述
注意該路徑必須要與配置文件中的回調(diào)路徑一致,此回調(diào)函數(shù),是根據(jù)微信是否真正完成支付后的數(shù)據(jù)更新鏈接,一般在此處進行訂單狀態(tài)的修改
先前發(fā)現(xiàn),因為微信服務(wù)的設(shè)計,會多次回調(diào) notify() 以判斷是否真正的支付成功,而簡單的 update 操作是無法檢測的,為了同自己的平臺相關(guān)聯(lián),同理需要進行狀態(tài)的判斷,否則不可避免的會多次執(zhí)行 notify() 中的邏輯處理
注意:
1. 比如,我在此處異步執(zhí)行的是將訂單號的支付狀態(tài)參數(shù)由 0 置為 1,判斷如果是已支付訂單,則不再執(zhí)行后續(xù)更新邏輯.
2. 個人測試發(fā)現(xiàn),此處 session 和 cookie 的設(shè)置都失效,僅做參考
⑤. D() 方法失效問題
- 補充時間:【2017-02-09】
- 情況描述
今天發(fā)現(xiàn),當(dāng)在微信完成支付后進行的回調(diào)中,針對于 ThinkPHP 框架里的 D() 方法是無法執(zhí)行的,測試發(fā)現(xiàn)同樣的代碼不是這樣微信回調(diào)就可以執(zhí)行,畢竟之前記得是沒有問題的
此時考慮的解決方法是使用 model 的實例化 new 方法進行曲線優(yōu)化,發(fā)現(xiàn)可行…
⑤. 鬼知道是什么情況
- 補充時間:【2017-05-02】
- 情況描述
這兩天再次進行代碼的迭代,根據(jù)自己之前的印象繼續(xù)折騰微信支付,發(fā)現(xiàn)這可真真的是個坑,我認(rèn)為剛開通微信支付的服務(wù)號很有可能不滿足某些代碼開發(fā)需求,配置完成的數(shù)據(jù),半天都不能接收到正確的反饋
待到第二天再準(zhǔn)備繼續(xù)攻克時發(fā)現(xiàn),未動的代碼又實現(xiàn)了需求
舉個例子:
前一天回調(diào)的路徑放在 M 模塊下怎么都不執(zhí)行,手賤參考以前的回調(diào)路徑放到 Home下就可以了,首先排除低級的個人代碼問題,因為第二天無聊又改回去了 M,竟然又好了…
補充一部分測試的代碼:
/** * 微信支付監(jiān)聽接口 判斷是否完成了微信支付操作 */ public function notify(){ // ↓↓↓下面的file_put_contents是用來簡單查看異步發(fā)過來的數(shù)據(jù) 測試完可以刪除;↓↓↓ // 獲取xml /*$xml=file_get_contents('php://input', 'r'); //轉(zhuǎn)成php數(shù)組 禁止引用外部xml實體 libxml_disable_entity_loader(true); $data= json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)); file_put_contents('.notify.log', $data);*/ // ↑↑↑上面的file_put_contents是用來簡單查看異步發(fā)過來的數(shù)據(jù) 測試完可以刪除;↑↑↑ // 導(dǎo)入微信支付sdk Vendor('Weixinpay.Weixinpay'); $wxpay=new \Weixinpay(); $result = $wxpay->notify(); if ($result) { $out_trade_no = explode('M',$result['out_trade_no'])[0] ; $this->toUpdatePayInfo($out_trade_no); //TODO 進行頁面跳轉(zhuǎn) } }
⑥. ThinkPHP 跨模塊調(diào)用方法失效問題
- 補充時間:【2017-05-03】
- 情況描述
有種情況的出現(xiàn)是,同樣的代碼在實際支付回調(diào)的函數(shù)中不執(zhí)行,然而自己做了個測試路徑傳入固定訂單號發(fā)現(xiàn)執(zhí)行順利,前提是所處環(huán)境完全一致(都在線上進行),就如同上次使用D()方法測試可以執(zhí)行,放在實際的微信回調(diào)后就打死也不執(zhí)行
而這次吸取了教訓(xùn),使用的 new model 實例化方法,因為其中的一個 model 類在初始化時調(diào)用了部分?jǐn)?shù)據(jù),結(jié)果微信支付回調(diào)時卡在實例化這行代碼上,雖然測試的代碼是沒問題的,自己也說不清楚,鬼知道到底是怎么回事
不過發(fā)現(xiàn) A() 跨模塊方法還是可以用的,至少現(xiàn)在是可行的…
后期發(fā)現(xiàn)如下的類似方法也能執(zhí)行
//TODO 獲取對應(yīng)訂單的交易價 $cartPayController = new \M\Controller\CartpayController(); $order_amount = $cartPayController->wxPayOrder($out_trade_no,0);
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP微信開發(fā)技巧匯總》、《php curl用法總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《php字符串(string)用法總結(jié)》、《PHP中json格式數(shù)據(jù)操作技巧匯總》及《PHP針對XML文件操作技巧總結(jié)》
希望本文所述對大家PHP程序設(shè)計有所幫助。
- PHP遠程連接oracle數(shù)據(jù)庫操作實現(xiàn)方法圖文詳解
- ThinkPHP5.0框架使用build 自動生成模塊操作示例
- PHP生成隨機碼的思路與方法實例探索
- PHP實現(xiàn)網(wǎng)站應(yīng)用微信登錄功能詳解
- PHP之認(rèn)識(二)關(guān)于Traits的用法詳解
- 微信公眾平臺開發(fā)教程④ ThinkPHP框架下微信支付功能圖文詳解
- 微信公眾平臺開發(fā)教程③ PHP實現(xiàn)微信公眾號支付功能圖文詳解
- ThinkPHP框架實現(xiàn)的微信支付接口開發(fā)完整示例
- 在Ubuntu 18.04上安裝PHP 7.3 7.2和7.0的方法
- PHP中str_split()函數(shù)的用法講解
相關(guān)文章
Yii框架在頁面輸出執(zhí)行sql語句以方便調(diào)試的實現(xiàn)方法
這篇文章主要介紹了Yii框架在頁面輸出執(zhí)行sql語句以方便調(diào)試的實現(xiàn)方法,涉及yiidebugtb的使用,是比較實用的技巧,需要的朋友可以參考下2014-12-12iOS自定義提示彈出框?qū)崿F(xiàn)類似UIAlertView的效果
最近在學(xué)習(xí)iOS開發(fā),在牛刀小試的時候發(fā)現(xiàn)系統(tǒng)的UIAlertView有點不喜歡,然后就自己自定義了一個UIAlertView,基本上實現(xiàn)了系統(tǒng)的UIAlertView,可以根據(jù)項目的需求修改UIAlertView的顏色。有需要的朋友們可以參考借鑒,也可以多多指導(dǎo),下面來一起看看吧。2016-11-11Chart.js在Laravel項目中的應(yīng)用示例
本篇文章主要介紹了Chart.js在Laravel項目中的應(yīng)用示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09Zend Framework框架的zend_cache緩存使用方法(zend框架)
這篇文章主要介紹了Zend_Cache文件緩存的基本操作,簡單的示例,,需要的朋友可以參考下2014-03-03ThinkPHP連接數(shù)據(jù)庫操作示例【基于DSN方式和數(shù)組傳參的方式】
這篇文章主要介紹了ThinkPHP連接數(shù)據(jù)庫操作,結(jié)合實例形式分析了thinkPHP基于DSN方式和數(shù)組傳參的方式進行數(shù)據(jù)庫連接的實現(xiàn)步驟與屬性設(shè)置、控制器、模板使用等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03CI框架中l(wèi)ibraries,helpers,hooks文件夾詳細說明
CodeIgniter 是一個小巧但功能強大的 PHP 框架,作為一個簡單而“優(yōu)雅”的工具包,它可以為 PHP 程序員建立功能完善的 Web 應(yīng)用程序。今天我們來看看CI框架中幾個文件夾都是干什么用的2014-06-06