版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】ThinkPHP如何實(shí)現(xiàn)微信支付
這篇文章給大家分享的是有關(guān)ThinkPHP如何實(shí)現(xiàn)微信支付的內(nèi)容。在下覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨在下過來看看吧。TP中集成微信支付的流程:1.SDK下載和修改這個(gè)就不過多講了,不知道的可以看看我的上一篇文章:PHP實(shí)現(xiàn)微信支付(jsapi支付)流程,里邊詳細(xì)詳述了下載下來的文件哪些是需要修改的。2.公眾號(hào)設(shè)置A.還是需要設(shè)置網(wǎng)頁(yè)授權(quán)域名,這個(gè)沒啥特殊的;B.這里要注意一下支付授權(quán)目錄,使用TP很多人都使用的是重寫模式(REWRITE模式)或者在使用REWRITE模式的同時(shí),使用偽靜態(tài)模式,這時(shí)候生成的鏈接為:http://serverName/Home/Blog/read/id/1;如果使用的是PATHINFO模式的話,生成的鏈接就是:http://serverName/index.php/Home/Blog/read/id/1,比如在Home模塊下的Blog控制器中的某個(gè)方法進(jìn)行支付,我們支付的授權(quán)目錄應(yīng)該是http://serverName/Home/Blog/或者h(yuǎn)ttp://serverName/index.php/Home/Blog/,這個(gè)根據(jù)自己的TP的設(shè)置的URL模式而定。3.支付流程(1)統(tǒng)一下單下單的支付參數(shù)配置,這個(gè)跟上一篇講的基本不變,重點(diǎn)注意的是支付回調(diào)驗(yàn)證鏈接,因?yàn)橐啻握{(diào)用,我就直接在Application/Common/Common/function.php中將參數(shù)配置封裝起來了,我的SDK放在項(xiàng)目根目錄下的Api目錄下,所以引入SDK的時(shí)候不是使用Vendor函數(shù)。/**
*
微信支付
*
@param
string
$openId
openid
*
@param
string
$goods
商品名稱
*
@param
string
$attach
附加參數(shù),我們可以選擇傳遞一個(gè)參數(shù),比如訂單ID
*
@param
string
$order_sn
訂單號(hào)
*
@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);
//訂單號(hào)
$input->SetTotal_fee($total_fee);
//支付金額,單位:分
$input->SetTime_start(date("YmdHis"));
//支付發(fā)起時(shí)間
$input->SetTime_expire(date("YmdHis",
time()
+
600));//支付超時(shí)
$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)證的,如果你自己訪問那個(gè)鏈接,還需要登錄注冊(cè)驗(yàn)證的,就不要嘗試了,必須要可以無(wú)障礙訪問的鏈接,而且也不要有一連串的參數(shù)傳遞。最好就是簡(jiǎn)單粗暴的http://serverName/xxx.php,我在跟目錄下,類似于index.php,重新寫了一個(gè)專門的供支付回調(diào)的入口文件payment.php,和它對(duì)應(yīng)的Application/目錄下的模塊(WexinApi)、控制器(WeixinPay)及方法(notify)://
檢測(cè)PHP環(huán)境
if(version_compare(PHP_VERSION,'5.3.0','<'))
die('require
PHP
>
5.3.0
!');
//
$_GET['m']='Admin';
//
開啟調(diào)試模式
建議開發(fā)階段開啟
部署階段注釋或者設(shè)為false
define('APP_DEBUG',True);
//指定模塊控制器和方法
$_GET['m']='WexinApi';
$_GET['c']='WeixinPay';
$_GET['a']='notify';
//
定義應(yīng)用目錄
define('APP_PATH','./Application/');
define("APP_ROOT",dirname(__FILE__));
//
引入ThinkPHP入口文件
require
'./ThinkCore/ThinkCore.php';
//
親^_^
后面不需要任何代碼了
就是如此簡(jiǎn)單現(xiàn)在訪問http://serverName/payment.php,就會(huì)直接進(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ā)起支付照樣很簡(jiǎn)單:/**
*
支付測(cè)試
*
微信訪問:/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>小尤支付測(cè)試</title>
<script
type="text/javascript">
//調(diào)用微信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="/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/>
<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>不過支付頁(yè)面的URL要注意了,因?yàn)橹Ц俄?yè)面的URL肯定帶有不少參數(shù),剛才說了TP中使用的REWRITE模式,你的鏈接為類似[
http://serverName/Home/Blog/read/id/1]這樣的,可能帶有更多參數(shù),這時(shí)候微信支付會(huì)認(rèn)為你的支付授權(quán)目錄是[
http://serverName/Home/Blog/read/id/],但是你真實(shí)的授權(quán)目錄是[
http://serverName/Home/Blog/],所以就會(huì)報(bào)錯(cuò)。處理方法就是,在進(jìn)入支付頁(yè)面的時(shí)候,重構(gòu)URL,寫成普通模式,即為[
http://serverName/Home/Blog/read?id=1],這樣就可以了。(3)支持成功回調(diào)現(xiàn)在支付完成,就會(huì)進(jìn)入到之前寫好的鏈接對(duì)應(yīng)的方法,即[
http://serverName/payment.php/WexinApi/WeixinPay/notify]://微信支付回調(diào)驗(yàn)證
public
function
notify(){
$xml
=
$GLOBALS['HTTP_RAW_POST_DATA'];
//
這句file_put_contents是用來查看服務(wù)器返回的XML數(shù)據(jù)
測(cè)試完可以刪除了
file_put_contents('./Api/wxpay/logs/log.txt',$xml,FILE_APPEND);
//將服務(wù)器返回的XML數(shù)據(jù)轉(zhuǎn)化為數(shù)組
//$data
=
json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),true);
$data
=
xmlToArray($xml);
//
保存微信服務(wù)器返回的簽名sign
$data_sign
=
$data['sign'];
//
sign不參與簽名算法
unset($data['sign']);
$sign
=
$this->makeSign($data);
//
判斷簽名是否正確
判斷支付狀態(tài)
if
(
($sign===$data_sign)
&&
($data['return_code']=='SUCCESS')
&&
($data['result_code']=='SUCCESS')
)
{
$result
=
$data;
//
這句file_put_contents是用來查看服務(wù)器返回的XML數(shù)據(jù)
測(cè)試完可以刪除了
file_put_contents('./Api/wxpay/logs/log1.txt',$xml,FILE_APPEND);
//獲取服務(wù)器返回的數(shù)據(jù)
$order_sn
=
$data['out_trade_no'];
//訂單單號(hào)
$order_id
=
$data['attach'];
//附加參數(shù),選擇傳遞訂單ID
$openid
=
$data['openid'];
//付款人openID
$total_fee
=
$data['total_fee'];
//付款金額
//更新數(shù)據(jù)庫(kù)
$this->updateDB($order_id,$order_sn,$openid,$total_fee);
}else{
$result
=
false;
}
//
返回狀態(tài)給微信服務(wù)器
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;
r
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45176-2024綠色產(chǎn)品評(píng)價(jià)商用制冷器具
- racemic-Biotin-sulfoxide-生命科學(xué)試劑-MCE-2914
- 2α-Mannobiose-生命科學(xué)試劑-MCE-5577
- 二零二五年度商標(biāo)同授權(quán)與品牌授權(quán)管理服務(wù)協(xié)議
- 2025年度職工食堂承包協(xié)議書(含員工餐飲服務(wù)品牌建設(shè))
- 2025年度體育賽事營(yíng)銷合作二零二五年度協(xié)議書
- 2025年度白酒企業(yè)人才培訓(xùn)與行業(yè)交流合作協(xié)議
- 二零二五年度股東清算與資產(chǎn)清算評(píng)估協(xié)議
- 二零二五年度炊事員臨時(shí)聘用合同執(zhí)行與監(jiān)督規(guī)范
- 2025年度房地產(chǎn)貸款擔(dān)保合同模板二零二五年度版
- 人教版高一數(shù)學(xué)上冊(cè)期末考試試卷及答案
- 安全學(xué)原理第2版-ppt課件(完整版)
- 傾聽是一種美德
- 《水上加油站安全與防污染技術(shù)要求》J
- 統(tǒng)編版三年級(jí)語(yǔ)文下冊(cè)第三單元《綜合性學(xué)習(xí):中華傳統(tǒng)節(jié)日》教案
- EN50317-2002-鐵路應(yīng)用集電系統(tǒng)受電弓和接觸網(wǎng)的動(dòng)力交互
- 項(xiàng)目部組織機(jī)構(gòu)框圖(共2頁(yè))
- 機(jī)動(dòng)車登記證書
- 彈性力學(xué)第十一章彈性力學(xué)的變分原理
- 鉭鈮礦開采項(xiàng)目可行性研究報(bào)告寫作范文
- 小升初數(shù)學(xué)銜接班優(yōu)秀課件
評(píng)論
0/150
提交評(píng)論