国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 微信小程序 微信開發(fā) ThinkPHP實(shí)現(xiàn)微信支付(jsapi支付)

ThinkPHP實(shí)現(xiàn)微信支付(jsapi支付)

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

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

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

當(dāng)時的環(huán)境是沒有使用框架的,直接在一個域名指向的目錄下邊新建目錄之后訪問該目錄實(shí)現(xiàn)的,但應(yīng)用到框架中,還是有一些問題,在ThinkPHP中,由于路由規(guī)則與支付授權(quán)目錄有出入,所以會報(bào)錯。本篇講講在TP中集成微信支付的流程。

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

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

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

1.SDK下載和修改

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

2.公眾號設(shè)置

A. 還是需要設(shè)置網(wǎng)頁授權(quán)域名,這個沒啥特殊的;

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

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

3.支付流程

(1)統(tǒng)一下單

下單的支付參數(shù)配置,這個跟上一篇講的基本不變,重點(diǎn)注意的是支付回調(diào)驗(yàn)證鏈接,因?yàn)橐啻握{(diào)用,我就直接在Application/Common/Common/function.php中將參數(shù)配置封裝起來了,我的SDK放在項(xiàng)目根目錄下的Api目錄下,所以引入SDK的時候不是使用Vendor函數(shù)。

/** 
 * 微信支付 
 * @param string $openId  openid 
 * @param string $goods  商品名稱 
 * @param string $attach  附加參數(shù),我們可以選擇傳遞一個參數(shù),比如訂單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);     //附加參數(shù),可填可不填,填寫的話,里邊字符串不能出現(xiàn)空格 
 $input->SetOut_trade_no($order_sn);   //訂單號 
 $input->SetTotal_fee($total_fee);   //支付金額,單位:分 
 $input->SetTime_start(date("YmdHis"));  //支付發(fā)起時間 
 $input->SetTime_expire(date("YmdHis", time() + 600));//支付超時 
 $input->SetGoods_tag("test3"); 
 //$input->SetNotify_url("http://".$_SERVER['HTTP_HOST']."/payment.php"); //支付回調(diào)驗(yàn)證地址 
 $input->SetNotify_url("http://".$_SERVER['HTTP_HOST']."/payment.php/WexinApi/WeixinPay/notify"); 
 $input->SetTrade_type("JSAPI");    //支付類型 
 $input->SetOpenid($openId);     //用戶openID 
 $order = WxPayApi::unifiedOrder($input); //統(tǒng)一下單 
 $jsApiParameters = $tools->GetJsApiParameters($order); 
 return $jsApiParameters; 
}

注意,注意,敲黑板劃重點(diǎn)了:

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

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

// 檢測PHP環(huán)境 
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;; 
// 開啟調(diào)試模式 建議開發(fā)階段開啟 部署階段注釋或者設(shè)為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;; 
// 定義應(yīng)用目錄 
define(&#39;APP_PATH&#39;,&#39;./Application/&#39;); 
define("APP_ROOT",dirname(__FILE__)); 
// 引入ThinkPHP入口文件 
require &#39;./ThinkCore/ThinkCore.php&#39;; 
// 親^_^ 后面不需要任何代碼了 就是如此簡單

現(xiàn)在訪問 http://serverName/payment.php ,就會直接進(jìn)入到 http://serverName/payment.php/WexinApi/WeixinPay/notify ,這樣回調(diào)驗(yàn)證鏈接可以寫 http://serverName/payment.php ,也可以寫 http://serverName/payment.php/WexinApi/WeixinPay/notify 。

(2)發(fā)起支付

照樣很簡單:

/** 
* 支付測試 
* 微信訪問: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"> 
 //調(diào)用微信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要注意了,因?yàn)橹Ц俄撁娴腢RL肯定帶有不少參數(shù),剛才說了TP中使用的REWRITE模式,你的鏈接為類似[ http://serverName/Home/Blog/read/id/1 ]這樣的,可能帶有更多參數(shù),這時候微信支付會認(rèn)為你的支付授權(quán)目錄是[ http://serverName/Home/Blog/read/id/ ],但是你真實(shí)的授權(quán)目錄是[ http://serverName/Home/Blog/],所以就會報(bào)錯。處理方法就是,在進(jìn)入支付頁面的時候,重構(gòu)URL,寫成普通模式,即為[ http://serverName/Home/Blog/read?id=1],這樣就可以了。

(3)支持成功回調(diào)

現(xiàn)在支付完成,就會進(jìn)入到之前寫好的鏈接對應(yīng)的方法,即[ http://serverName/payment.php/WexinApi/WeixinPay/notify]:

//微信支付回調(diào)驗(yàn)證 
public function notify(){ 
 $xml = $GLOBALS[&#39;HTTP_RAW_POST_DATA&#39;]; 
 // 這句file_put_contents是用來查看服務(wù)器返回的XML數(shù)據(jù) 測試完可以刪除了 
 file_put_contents(&#39;./Api/wxpay/logs/log.txt&#39;,$xml,FILE_APPEND); 
 //將服務(wù)器返回的XML數(shù)據(jù)轉(zhuǎn)化為數(shù)組 
 //$data = json_decode(json_encode(simplexml_load_string($xml,&#39;SimpleXMLElement&#39;,LIBXML_NOCDATA)),true); 
 $data = xmlToArray($xml); 
 // 保存微信服務(wù)器返回的簽名sign 
 $data_sign = $data[&#39;sign&#39;]; 
 // sign不參與簽名算法 
 unset($data[&#39;sign&#39;]); 
 $sign = $this->makeSign($data); 
 // 判斷簽名是否正確 判斷支付狀態(tài) 
 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是用來查看服務(wù)器返回的XML數(shù)據(jù) 測試完可以刪除了 
  file_put_contents(&#39;./Api/wxpay/logs/log1.txt&#39;,$xml,FILE_APPEND); 
  //獲取服務(wù)器返回的數(shù)據(jù) 
  $order_sn = $data[&#39;out_trade_no&#39;]; //訂單單號 
  $order_id = $data[&#39;attach&#39;];  //附加參數(shù),選擇傳遞訂單ID 
  $openid = $data[&#39;openid&#39;];   //付款人openID 
  $total_fee = $data[&#39;total_fee&#39;]; //付款金額 
  //更新數(shù)據(jù)庫 
  $this->updateDB($order_id,$order_sn,$openid,$total_fee); 
 }else{ 
  $result = false; 
 } 
 // 返回狀態(tài)給微信服務(wù)器 
 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; 
}

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

/** 
* 生成簽名 
* @return 簽名,本函數(shù)不覆蓋sign成員變量 
*/ 
protected function makeSign($data){ 
 //獲取微信支付秘鑰 
 require_once APP_ROOT."/Api/wxpay/lib/WxPay.Api.php"; 
 $key = \WxPayConfig::KEY; 
 // 去空 
 $data=array_filter($data); 
 //簽名步驟一:按字典序排序參數(shù) 
 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); 
 // 簽名步驟四:所有字符轉(zhuǎn)為大寫 
 $result=strtoupper($sign); 
 return $result; 
}

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,更多相關(guān)內(nèi)容請關(guān)注PHP中文網(wǎng)!

相關(guān)推薦:

php服務(wù)端集成支付寶APP支付

基于thinkPHP實(shí)現(xiàn)的微信自定義分享功能


以上是ThinkPHP實(shí)現(xiàn)微信支付(jsapi支付)的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

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

  百度地圖APP現(xiàn)在已經(jīng)都成為了超多用戶們首選的出行導(dǎo)航的軟件,那么這里的一些功能全面,都能夠免費(fèi)的讓大家進(jìn)行選擇操作哦,解決自己日常出行方面會遇到的一些問題,完全都能夠查詢到自己的一些出行的路線,規(guī)劃自己的一些出行的方案,查詢完對應(yīng)的這一些路線,都能根據(jù)自己的需求,選擇合適的一些出行方式,那么你們不管是選擇一些公共交通,騎行,步行或者是打車等,都能滿足你們的,有著對應(yīng)的一些導(dǎo)航路線,成功的帶領(lǐng)你們?nèi)ネ车兀敲创蠹疫x擇打車的話,都能感到更加的方便,超多的一些司機(jī)們都是會在線接單,打車變得超級

使用PHP和PayPal API進(jìn)行支付 使用PHP和PayPal API進(jìn)行支付 Jun 19, 2023 pm 04:13 PM

隨著網(wǎng)絡(luò)交易的日益普及,支付方式也在逐漸多樣化,其中PayPal作為一種廣泛使用的支付方法備受歡迎。如果您想在您的網(wǎng)站或應(yīng)用程序上使用PayPal來處理交易,那么您可以使用PHP和PayPalAPI來輕松地完成支付過程。PayPalAPI是一組編程接口,用于與PayPal進(jìn)行交互。通過API,您可以接收來自PayPal的通知、查詢最新的交易信息、發(fā)起付款

uniapp應(yīng)用如何實(shí)現(xiàn)支付和訂單管理 uniapp應(yīng)用如何實(shí)現(xiàn)支付和訂單管理 Oct 19, 2023 am 10:37 AM

uniapp是一個跨平臺的應(yīng)用開發(fā)框架,可以同時開發(fā)小程序、App和H5。在uniapp應(yīng)用中,實(shí)現(xiàn)支付和訂單管理是非常常見的需求。本文將介紹如何在uniapp應(yīng)用中實(shí)現(xiàn)支付功能和訂單管理,并給出具體的代碼示例。一、實(shí)現(xiàn)支付功能支付功能是實(shí)現(xiàn)在線交易的關(guān)鍵,通常需要集成第三方支付平臺的SDK。以下是uniapp中實(shí)現(xiàn)支付功能的具體步驟:注冊并獲取第三方支付平

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

建立MySQL中買菜系統(tǒng)的訂單支付表,需要具體代碼示例隨著互聯(lián)網(wǎng)的發(fā)展,購物已經(jīng)變得越來越方便。在購物的過程中,訂單支付是購物過程中的重要環(huán)節(jié)。買菜系統(tǒng)不僅需要有訂單生成功能,還必須擁有完整的支付流程,因?yàn)橹Ц冻晒Σ拍芩闶峭瓿梢粏谓灰住1疚膶⒅v述如何建立MySQL中買菜系統(tǒng)的訂單支付表,并提供具體的代碼示例。一、訂單支付表設(shè)計(jì)買菜系統(tǒng)中訂單支付表存儲的是訂單

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

武漢坐公交車的支付方式:1、現(xiàn)金支付,需要提前準(zhǔn)備好足額的零錢,直接把錢投入投幣口即可;2、武漢通刷卡,武漢通全稱武漢城市一卡通,是一種集成電路卡,也稱為芯片卡;3、支付寶電子公交卡,在支付寶內(nèi)先領(lǐng)取一張武漢電子公交卡,然后上車時直接掃描二維碼扣款上車即可;4、微信乘車碼支付,打開微信“乘車碼”小程序,開通武漢“乘車碼”就可以直接掃描二維碼扣款上車。

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

PayNow支付是一種電子轉(zhuǎn)賬類服務(wù),用戶能夠通過收款方指定的手機(jī)號碼、身份證/FIN號、UEN號或PayNow二維碼,直接向該收款方發(fā)起實(shí)時新幣轉(zhuǎn)賬,而無須對方銀行賬號信息。

美團(tuán)外賣極速支付怎么關(guān)閉 美團(tuán)外賣極速支付怎么關(guān)閉 Mar 27, 2024 am 10:41 AM

在快節(jié)奏的現(xiàn)代生活中,美團(tuán)外賣以其便捷的服務(wù)和豐富的選擇,深受廣大消費(fèi)者的喜愛。其中,極速支付功能更是為用戶帶來了極大的便利,一鍵即可完成支付,省去了繁瑣的輸入步驟。不過很多用戶并不喜歡不經(jīng)確認(rèn)直接付款,所以想要關(guān)閉這一功能。那么究竟該如何關(guān)閉美團(tuán)外賣的極速支付呢?在下文中本站小編就將為大家?guī)碓敿?xì)的步驟設(shè)置教程,希望能幫助到大家!1.在手機(jī)桌面點(diǎn)擊“美團(tuán)外賣”快捷方式圖標(biāo)。2.登錄手機(jī)美團(tuán)外賣app,點(diǎn)擊右下角“我的”。3.在我的界面,點(diǎn)擊“進(jìn)入錢包”。4.在美團(tuán)錢包界面,點(diǎn)擊右上角“設(shè)置”圖

支付系統(tǒng)行號是什么意思 支付系統(tǒng)行號是什么意思 Nov 17, 2022 pm 12:09 PM

支付系統(tǒng)行號是一個地方銀行的唯一識別標(biāo)志;支付系統(tǒng)行號就是一個編號,每個銀行網(wǎng)點(diǎn)都不一樣,區(qū)分的一個標(biāo)志,可以通過行號查詢到行名。銀行行號主要是用于跨區(qū)域支付結(jié)算業(yè)務(wù)中,行號由12位數(shù)字組成:3位銀行代碼+4位城市代碼+4位銀行編號+1位校驗(yàn)位。

See all articles