看了N多材料,发现看腾讯官方的才是最可靠的。

下载php demo,运行,500错误,原因,php5.4部分函数配置错误,更换为php5.3正常


access_token获取,使用本地浏览器get方法可以获取,但是使用curl一直报错。针对官方微信类库进一步分解找原因:

<?phpclassJSSDK{private$appId;private$appSecret;publicfunction__construct($appId,$appSecret){$this->appId=$appId;$this->appSecret=$appSecret;}publicfunctiongetSignPackage(){$jsapiTicket=$this->getJsApiTicket();//注意URL一定要动态获取,不能hardcode.$protocol=(!empty($_SERVER['HTTPS'])&&$_SERVER['HTTPS']!=='off'||$_SERVER['SERVER_PORT']==443)?"https://":"http://";$url="$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";$timestamp=time();$nonceStr=$this->createNonceStr();//这里参数的顺序要按照key值ASCII码升序排序$string="jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";$signature=sha1($string);$signPackage=array("appId"=>$this->appId,"nonceStr"=>$nonceStr,"timestamp"=>$timestamp,"url"=>$url,"signature"=>$signature,"rawString"=>$string);return$signPackage;}privatefunctioncreateNonceStr($length=16){$chars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";$str="";for($i=0;$i<$length;$i++){$str.=substr($chars,mt_rand(0,strlen($chars)-1),1);}return$str;}privatefunctiongetJsApiTicket(){//jsapi_ticket应该全局存储与更新,以下代码以写入到文件中做示例$data=json_decode($this->get_php_file("jsapi_ticket.php"));if($data->expire_time<time()){$accessToken=$this->getAccessToken();//如果是企业号用以下URL获取ticket//$url="https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";$url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";$res=json_decode($this->httpGet($url));$ticket=$res->ticket;if($ticket){$data->expire_time=time()+7000;$data->jsapi_ticket=$ticket;$this->set_php_file("jsapi_ticket.php",json_encode($data));}}else{$ticket=$data->jsapi_ticket;}return$ticket;}privatefunctiongetAccessToken(){//access_token应该全局存储与更新,以下代码以写入到文件中做示例$data=json_decode($this->get_php_file("access_token.php"));if($data->expire_time<time()){//如果是企业号用以下URL获取access_token//$url="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";$url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";$res=json_decode($this->httpGet($url));$access_token=$res->access_token;if($access_token){$data->expire_time=time()+7000;$data->access_token=$access_token;$this->set_php_file("access_token.php",json_encode($data));}}else{$access_token=$data->access_token;}return$access_token;}privatefunctionhttpGet($url){$curl=curl_init();curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);curl_setopt($curl,CURLOPT_TIMEOUT,500);//为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。//如果在部署过程中代码在此处验证失败,请到http://curl.haxx.se/ca/cacert.pem下载新的证书判别文件。curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,true);curl_setopt($curl,CURLOPT_URL,$url);$res=curl_exec($curl);curl_close($curl);return$res;}privatefunctionget_php_file($filename){returntrim(substr(file_get_contents($filename),15));}privatefunctionset_php_file($filename,$content){$fp=fopen($filename,"w");fwrite($fp,"<?phpexit();?>".$content);fclose($fp);}}

注意:

httpGet函数中CURLOPT_SSL_VERIFYPEER参数设置为false正常运行,默认为true造成通信不正常

具体原因尚未分析,待牛人具体分析。