【移動(dòng)應(yīng)用開發(fā)技術(shù)】ThinkPHP如何實(shí)現(xiàn)微信支付_第1頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】ThinkPHP如何實(shí)現(xiàn)微信支付_第2頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】ThinkPHP如何實(shí)現(xiàn)微信支付_第3頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】ThinkPHP如何實(shí)現(xiàn)微信支付_第4頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】ThinkPHP如何實(shí)現(xiàn)微信支付_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論