




下載本文檔
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年健身中心租賃合同及健身俱樂部會(huì)員制運(yùn)營(yíng)協(xié)議
- 二零二五年度村委會(huì)與某健身俱樂部簽訂場(chǎng)地租賃合同
- 2025年度船舶保險(xiǎn)代理股份合作協(xié)議
- 二零二五年度金融投資分析與風(fēng)險(xiǎn)管理商務(wù)咨詢服務(wù)協(xié)議
- 四川鑫耀產(chǎn)城融合產(chǎn)業(yè)投資發(fā)展集團(tuán)有限公司2024年12月對(duì)外公開招聘管理人員及專業(yè)工作人員筆試參考題庫(kù)附帶答案詳解
- 2025鄂爾多斯高新技術(shù)產(chǎn)業(yè)開發(fā)區(qū)市融媒體中心招聘控制數(shù)人員35人筆試參考題庫(kù)附帶答案詳解
- 2025福建龍巖市人力資源服務(wù)有限公司招聘6人筆試參考題庫(kù)附帶答案詳解
- 酒類釀制知識(shí)培訓(xùn)課件
- 交通中國(guó)知到智慧樹章節(jié)測(cè)試課后答案2024年秋上海工程技術(shù)大學(xué)
- 2025年云南中煙工業(yè)有限責(zé)任公司招聘(430人)筆試參考題庫(kù)附帶答案詳解
- 本特利探頭應(yīng)用
- 城市雕塑藝術(shù)工程工程量計(jì)價(jià)清單定額2022年版
- QMR-110-00員工手部、接觸面等微生物檢驗(yàn)記錄記錄
- 2022年河北醫(yī)科大學(xué)第一醫(yī)院醫(yī)護(hù)人員招聘考試筆試題庫(kù)及答案解析
- 思想道德與法治教案第四章:明確價(jià)值要求踐行價(jià)值準(zhǔn)則
- 寧騷版《公共政策學(xué)》課后答案
- 外陰及陰道炎癥
- (綜合治理)修復(fù)工程指南(試行) - 貴州省重金屬污染防治與土壤修復(fù)網(wǎng)
- 公安筆錄模板之詢問嫌疑人(書面?zhèn)鲉局伟舶讣?
- A-level項(xiàng)目介紹(課堂PPT)
- 故障診斷技術(shù)的國(guó)內(nèi)外發(fā)展現(xiàn)狀(共3頁)
評(píng)論
0/150
提交評(píng)論