今天做wap请求微信APP支付, PHP端要post请求API生成预支付订单,获取订单号。

请求地址为:

https://api.weixin.qq.com/pay/genprepay?access\_token=ACCESS\_TOKEN

请求方法是要post,json数据。

本来,这些都没什么,在原来封装的curl方法中加个header参数即可。可是实际测试时,一直返回false,拿本地的url测试,又是正常,翻了半天没想通理由,按照官方文档来说,如果是json格式错误,起码应有个错误码啊。

于是,开始对比本地url和远端API的不同,终于,最后发现了不同所在,微信api使用的是https,而且在人家官方文档的开始就已经声明了,自己没注意到而已。

知道了问题所在就好解决了,当请求https的数据时,会要求证书,在请求时加上两个参数,忽略下ssl的证书检查好了。

function postJsonCurl($url, $data_string) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);  // 从证书中检查SSL加密算法是否存在
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json; charset=utf-8',
        'Content-Length: ' . strlen($data_string))
    );
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300);

    ob_start();
    curl_exec($ch);
    $result= ob_get_contents();
    ob_end_clean();
    return $result;
}