首頁 微信小程式 微信開發 ThinkPHP實作微信支付(jsapi支付)

ThinkPHP實作微信支付(jsapi支付)

Jun 07, 2018 pm 03:52 PM
tp5 支付

這篇文章主要介紹了ThinkPHP實作微信支付(jsapi支付)流程教程詳解,需要的朋友可以參考下

之前寫過一篇文章講了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,&#39;5.3.0&#39;,&#39;<&#39;)) die(&#39;require PHP > 5.3.0 !&#39;); 
// $_GET[&#39;m&#39;]=&#39;Admin&#39;; 
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false 
define(&#39;APP_DEBUG&#39;,True); 
//指定模块控制器和方法 
$_GET[&#39;m&#39;]=&#39;WexinApi&#39;; 
$_GET[&#39;c&#39;]=&#39;WeixinPay&#39;; 
$_GET[&#39;a&#39;]=&#39;notify&#39;; 
// 定义应用目录 
define(&#39;APP_PATH&#39;,&#39;./Application/&#39;); 
define("APP_ROOT",dirname(__FILE__)); 
// 引入ThinkPHP入口文件 
require &#39;./ThinkCore/ThinkCore.php&#39;; 
// 亲^_^ 后面不需要任何代码了 就是如此简单
登入後複製

現在訪問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 = &#39;&#39;; 
 $jsApiParameters = wxpay($openId,&#39;江南极客&#39;,$order_sn,1); 
 $this->assign(array( 
  &#39;data&#39; => $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( 
   &#39;getBrandWCPayRequest&#39;, data, 
   function(res){ 
    WeixinJSBridge.log(res.err_msg); 
    //alert(&#39;err_code:&#39;+res.err_code+&#39;err_desc:&#39;+res.err_desc+&#39;err_msg:&#39;+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(&#39;WeixinJSBridgeReady&#39;, jsApiCall, false); 
   }else if (document.attachEvent){ 
    document.attachEvent(&#39;WeixinJSBridgeReady&#39;, jsApiCall); 
    document.attachEvent(&#39;onWeixinJSBridgeReady&#39;, 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/> 
 <p 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> 
 </p> 
</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],這樣就可以了。

(3)支援成功回呼

現在付款完成,就會進入到先前寫好的連結對應的方法,也就是[  http:// serverName/payment.php/WexinApi/WeixinPay/notify]:

//微信支付回调验证 
public function notify(){ 
 $xml = $GLOBALS[&#39;HTTP_RAW_POST_DATA&#39;]; 
 // 这句file_put_contents是用来查看服务器返回的XML数据 测试完可以删除了 
 file_put_contents(&#39;./Api/wxpay/logs/log.txt&#39;,$xml,FILE_APPEND); 
 //将服务器返回的XML数据转化为数组 
 //$data = json_decode(json_encode(simplexml_load_string($xml,&#39;SimpleXMLElement&#39;,LIBXML_NOCDATA)),true); 
 $data = xmlToArray($xml); 
 // 保存微信服务器返回的签名sign 
 $data_sign = $data[&#39;sign&#39;]; 
 // sign不参与签名算法 
 unset($data[&#39;sign&#39;]); 
 $sign = $this->makeSign($data); 
 // 判断签名是否正确 判断支付状态 
 if ( ($sign===$data_sign) && ($data[&#39;return_code&#39;]==&#39;SUCCESS&#39;) && ($data[&#39;result_code&#39;]==&#39;SUCCESS&#39;) ) { 
  $result = $data; 
  // 这句file_put_contents是用来查看服务器返回的XML数据 测试完可以删除了 
  file_put_contents(&#39;./Api/wxpay/logs/log1.txt&#39;,$xml,FILE_APPEND); 
  //获取服务器返回的数据 
  $order_sn = $data[&#39;out_trade_no&#39;]; //订单单号 
  $order_id = $data[&#39;attach&#39;];  //附加参数,选择传递订单ID 
  $openid = $data[&#39;openid&#39;];   //付款人openID 
  $total_fee = $data[&#39;total_fee&#39;]; //付款金额 
  //更新数据库 
  $this->updateDB($order_id,$order_sn,$openid,$total_fee); 
 }else{ 
  $result = false; 
 } 
 // 返回状态给微信服务器 
 if ($result) { 
  $str=&#39;<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>&#39;; 
 }else{ 
  $str=&#39;<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>&#39;; 
 } 
 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)

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

php服务端集成支付宝APP支付

基于thinkPHP实现的微信自定义分享功能


以上是ThinkPHP實作微信支付(jsapi支付)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

百度地圖搭計程車如何支付 搭計程車的付款步驟介紹 百度地圖搭計程車如何支付 搭計程車的付款步驟介紹 Mar 13, 2024 am 10:04 AM

百度地圖APP現在已經都成為了超多用戶們首選的出行導航的軟體,那麼這裡的一些功能全面,都能夠免費的讓大家進行選擇操作哦,解決自己日常出行方面會遇到的一些問題,完全都能夠查詢到自己的一些出行的路線,規劃自己的一些出行的方案,查詢完對應的這一些路線,都能根據自己的需求,選擇合適的一些出行方式,那麼你們不管是選擇一些公共交通,騎行,步行或是搭計程車等,都能滿足你們的,有著對應的一些導航路線,成功的帶領你們去往某地,那麼大家選擇打車的話,都能感到更加的方便,超多的一些司機們都是會在線上接單,搭計程車變得超級

uniapp應用程式如何實現支付與訂單管理 uniapp應用程式如何實現支付與訂單管理 Oct 19, 2023 am 10:37 AM

uniapp是一個跨平台的應用程式開發框架,可以同時開發小程式、App和H5。在uniapp應用程式中,實現支付和訂單管理是非常常見的需求。本文將介紹如何在uniapp應用中實現支付功能和訂單管理,並給出具體的程式碼範例。一、實現支付功能支付功能是實現線上交易的關鍵,通常需要整合第三方支付平台的SDK。以下是uniapp中實現支付功能的具體步驟:註冊並取得第三方支付平

使用PHP和PayPal API進行支付 使用PHP和PayPal API進行支付 Jun 19, 2023 pm 04:13 PM

隨著網路交易的日益普及,支付方式也逐漸多樣化,其中PayPal作為一種廣泛使用的支付方法備受歡迎。如果您想在您的網站或應用程式上使用PayPal來處理交易,那麼您可以使用PHP和PayPalAPI來輕鬆完成付款流程。 PayPalAPI是一組程式設計接口,用於與PayPal進行互動。透過API,您可以接收來自PayPal的通知、查詢最新的交易資訊、發起付款

武漢坐公車用什麼支付 武漢坐公車用什麼支付 Oct 13, 2022 pm 02:17 PM

武漢坐公車的支付方式:1、現金支付,需要提前準備好足額的零錢,直接把錢投入投幣口即可;2、武漢通刷卡,武漢通全稱武漢城市一卡通,是一種集成電路卡,又稱晶片卡;3、支付寶電子公車卡,在支付寶內先領取一張武漢電子公車卡,然後上車時直接掃描二維碼扣款上車即可;4、微信乘車碼支付,打開微信「乘車碼」小程序,開通武漢「乘車碼」就可以直接掃描二維碼扣款上車。

建立MySQL中買菜系統的訂單支付表 建立MySQL中買菜系統的訂單支付表 Nov 01, 2023 pm 03:48 PM

建立MySQL中買菜系統的訂單支付表,需要具體程式碼範例隨著網路的發展,購物變得越來越方便。在購物的過程中,訂單支付是購物過程中的重要環節。買菜系統不僅需要有訂單產生功能,還必須擁有完整的支付流程,因為支付成功才能算完成一單交易。本文將講述如何建立MySQL中買菜系統的訂單支付表,並提供具體的程式碼範例。一、訂單支付表設計買菜系統中訂單支付表儲存的是訂單

美團外送極速支付怎麼關閉 美團外送極速支付怎麼關閉 Mar 27, 2024 am 10:41 AM

在快節奏的現代生活中,美團外送以其便利的服務和豐富的選擇,深受廣大消費者的喜愛。其中,極速支付功能更是為用戶帶來了極大的便利,一鍵即可完成支付,省去了繁瑣的輸入步驟。不過很多用戶不喜歡不經確認直接付款,所以想關閉這項功能。那麼究竟該如何關閉美團外送的極速支付呢?在下文中本站小編將為大家帶來詳細的步驟設定教程,希望能幫助大家! 1.在手機桌面點選「美團外帶」捷徑圖示。 2.登入手機美團外送app,點選右下角「我的」。 3.在我的介面,點選「進入錢包」。 4.在美團皮夾介面,點選右上角「設定」圖

paynow支付是什麼意思 paynow支付是什麼意思 Sep 30, 2022 am 11:01 AM

PayNow支付是一種電子轉賬類服務,用戶能夠透過收款方指定的手機號碼、身分證/FIN號、UEN號或PayNow二維碼,直接向該收款方發起即時新幣轉賬,而無須對方銀行帳號資料。

美團立減金在哪開啟支付時預設抵扣_美團立減金開啟支付時預設抵扣教程 美團立減金在哪開啟支付時預設抵扣_美團立減金開啟支付時預設抵扣教程 Mar 28, 2024 am 11:00 AM

1.先開啟【美團】APP,在底部導覽列內,點選【我的】按鈕。 2.接著點選【我的錢包】功能鈕,點選【現金券】按鈕。 3.隨後在頂部功能列內,點【立減金】按鈕,點選開啟【支付時預設抵扣】的開關按鈕,即可開啟成功。

See all articles