亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

ThinkPHP實現微信支付(jsapi支付)流程教程詳解

2024-05-05 00:02:41
字體:
來源:轉載
供稿:網友

之前寫過一篇文章講了PHP實現微信支付(jsapi支付)流程 ,詳見文章:PHP實現微信支付(jsapi支付)流程。

當時的環境是沒有使用框架的,直接在一個域名指向的目錄下邊新建目錄之后訪問該目錄實現的,但應用到框架中,還是有一些問題,在ThinkPHP中,由于路由規則與支付授權目錄有出入,所以會報錯。本篇講講在TP中集成微信支付的流程。

鵝廠出的SDK和文檔,就是讓你看不懂,使勁繞,這酸爽用了就知道。文檔和SDK不是應該越簡單通俗易懂越好么?難道只有使勁重構才能顯示出鵝廠程序猿技術的高超咩?額...是不是暴露了我菜鳥的屬性...其實SDK蠻好用,只是上一篇文章中也看到了,在支付完成回調函數中,著實讓人繞的暈頭轉向。

對于不想被官方繞的,想在TP中使用微信支付的可以看看一個大神自己根據官方文檔重構精簡打造而成的適用于TP的支付SDK,源碼我下載下來看過了,代碼寫的很優雅簡介,流程也很簡單,通俗易懂。詳見博文:http://baijunyao.com/article/78

我自己還是皺著眉頭,使用了官方的SDK,也成功實現了支付,下面跟大家分享一下流程:

1.SDK下載和修改

這個就不過多講了,不知道的可以看看我的上一篇文章:PHP實現微信支付(jsapi支付)流程,里邊詳細詳述了下載下來的文件哪些是需要修改的。

2.公眾號設置

A. 還是需要設置網頁授權域名,這個沒啥特殊的;

B. 這里要注意一下支付授權目錄,使用TP很多人都使用的是重寫模式(REWRITE模式)或者在使用REWRITE模式的同時,使用偽靜態模式,這時候生成的鏈接為: http://serverName/Home/Blog/read/id/1 ;

如果使用的是PATHINFO模式的話,生成的鏈接就是:http://serverName/index.php/Home/Blog/read/id/1,比如在Home模塊下的Blog控制器中的某個方法進行支付,我們支付的授權目錄應該是 http://serverName/Home/Blog/ 或者 http://serverName/index.php/Home/Blog/,這個根據自己的TP的設置的URL模式而定。

3.支付流程

(1)統一下單

下單的支付參數配置,這個跟上一篇講的基本不變,重點注意的是支付回調驗證鏈接,因為要多次調用,我就直接在Application/Common/Common/function.php中將參數配置封裝起來了,我的SDK放在項目根目錄下的Api目錄下,所以引入SDK的時候不是使用Vendor函數。

/**  * 微信支付  * @param string $openId  openid  * @param string $goods  商品名稱  * @param string $attach  附加參數,我們可以選擇傳遞一個參數,比如訂單ID  * @param string $order_sn 訂單號  * @param string $total_fee 金額  */ function wxpay($openId,$goods,$order_sn,$total_fee,$attach){  require_once APP_ROOT."/Api/wxpay/lib/WxPay.Api.php";  require_once APP_ROOT."/Api/wxpay/payment/WxPay.JsApiPay.php";  require_once APP_ROOT.'/Api/wxpay/payment/log.php';  //初始化日志  $logHandler= new CLogFileHandler(APP_ROOT."/Api/wxpay/logs/".date('Y-m-d').'.log');  $log = Log::Init($logHandler, 15);  $tools = new JsApiPay();  if(empty($openId)) $openId = $tools->GetOpenid();  $input = new WxPayUnifiedOrder();  $input->SetBody($goods);     //商品名稱  $input->SetAttach($attach);     //附加參數,可填可不填,填寫的話,里邊字符串不能出現空格  $input->SetOut_trade_no($order_sn);   //訂單號  $input->SetTotal_fee($total_fee);   //支付金額,單位:分  $input->SetTime_start(date("YmdHis"));  //支付發起時間  $input->SetTime_expire(date("YmdHis", time() + 600));//支付超時  $input->SetGoods_tag("test3");  //$input->SetNotify_url("http://".$_SERVER['HTTP_HOST']."/payment.php"); //支付回調驗證地址  $input->SetNotify_url("http://".$_SERVER['HTTP_HOST']."/payment.php/WexinApi/WeixinPay/notify");  $input->SetTrade_type("JSAPI");    //支付類型  $input->SetOpenid($openId);     //用戶openID  $order = WxPayApi::unifiedOrder($input); //統一下單  $jsApiParameters = $tools->GetJsApiParameters($order);  return $jsApiParameters; } 

注意,注意,敲黑板劃重點了:

支付回調驗證鏈接,必須是沒有權限驗證的,如果你自己訪問那個鏈接,還需要登錄注冊驗證的,就不要嘗試了,必須要可以無障礙訪問的鏈接,而且也不要有一連串的參數傳遞。

最好就是簡單粗暴的 http://serverName/xxx.php ,我在跟目錄下,類似于index.php,重新寫了一個專門的供支付回調的入口文件payment.php,和它對應的Application/目錄下的模塊(WexinApi)、控制器(WeixinPay)及方法(notify):

// 檢測PHP環境 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); // $_GET['m']='Admin'; // 開啟調試模式 建議開發階段開啟 部署階段注釋或者設為false define('APP_DEBUG',True); //指定模塊控制器和方法 $_GET['m']='WexinApi'; $_GET['c']='WeixinPay'; $_GET['a']='notify'; // 定義應用目錄 define('APP_PATH','./Application/'); define("APP_ROOT",dirname(__FILE__)); // 引入ThinkPHP入口文件 require './ThinkCore/ThinkCore.php'; // 親^_^ 后面不需要任何代碼了 就是如此簡單 

現在訪問 http://serverName/payment.php ,就會直接進入到  http://serverName/payment.php/WexinApi/WeixinPay/notify ,這樣回調驗證鏈接可以寫  http://serverName/payment.php ,也可以寫 http://serverName/payment.php/WexinApi/WeixinPay/notify 。

(2)發起支付

照樣很簡單:

/** * 支付測試 * 微信訪問:http://daoshi.sdxiaochengxu.com/payment.php/WexinApi/WeixinPay/pay */ public function pay(){  $order_sn = getrand_num(true);  $openId = '';  $jsApiParameters = wxpay($openId,'江南極客',$order_sn,1);  $this->assign(array(   'data' => $jsApiParameters  ));  $this->display(); } <html> <head>  <meta http-equiv="content-type" content="text/html;charset=utf-8"/>  <meta name="viewport" content="width=device-width, initial-scale=1"/>  <title>小尤支付測試</title>  <script type="text/javascript">  //調用微信JS api 支付  function jsApiCall()  {   var data={$data};   WeixinJSBridge.invoke(    'getBrandWCPayRequest', data,    function(res){     WeixinJSBridge.log(res.err_msg);     //alert('err_code:'+res.err_code+'err_desc:'+res.err_desc+'err_msg:'+res.err_msg);     //alert(res.err_code+res.err_desc+res.err_msg);     //alert(res);     if(res.err_msg == "get_brand_wcpay_request:ok"){      alert("支付成功!");      window.location.href="http://m.blog.csdn.net/article/details?id=72765676" rel="external nofollow" ;     }else if(res.err_msg == "get_brand_wcpay_request:cancel"){      alert("用戶取消支付!");     }else{      alert("支付失敗!");     }    }   );  }  function callpay()  {   if (typeof WeixinJSBridge == "undefined"){    if( document.addEventListener ){     document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);    }else if (document.attachEvent){     document.attachEvent('WeixinJSBridgeReady', jsApiCall);     document.attachEvent('onWeixinJSBridgeReady', jsApiCall);    }   }else{    jsApiCall();   }  }  </script> </head> <body>  <br/>  <font color="#9ACD32"><b>該筆訂單支付金額為<span style="color:#f00;font-size:50px">1分</span>錢</b></font><br/><br/>  <font color="#9ACD32"><b><span style="color:#f00;font-size:50px;margin-left:40%;">1分</span>錢也是愛</b></font><br/><br/>  <div align="center">   <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >果斷買買買^_^</button>  </div> </body> </html> 

不過支付頁面的URL要注意了,因為支付頁面的URL肯定帶有不少參數,剛才說了TP中使用的REWRITE模式,你的鏈接為類似[  http://serverName/Home/Blog/read/id/1 ]這樣的,可能帶有更多參數,這時候微信支付會認為你的支付授權目錄是[  http://serverName/Home/Blog/read/id/ ],但是你真實的授權目錄是[  http://serverName/Home/Blog/],所以就會報錯。處理方法就是,在進入支付頁面的時候,重構URL,寫成普通模式,即為[  http://serverName/Home/Blog/read?id=1],這樣就可以了。

ThinkPHP,微信jsapi,支付,微信jsapi支付

(3)支持成功回調

現在支付完成,就會進入到之前寫好的鏈接對應的方法,即[  http://serverName/payment.php/WexinApi/WeixinPay/notify]:

//微信支付回調驗證 public function notify(){  $xml = $GLOBALS['HTTP_RAW_POST_DATA'];  // 這句file_put_contents是用來查看服務器返回的XML數據 測試完可以刪除了  file_put_contents('./Api/wxpay/logs/log.txt',$xml,FILE_APPEND);  //將服務器返回的XML數據轉化為數組  //$data = json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),true);  $data = xmlToArray($xml);  // 保存微信服務器返回的簽名sign  $data_sign = $data['sign'];  // sign不參與簽名算法  unset($data['sign']);  $sign = $this->makeSign($data);  // 判斷簽名是否正確 判斷支付狀態  if ( ($sign===$data_sign) && ($data['return_code']=='SUCCESS') && ($data['result_code']=='SUCCESS') ) {   $result = $data;   // 這句file_put_contents是用來查看服務器返回的XML數據 測試完可以刪除了   file_put_contents('./Api/wxpay/logs/log1.txt',$xml,FILE_APPEND);   //獲取服務器返回的數據   $order_sn = $data['out_trade_no']; //訂單單號   $order_id = $data['attach'];  //附加參數,選擇傳遞訂單ID   $openid = $data['openid'];   //付款人openID   $total_fee = $data['total_fee']; //付款金額   //更新數據庫   $this->updateDB($order_id,$order_sn,$openid,$total_fee);  }else{   $result = false;  }  // 返回狀態給微信服務器  if ($result) {   $str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';  }else{   $str='<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[簽名失敗]]></return_msg></xml>';  }  echo $str;  return $result; } 

為了安全起見,對返回過來的簽名,要重新驗證:

/** * 生成簽名 * @return 簽名,本函數不覆蓋sign成員變量 */ protected function makeSign($data){  //獲取微信支付秘鑰  require_once APP_ROOT."/Api/wxpay/lib/WxPay.Api.php";  $key = /WxPayConfig::KEY;  // 去空  $data=array_filter($data);  //簽名步驟一:按字典序排序參數  ksort($data);  $string_a=http_build_query($data);  $string_a=urldecode($string_a);  //簽名步驟二:在string后加入KEY  //$config=$this->config;  $string_sign_temp=$string_a."&key=".$key;  //簽名步驟三:MD5加密  $sign = md5($string_sign_temp);  // 簽名步驟四:所有字符轉為大寫  $result=strtoupper($sign);  return $result; } 

至此,TP中微信支付也就搞定了。這是集成了官方的SDK實現的,如果不使用SDK,可以使用更簡單的方法,見:PHP實現微信支付(jsapi支付)和退款(無需集成支付SDK)

ThinkPHP,微信jsapi,支付,微信jsapi支付

總結

以上所述是小編給大家介紹的ThinkPHP實現微信支付(jsapi支付)流程教程詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲午夜av久久乱码| 色老头一区二区三区在线观看| 欧美与黑人午夜性猛交久久久| 精品久久久精品| 久久久久久久久91| 日韩欧美在线视频观看| 91嫩草在线视频| 亚洲字幕在线观看| 欧美福利在线观看| 国产精品jvid在线观看蜜臀| 精品国偷自产在线视频| 国产午夜一区二区| 欧美人与物videos| 色视频www在线播放国产成人| 国产精品亚洲网站| 日本欧美黄网站| 欧美激情中文网| 久久久中文字幕| 最好看的2019的中文字幕视频| 成人福利网站在线观看| 国产精品视频午夜| 亚洲福利视频二区| 日韩欧美精品网址| 亚洲欧美在线免费观看| 精品视频久久久久久久| 亚洲精品久久久久中文字幕欢迎你| 4438全国成人免费| 国产成人av在线| 国产精品自产拍高潮在线观看| 国产精品中文字幕在线| 欧美成年人视频网站欧美| 欧美日韩精品在线视频| 亚洲精品动漫久久久久| 久99九色视频在线观看| 一区二区日韩精品| 亚洲性夜色噜噜噜7777| 欧美精品www在线观看| 91久久在线视频| 欧美精品在线免费播放| 亚洲国产精品电影在线观看| 伊人伊成久久人综合网站| 日韩av综合中文字幕| 欧美激情精品久久久久久大尺度| 欧美亚洲日本黄色| 亚洲大胆人体av| 国产精品激情av在线播放| 久久精品视频导航| 91亚洲精品在线观看| 久久全国免费视频| 欧美精品福利视频| 国产精品国模在线| 日本不卡免费高清视频| 97香蕉超级碰碰久久免费的优势| 日本久久久a级免费| 91老司机精品视频| 96pao国产成视频永久免费| 久久综合九色九九| 亚洲综合国产精品| 色先锋资源久久综合5566| 国产精品成人品| 国产精品免费一区| 91网在线免费观看| 欧美黑人巨大xxx极品| 91免费精品视频| 欧美福利小视频| 日韩一区二区三区xxxx| 国产精品久久久久影院日本| 97久久精品人人澡人人爽缅北| 久久久久久久一| 欧美日韩免费网站| 精品久久久久久中文字幕一区奶水| www.欧美三级电影.com| 性夜试看影院91社区| 亚洲欧美成人一区二区在线电影| 91视频国产一区| 黄色一区二区三区| 久久久亚洲国产天美传媒修理工| 日韩精品视频中文在线观看| 国产精品一区二区性色av| 国产美女精彩久久| 久久全球大尺度高清视频| 国产日韩专区在线| 青草青草久热精品视频在线网站| 97免费在线视频| 久久久久久久国产精品视频| 91超碰caoporn97人人| 国产免费观看久久黄| 国产ts一区二区| 国产视频福利一区| 国产免费一区二区三区香蕉精| 国产亚洲精品久久久久久777| 91高潮精品免费porn| 日韩在线视频免费观看高清中文| 欧美成人一区在线| 欧美亚洲国产视频| 亚洲国产欧美一区二区丝袜黑人| 欧美黑人性视频| 久久天天躁日日躁| 日韩美女av在线免费观看| 日韩网站免费观看高清| 亚洲激情小视频| 亚洲欧美日韩一区二区三区在线| 欧美成人在线影院| 中文字幕一区二区三区电影| 国色天香2019中文字幕在线观看| 亚洲新中文字幕| 国产精品久久久久一区二区| 亚洲午夜精品久久久久久性色| 国产在线观看精品一区二区三区| 欧美激情一区二区三区高清视频| 欧美麻豆久久久久久中文| 97avcom| 国产精品久久久久久亚洲影视| 这里只有精品丝袜| 乱亲女秽乱长久久久| 91中文字幕在线| 久久精品99久久久久久久久| 日韩精品视频在线| 国产成+人+综合+亚洲欧美丁香花| 欧美精品第一页在线播放| 国产精品美女视频网站| 久久久极品av| 亚洲福利视频免费观看| 亚洲摸下面视频| 久久免费成人精品视频| 在线观看亚洲区| 欧美成aaa人片在线观看蜜臀| 国产这里只有精品| 欧美日韩免费观看中文| 国产精品福利久久久| 欧美日韩国产一区中文午夜| 久久精品国产亚洲精品2020| 欧美有码在线观看| 国产日韩av在线| 国产午夜精品一区理论片飘花| 91av在线影院| 国内精品伊人久久| 国产精品久久婷婷六月丁香| 78色国产精品| 中文在线资源观看视频网站免费不卡| 日韩成人av一区| 欧美片一区二区三区| 亚洲香蕉成人av网站在线观看| 97视频在线观看播放| 91免费看视频.| 国产精品免费一区豆花| 日韩精品高清在线| 国产免费一区二区三区香蕉精| 91a在线视频| 中文字幕在线视频日韩| 欧美激情欧美激情在线五月| 日产精品久久久一区二区福利| 国产一区二区黑人欧美xxxx| 亚洲免费精彩视频| 国产一区二区美女视频| 欧美日韩在线另类| 国产精品a久久久久久| 日韩av在线不卡| 欧美做受高潮1| 亚洲综合在线小说| 在线播放精品一区二区三区| 国产成人久久久精品一区| 国内外成人免费激情在线视频网站| 日韩网站免费观看高清|