先贴请求代码
/*** 发送post请求* @param string $url 需要请求的地址* @return json $output 返回的json字符串*/
function postUrl($url, $data){$data = json_encode($data);$headerArray =array("Content-type:application/json;charset='utf-8'","Accept:application/json");$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $data);curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);$output = curl_exec($curl);return json_decode($output,true);
}
几乎所有接口均为https协议,所以加上这两句。这里就可以排除https协议下的返回空值情况。
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
因为此前对接了一个微信代理商平台,我一直使用json来处理的请求参数和返回结果,这没什么问题。当我再次对接微信官方接口时,返回一直为空。经过断点排查,最终锁定为格式问题。
说到这里就要建议一下各位PHPer,当不确定打印数据类型时,尽量使用var_dump进行打印。
从上图可以看到微信接口的返回值,聪明的小伙伴一眼就发现问题了。明明就两个22却有1035个字节,此时原格式输出就可查看到微信返回的结果。
此前我在方法外打印始终为空,是因为我做了json_decode操作,加上此前一直使用print_r在打印,竟然一时没排查出来,这都是坏习惯搞出来的破事儿啊。
最后附上修改后的代码,以及xml于PHP数组互转方法。
/*** 发送post请求* @param string $url 需要请求的地址* @return json $output 返回的json字符串*/
function postUrl($url, $data){$data = arrayToXml($data);$headerArray =array("Content-type:application/json;charset='utf-8'","Accept:application/json");$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $data);curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);$output = curl_exec($curl);return xmlToArray($output,true);
}/*** 数组转XML* @param string $arr 数组* @return xml $output 返回的xml数据*/
function arrayToXml($arr)
{$xml = "<xml>";foreach ($arr as $key=>$val){if (is_numeric($val)){$xml.="<".$key.">".$val."</".$key.">";}else{$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";}}$xml.="</xml>";return $xml;
}/*** XML转数组* @param string $xml XML数据* @return xml $output 返回的数组*/
function xmlToArray($xml){$array = (array)simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);return $array;
}