【移動(dòng)應(yīng)用開發(fā)技術(shù)】如何通過PHP來實(shí)現(xiàn)APP微信支付_第1頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】如何通過PHP來實(shí)現(xiàn)APP微信支付_第2頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】如何通過PHP來實(shí)現(xiàn)APP微信支付_第3頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】如何通過PHP來實(shí)現(xiàn)APP微信支付_第4頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】如何通過PHP來實(shí)現(xiàn)APP微信支付_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余2頁可下載查看

下載本文檔

版權(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ù)】如何通過PHP來實(shí)現(xiàn)APP微信支付

這篇文章主要介紹了如何通過PHP來實(shí)現(xiàn)APP微信支付,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓在下帶著大家一起了解一下。一、PHP后臺(tái)后臺(tái)生成預(yù)支付交易單,返回正確的預(yù)支付交易回話標(biāo)識(shí)后再在APP里面調(diào)起支付!官方文檔:/wiki/doc/api/app/app.php?chapter=9_1根據(jù)文檔拼接微信需要的參數(shù),這里需要幾個(gè)方法,直接上代碼!傳輸給微信的參數(shù)要組裝成xml格式發(fā)送,傳如參數(shù)數(shù)組!public

function

ToXml($data=array())

{

if(!is_array($data)

||

count($data)

<=

0)

{

return

'數(shù)組異常';

}

$xml

=

"<xml>";

foreach

($data

as

$key=>$val)

{

if

(is_numeric($val)){

$xml.="<".$key.">".$val."</".$key.">";

}else{

$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";

}

}

$xml.="</xml>";

return

$xml;

}2.生成隨機(jī)字符串,微信所需參數(shù)!這里方法很多,看自己愛好都行!function

rand_code(){

$str

=

'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//62個(gè)字符

$str

=

str_shuffle($str);

$str

=

substr($str,0,32);

return

$str;

}3.這里是微信比較重要的一步了,這個(gè)方法會(huì)多次用到!生成簽名private

function

getSign($params)

{

ksort($params);

//將參數(shù)數(shù)組按照參數(shù)名ASCII碼從小到大排序

foreach

($params

as

$key

=>

$item)

{

if

(!empty($item))

{

//剔除參數(shù)值為空的參數(shù)

$newArr[]

=

$key.'='.$item;

//

整合新的參數(shù)數(shù)組

}

}

$stringA

=

implode("&",

$newArr);

//使用

&

符號(hào)連接參數(shù)

$stringSignTemp

=

$stringA."&key="."************************";

//拼接key

//

key是在商戶平臺(tái)API安全里自己設(shè)置的

$stringSignTemp

=

MD5($stringSignTemp);

//將字符串進(jìn)行MD5加密

$sign

=

strtoupper($stringSignTemp);

//將所有字符轉(zhuǎn)換為大寫

return

$sign;

}4.傳遞參數(shù)給微信,生成預(yù)支付訂單!接收微信返回的數(shù)據(jù),在反給APP端,APP端調(diào)用支付接口,完成支付!APP端所需參數(shù)見微信文檔:/wiki/doc/api/app/app.php?chapter=9_12&index=2public

function

wx_pay()

{

$nonce_str

=

$this->rand_code();

//調(diào)用隨機(jī)字符串生成方法獲取隨機(jī)字符串

$data['appid']

='wxdbc5dc*******';

//appid

$data['mch_id']

=

'1493*****'

;

//商戶號(hào)

$data['body']

=

"APP支付測(cè)試";

$data['spbill_create_ip']

=

$_SERVER['HTTP_HOST'];

//ip地址

$data['total_fee']

=

1;

//金額

$data['out_trade_no']

=

time().mt_rand(10000,99999);

//商戶訂單號(hào),不能重復(fù)

$data['nonce_str']

=

$nonce_str;

//隨機(jī)字符串

$data['notify_url']

=

'/wx_notify';

//回調(diào)地址,用戶接收支付后的通知,必須為能直接訪問的網(wǎng)址,不能跟參數(shù)

$data['trade_type']

=

'APP';

//支付方式

//將參與簽名的數(shù)據(jù)保存到數(shù)組

注意:以上幾個(gè)參數(shù)是追加到$data中的,$data中應(yīng)該同時(shí)包含開發(fā)文檔中要求必填的剔除sign以外的所有數(shù)據(jù)

$data['sign']

=

$this->getSign($data);

//獲取簽名

$xml

=

$this->ToXml($data);

//數(shù)組轉(zhuǎn)xml

//curl

傳遞給微信方

$url

=

"/pay/unifiedorder";

//header("Content-type:text/xml");

$ch

=

curl_init();

curl_setopt($ch,CURLOPT_URL,

$url);

if(stripos($url,"https://")!==FALSE){

curl_setopt($ch,

CURLOPT_SSLVERSION,

CURL_SSLVERSION_TLSv1);

curl_setopt($ch,

CURLOPT_SSL_VERIFYPEER,

FALSE);

curl_setopt($ch,

CURLOPT_SSL_VERIFYHOST,

FALSE);

}

else

{

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);

curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//嚴(yán)格校驗(yàn)

}

//設(shè)置header

curl_setopt($ch,

CURLOPT_SSLVERSION,

CURL_SSLVERSION_TLSv1);

curl_setopt($ch,

CURLOPT_HEADER,

FALSE);

//要求結(jié)果為字符串且輸出到屏幕上

curl_setopt($ch,

CURLOPT_RETURNTRANSFER,

TRUE);

//設(shè)置超時(shí)

curl_setopt($ch,

CURLOPT_TIMEOUT,

30);

curl_setopt($ch,

CURLOPT_POST,

TRUE);

//傳輸文件

curl_setopt($ch,

CURLOPT_POSTFIELDS,

$xml);

//運(yùn)行curl

$data

=

curl_exec($ch);

//返回結(jié)果

if($data){

curl_close($ch);

//返回成功,將xml數(shù)據(jù)轉(zhuǎn)換為數(shù)組.

$re

=

$this->FromXml($data);

if($re['return_code']

!=

'SUCCESS'){

json("201",'簽名失敗');

}

else{

//接收微信返回的數(shù)據(jù),傳給APP!

$arr

=array(

'prepayid'

=>$re['prepay_id'],

'appid'

=>

'wxdbc5dc*****',

'partnerid'

=>

'14937****',

'package'

=>

'Sign=WXPay',

'noncestr'

=>

$nonce_str,

'timestamp'

=>time(),

);

//第二次生成簽名

$sign

=

$this->getSign($arr);

$arr['sign']

=

$sign;

json('200','簽名成功',$arr);

}

}

else

{

$error

=

curl_errno($ch);

curl_close($ch);

json('201',"curl出錯(cuò),錯(cuò)誤碼:$error");

}

}5.將xml數(shù)據(jù)轉(zhuǎn)換為數(shù)組,接收微信返回?cái)?shù)據(jù)時(shí)用到.public

function

FromXml($xml)

{

if(!$xml){

echo

"xml數(shù)據(jù)異常!";

}

//將XML轉(zhuǎn)為array

//禁止引用外部xml實(shí)體

libxml_disable_entity_loader(true);

$data

=

json_decode(json_encode(simplexml_load_string($xml,

'SimpleXMLElement',

LIBXML_NOCDATA)),

true);

return

$data;

}二、APP支付成功后,會(huì)調(diào)用你填寫的回調(diào)地址.返回參數(shù)詳見微信文檔:/wiki/doc/api/app/app.php?chapter=9_7&index=3//

微信支付回調(diào)

function

wx_notify(){

//接收微信返回的數(shù)據(jù)數(shù)據(jù),返回的xml格式

$xmlData

=

file_get_contents('php://input');

//將xml格式轉(zhuǎn)換為數(shù)組

$data

=

$this->FromXml($xmlData);

//用日志記錄檢查數(shù)據(jù)是否接受成功,驗(yàn)證成功一次之后,可刪除。

$file

=

fopen('./log.txt',

'a+');

fwrite($file,var_export($data,true));

//為了防止假數(shù)據(jù),驗(yàn)證簽名是否和返回的一樣。

//記錄一下,返回回來的簽名,生成簽名的時(shí)候,必須剔除sign字段。

$sign

=

$data['sign'];

unset($data['sign']);

if($sign

==

$this->getSign($data)){

//簽名驗(yàn)證成功后,判斷返回微信返回的

if

($data['result_code']

==

'SUCCESS')

{

//根據(jù)返回的訂單號(hào)做業(yè)務(wù)邏輯

$arr

=

array(

'pay_status'

=>

1,

);

$re

=

M('order')->where(['order_sn'=>$data['out_trade_no']])->save($arr);

//處理完成之后,告訴微信成功結(jié)果!

if($re){

echo

'<xml>

<return_code><![CDATA[SUCCESS]]></return_code>

<return_msg><![CDATA[OK]]></return_msg>

</xml>';exit();

}

}

//支付失敗,輸出錯(cuò)誤信息

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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)論