这是我在开发android支付SDK的时候,涉及到封装支付宝无线充值遇到的一个问题,挺有趣的,发出来共享一下. 背景: 当通过手机支付成功后,支付宝会异步通知我们一个注册过的URL进行通知. 我们接收其传入参数,然后进行我们自己业务的逻辑处理. 直接上代码: 以下是
这是我在开发android支付SDK的时候,涉及到封装支付宝无线充值遇到的一个问题,挺有趣的,发出来共享一下.
背景:
当通过手机支付成功后,支付宝会异步通知我们一个注册过的URL进行通知. 我们接收其传入参数,然后进行我们自己业务的逻辑处理.
直接上代码:
以下是错误的代码…..大家猜猜echo的结果值和URL的结果值.
function getDataForXML($res_data,$node) { $xml = simplexml_load_string($res_data); $result = $xml->xpath($node); while(list( , $node) = each($result)) { return $node; } } //我只罗列了一个参数,实际的支付宝传入参数会很多,但结构都是这样的 $input = "<notify><out_trade_no>M2013012914195447849368424</out_trade_no><gmt_create>2013-01-29 14:20:11</gmt_create></notify>"; $test = getDataForXML($input,"/notify/out_trade_no"); echo $test."<br>"; $data = array( 'tradeNo'=>$test, ); $url = "http://blog.lizhigang.net/?".http_build_query($data); echo $url;
这段代码运行完毕后的结果:
M2013012914195447849368424 http://blog.lizhigang.net/?tradeNo%5B0%5D=M2013012914195447849368424
要好奇一下了,tradeNo是啥情况啊……..莫名奇妙多出来个[0]
出现这问题立马要想到tradeNo有可能不是字符串. ?这时候 ?var_dump一下看看咯…..
打印出来的结果:
object(SimpleXMLElement)[2]string 'M2013012914195447849368424' (length=26)
尼玛是个object…….. ? 剩下的比较简单了,各种方法都可以处理,最简单的呢 ? 赋值的时候强转string就行了……或者想做的更严谨,修改一下getDataForXML咯.
完工,备忘.
原文地址:PHP弱语言又坑爹了:SimpleXML组件解析返回值的双重身份, 感谢原作者分享。