php解析xml報(bào)文的方法是DOMDocument:
目前創(chuàng)新互聯(lián)公司已為成百上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、甘德網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
解析方法如下:
$xmlstring = XML
?xml version='1.0'?
document
cmd attr='default'login/cmd
loginimdonkey/login
/document
XML;
$dom = new DOMDocument();
$dom-loadXML($xmlstring);
print_r(getArray($dom-documentElement));
function getArray($node) {
$array = false;
if ($node-hasAttributes()) {
foreach ($node-attributes as $attr) {
$array[$attr-nodeName] = $attr-nodeValue;
}
}
if ($node-hasChildNodes()) {
if ($node-childNodes-length == 1) {
$array[$node-firstChild-nodeName] = getArray($node-firstChild);
} else {
foreach ($node-childNodes as $childNode) {
if ($childNode-nodeType != XML_TEXT_NODE) {
$array[$childNode-nodeName][] = getArray($childNode);
}
}
}
} else {
return $node-nodeValue;
}
return $array;
}
一丶?PHP后臺(tái)后臺(tái)生成預(yù)支付交易單,返回正確的預(yù)支付交易回話標(biāo)識(shí)后再在APP里面調(diào)起支付!官方文檔:
根據(jù)文檔拼接微信需要的參數(shù),這里需要幾個(gè)方法,直接上代碼!
傳輸給微信的參數(shù)要組裝成xml格式發(fā)送,傳如參數(shù)數(shù)組!
public?function?ToXml($data=array())
{
if(!is_array($data)?||?count($data)?=?0)
{
return?'數(shù)組異常';
}
$xml?=?"";
foreach?($data?as?$key=$val)
{
if?(is_numeric($val)){
$xml.="".$key."".$val."";
}else{
$xml.="".$key."";
}
}
$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ù)見微信文檔:;index=2
public?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']?=?'';?接收支付后的通知,必須為能直接訪問的網(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?=?"";
//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ù)詳見微信文檔:;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?'';exit();
}
}
//支付失敗,輸出錯(cuò)誤信息
else{
$file?=?fopen('./log.txt',?'a+');
fwrite($file,"錯(cuò)誤信息:".$data['return_msg'].date("Y-m-d?H:i:s"),time()."\r\n");????
}
}
else{
$file?=?fopen('./log.txt',?'a+');
fwrite($file,"錯(cuò)誤信息:簽名驗(yàn)證失敗".date("Y-m-d?H:i:s"),time()."\r\n");????
}
}
在這里,微信APP支付流程就成功走完了!謝謝支持!
---------------------
$data?=?file_get_contents("php://input");
$result_xml?=?xml_parser_create();
xml_parse_into_struct($result_xml,?$data,?$vals,?$index);
xml_parser_free($result_xml);
foreach(?$vals?as?$k)
{
if(strtolower($k['tag'])!='xml')$result_array[strtolower($k['tag'])]?=?$k['value'];
}
//$result_array?就是通知xml數(shù)據(jù)轉(zhuǎn)換來的數(shù)組,接下來就簡(jiǎn)單了,
//需要哪個(gè)數(shù)據(jù)就去$result_array數(shù)組里面找,然后根據(jù)字段值進(jìn)行具體的處理。
分享標(biāo)題:php接收微信xml數(shù)據(jù) php讀取xml接口數(shù)據(jù)
文章出自:http://jinyejixie.com/article38/ddichpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、定制開發(fā)、網(wǎng)站導(dǎo)航、網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)