佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > ThinkPHP框架下微信支付功能總結(jié)踩坑筆記

ThinkPHP框架下微信支付功能總結(jié)踩坑筆記

熱門(mén)標(biāo)簽:服務(wù)器配置 科大訊飛語(yǔ)音識(shí)別系統(tǒng) 阿里云 銀行業(yè)務(wù) 團(tuán)購(gòu)網(wǎng)站 Mysql連接數(shù)設(shè)置 Linux服務(wù)器 電子圍欄

本文實(shí)例講述了ThinkPHP框架下微信支付功能總結(jié)。分享給大家供大家參考,具體如下:

摘要

  • 此文主要為個(gè)人解決 ThinkPHP3.2.3 下微信支付所遇到的一些坑的解決方案,僅供參考
  • 詳情請(qǐng)參考 原文 : 微信公眾平臺(tái)開(kāi)發(fā)教程之ThinkPHP框架下微信支付功能

踩坑記錄

為便于參考,此處附錄部分 weixinpay.class代碼截圖

①. 驗(yàn)證不嚴(yán)謹(jǐn),損失教訓(xùn)

  • 補(bǔ)充時(shí)間:【2017-01-02】
  • 情況描述

【我尊重你,但不認(rèn)同你】
  恰逢元旦期間,遭到微信支付被大牛攻破的情況,損失近 80k,好在公司并沒(méi)有追究,畢竟一直在趕時(shí)間,測(cè)試不全面(壓根沒(méi)測(cè)試人員),慶幸的的對(duì)方 24小時(shí)未收款,基本全部退還
  問(wèn)題集中在驗(yàn)證不足的紅包發(fā)放上,不屬于我的編碼范圍,分析后,明白一點(diǎn),盡全力不要使用前端的數(shù)據(jù)提交,需要進(jìn)行后端的數(shù)據(jù)判斷,考慮盡量多的情況。

②. “total_fee” 參數(shù)報(bào)錯(cuò)

  • 補(bǔ)充時(shí)間:【2017-02-05】
  • 情況描述

 今天發(fā)現(xiàn)一種情況,如果打開(kāi)微信支付密碼的界面后,未支付而從待付款進(jìn)行再支付,會(huì)有時(shí)候報(bào)錯(cuò)一個(gè)“total_fee” 參數(shù)報(bào)錯(cuò),找到一種解決方法,即將 “out_trade_no” 以時(shí)間戳來(lái)重新配置,個(gè)人猜測(cè)或許是因?yàn)橐淮沃Ц段赐瓿珊笠驗(yàn)槟撤N原因限制再付款 …

代碼參考如下:

$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(),// 訂單號(hào)(需要根據(jù)自己的業(yè)務(wù)修改)
  'product_id'=>'1',// 商品id(需要根據(jù)自己的業(yè)務(wù)修改)
  'trade_type'=>'JSAPI',// JSAPI公眾號(hào)支付
  'openid'=>$openid// 獲取到的openid
);

③. 批量支付問(wèn)題

  • 補(bǔ)充時(shí)間:【2017-02-08】
  • 情況描述

  今天在做批量支付時(shí)發(fā)現(xiàn),會(huì)有 total_fee 報(bào)錯(cuò)
  個(gè)人最初簡(jiǎn)單的想法是將所有待支付的批量訂單拼接為 state 參數(shù)傳入微信,然后再進(jìn)入 notify() 方法中進(jìn)行分離整理,此時(shí)發(fā)現(xiàn)微信有參數(shù)長(zhǎng)度的限制,大概最多 50 個(gè)字符 ,不可以無(wú)限制的拼接
  后來(lái)的解決方案是進(jìn)行新訂單的創(chuàng)建,由此新訂單號(hào)去查詢(xún)關(guān)聯(lián)的其他批量訂單信息,并且已完成需求

④. 回調(diào)函數(shù)的注意

  • 情況描述

  注意該路徑必須要與配置文件中的回調(diào)路徑一致,此回調(diào)函數(shù),是根據(jù)微信是否真正完成支付后的數(shù)據(jù)更新鏈接,一般在此處進(jìn)行訂單狀態(tài)的修改
  先前發(fā)現(xiàn),因?yàn)槲⑿欧?wù)的設(shè)計(jì),會(huì)多次回調(diào) notify() 以判斷是否真正的支付成功,而簡(jiǎn)單的 update 操作是無(wú)法檢測(cè)的,為了同自己的平臺(tái)相關(guān)聯(lián),同理需要進(jìn)行狀態(tài)的判斷,否則不可避免的會(huì)多次執(zhí)行 notify() 中的邏輯處理

注意:

1. 比如,我在此處異步執(zhí)行的是將訂單號(hào)的支付狀態(tài)參數(shù)由 0 置為 1,判斷如果是已支付訂單,則不再執(zhí)行后續(xù)更新邏輯.
2. 個(gè)人測(cè)試發(fā)現(xiàn),此處 session 和 cookie 的設(shè)置都失效,僅做參考

⑤. D() 方法失效問(wèn)題

  • 補(bǔ)充時(shí)間:【2017-02-09】
  • 情況描述

  今天發(fā)現(xiàn),當(dāng)在微信完成支付后進(jìn)行的回調(diào)中,針對(duì)于 ThinkPHP 框架里的 D() 方法是無(wú)法執(zhí)行的,測(cè)試發(fā)現(xiàn)同樣的代碼不是這樣微信回調(diào)就可以執(zhí)行,畢竟之前記得是沒(méi)有問(wèn)題的
  此時(shí)考慮的解決方法是使用 model 的實(shí)例化 new 方法進(jìn)行曲線(xiàn)優(yōu)化,發(fā)現(xiàn)可行…

⑤. 鬼知道是什么情況

  • 補(bǔ)充時(shí)間:【2017-05-02】
  • 情況描述

   這兩天再次進(jìn)行代碼的迭代,根據(jù)自己之前的印象繼續(xù)折騰微信支付,發(fā)現(xiàn)這可真真的是個(gè)坑,我認(rèn)為剛開(kāi)通微信支付的服務(wù)號(hào)很有可能不滿(mǎn)足某些代碼開(kāi)發(fā)需求,配置完成的數(shù)據(jù),半天都不能接收到正確的反饋
  待到第二天再準(zhǔn)備繼續(xù)攻克時(shí)發(fā)現(xiàn),未動(dòng)的代碼又實(shí)現(xiàn)了需求
  舉個(gè)例子:
  前一天回調(diào)的路徑放在 M 模塊下怎么都不執(zhí)行,手賤參考以前的回調(diào)路徑放到 Home下就可以了,首先排除低級(jí)的個(gè)人代碼問(wèn)題,因?yàn)榈诙鞜o(wú)聊又改回去了 M,竟然又好了…

補(bǔ)充一部分測(cè)試的代碼:

/**
 * 微信支付監(jiān)聽(tīng)接口 判斷是否完成了微信支付操作
 */
public function notify(){
  // ↓↓↓下面的file_put_contents是用來(lái)簡(jiǎn)單查看異步發(fā)過(guò)來(lái)的數(shù)據(jù) 測(cè)試完可以刪除;↓↓↓
  // 獲取xml
  /*$xml=file_get_contents('php://input', 'r');
  //轉(zhuǎn)成php數(shù)組 禁止引用外部xml實(shí)體
  libxml_disable_entity_loader(true);
  $data= json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA));
  file_put_contents('.notify.log', $data);*/
  // ↑↑↑上面的file_put_contents是用來(lái)簡(jiǎn)單查看異步發(fā)過(guò)來(lái)的數(shù)據(jù) 測(cè)試完可以刪除;↑↑↑
  // 導(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 進(jìn)行頁(yè)面跳轉(zhuǎn)
  }
}

⑥. ThinkPHP 跨模塊調(diào)用方法失效問(wèn)題

  • 補(bǔ)充時(shí)間:【2017-05-03】
  • 情況描述

  有種情況的出現(xiàn)是,同樣的代碼在實(shí)際支付回調(diào)的函數(shù)中不執(zhí)行,然而自己做了個(gè)測(cè)試路徑傳入固定訂單號(hào)發(fā)現(xiàn)執(zhí)行順利,前提是所處環(huán)境完全一致(都在線(xiàn)上進(jìn)行),就如同上次使用D()方法測(cè)試可以執(zhí)行,放在實(shí)際的微信回調(diào)后就打死也不執(zhí)行
  而這次吸取了教訓(xùn),使用的 new model 實(shí)例化方法,因?yàn)槠渲械囊粋€(gè) model 類(lèi)在初始化時(shí)調(diào)用了部分?jǐn)?shù)據(jù),結(jié)果微信支付回調(diào)時(shí)卡在實(shí)例化這行代碼上,雖然測(cè)試的代碼是沒(méi)問(wèn)題的,自己也說(shuō)不清楚,鬼知道到底是怎么回事
  不過(guò)發(fā)現(xiàn) A() 跨模塊方法還是可以用的,至少現(xiàn)在是可行的…
后期發(fā)現(xiàn)如下的類(lèi)似方法也能執(zhí)行

//TODO 獲取對(duì)應(yīng)訂單的交易價(jià)
$cartPayController = new \M\Controller\CartpayController();
$order_amount = $cartPayController->wxPayOrder($out_trade_no,0);

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《PHP微信開(kāi)發(fā)技巧匯總》、《php curl用法總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《php字符串(string)用法總結(jié)》、《PHP中json格式數(shù)據(jù)操作技巧匯總》及《PHP針對(duì)XML文件操作技巧總結(jié)》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • PHP遠(yuǎn)程連接oracle數(shù)據(jù)庫(kù)操作實(shí)現(xiàn)方法圖文詳解
  • ThinkPHP5.0框架使用build 自動(dòng)生成模塊操作示例
  • PHP生成隨機(jī)碼的思路與方法實(shí)例探索
  • PHP實(shí)現(xiàn)網(wǎng)站應(yīng)用微信登錄功能詳解
  • PHP之認(rèn)識(shí)(二)關(guān)于Traits的用法詳解
  • 微信公眾平臺(tái)開(kāi)發(fā)教程④ ThinkPHP框架下微信支付功能圖文詳解
  • 微信公眾平臺(tái)開(kāi)發(fā)教程③ PHP實(shí)現(xiàn)微信公眾號(hào)支付功能圖文詳解
  • ThinkPHP框架實(shí)現(xiàn)的微信支付接口開(kāi)發(fā)完整示例
  • 在Ubuntu 18.04上安裝PHP 7.3 7.2和7.0的方法
  • PHP中str_split()函數(shù)的用法講解

標(biāo)簽:大理 衢州 棗莊 廣元 衡水 蚌埠 萍鄉(xiāng) 江蘇

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ThinkPHP框架下微信支付功能總結(jié)踩坑筆記》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話(huà)咨詢(xún)

    • 400-1100-266
    都匀市| 石河子市| 罗定市| 礼泉县| 平遥县| 昌平区| 遂川县| 青铜峡市| 西华县| 忻州市| 固镇县| 西乌| 长岛县| 宝鸡市| 十堰市| 毕节市| 海口市| 安塞县| 同仁县| 沈丘县| 柳江县| 南召县| 梓潼县| 云霄县| 大田县| 清苑县| 武威市| 安阳市| 太仓市| 肃宁县| 沙坪坝区| 遂溪县| 乾安县| 茶陵县| 肃南| 抚州市| 延安市| 邯郸市| 方正县| 大方县| 伊宁市|