昨天做一个微信小程序支付的时候调取JsApiPay获取params发现一直失败,因为之前一直使用的JsApiPay并没有出现问题,以为是自己参数错误,测试后发现一直返回为空,先看代码
$this->load->library('wx/JsApiPay'); // // 统一下单 $input = new WxPayUnifiedOrder(); $input->SetMch_id($mchid); $input->SetAppid($appid); $input->SetBody("小程序商品支付"); $input->SetAttach('订单号123456789'); $input->SetOut_trade_no($ordersnPlus); $input->SetTotal_fee(number_format(29900); $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetGoods_tag("test"); $input->SetNotify_url("https://****.com"); $input->SetTrade_type("JSAPI"); $input->SetOpenid($openid); try { $unifiedOrder = WxPayApi::unifiedOrder($input); } catch (Exception $e) { $this->response($e, REST_Controller::HTTP_OK); } $params = $this->jsapipay->GetJsApiParameters($unifiedOrder);
不清楚为什么为空,按理说如果有问题应该走catch的,看了下错误提示也很详细,然后打印了下 $unifiedOrder发现提示了一个curl错误,错误码是60,然后百度发现是微信小程序SDK中curl需要https,不知道算不算BUG,之前也没有使用https没有出问题,
解决方案是在wxPayAPI.php文件中大概565行的
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
替换为
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);//严格校验 }