<?php namespace Common\Controller;
class WxController{
protected $appId=C('WX_APPID');
protected $appSecret=C('WX_SECRET');
function getSignPackage(){
$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×tamp=$timestamp&url=$url";
$signature=sha1($string);
$signPackage=[
"appId"=>$this->appId,
"nonceStr"=>$nonceStr,
"timestamp"=>$timestamp,
"url"=>$url,
"signature"=>$signature,
"rawString"=>$string
];
return $signPackage;
}
function createNonceStr($length=16){
$chars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str="";
for($i=0;$i<$length;$i++){
$str.=substr($chars,mt_rand(0,strlen($chars)-1),1);
}
return $str;
}
function getJsApiTicket(){
// jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
$data=json_decode(F('jsapi_ticket'));
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;
F('jsapi_ticket',json_encode($data));
}
}else{
$ticket=$data->jsapi_ticket;
}
return $ticket;
}
function getAccessToken(){
// access_token 应该全局存储与更新,以下代码以写入到文件中做示例
$data=json_decode(F('access_token'));
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";
// dump($url);
$res=json_decode($this->httpGet($url));
// dump($res);
$access_token=$res->access_token;
if($access_token){
$data->expire_time=time()+7000;
$data->access_token=$access_token;
F('access_token',json_encode($data));
}
}else{
$access_token=$data->access_token;
}
return $access_token;
}
function httpGet($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,false);
curl_setopt($curl,CURLOPT_URL,$url);
$res=curl_exec($curl);
curl_close($curl);
return $res;
}
function httpPost($url,$data=null){
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
if($data){
curl_setopt($ch,CURLOPT_POST,TRUE);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
}
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
$output=curl_exec($ch);
if($output){
curl_close($ch);
return($output);
}else{
$error=curl_error($ch);
curl_close($ch);
E($error);
}
}
function arr2xml($arr){
if(!is_array($arr)||count($arr)<=0){
E('【arr2xml】arr格式有误');
}
$xml='<xml>';
foreach($arr as $k=>$v){
if(is_numeric($v)){
$xml.='<'.$k.'>'.$v.'</'.$k.'>';
}else{
$xml.='<'.$k.'><![CDATA['.$v.']]></'.$k.'>';
}
}
$xml.='</xml>';
return $xml;
}
function xml2arr($xml){
if(!$xml){
E('【xml2arr】XML格式有误');
}
libxml_disable_entity_loader(TRUE);
$arr=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$arr=json_encode($arr);
$arr=json_decode($arr,TRUE);
return $arr;
}
function arr2url($url,$arr){
if(!$arr){
E('【arr2url】参数错误');
}
$tmp=$url;
foreach($arr as $k=>$v){
if($k!='sign'&&$v!=''&&!is_array($v)){
$tmp.=$k.'='.$v.'&';
}
}
$tmp=trim($tmp,'&');
return $tmp;
}
function sign($arr){
if(!$arr){
E('【paysign】参数错误');
}
ksort($arr);
//dump($arr);
$str=$this->arr2url('',$arr);
$str.='&key='.PAYKEY;
$str=md5($str);
$str=strtoupper($str);
//dump($str);
return $str;
}
function ssl($xml,$url,$second=30){
$ch=curl_init();
//超时时间
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
//设置header
curl_setopt($ch,CURLOPT_HEADER,FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
//设置证书
curl_setopt($ch,CURLOPT_CAINFO, CAPEM);
//使用证书:cert 与 key 分别属于两个.pem文件
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, CERTPEM);
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, KEYPEM);
//post提交方式
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
$data=curl_exec($ch);
//返回结果
if($data){
curl_close($ch);
return $data;
}else{
$error=curl_errno($ch);
F('sslerror',$error);
curl_close($ch);
return false;
}
}
//发送模板消息
function sendMsg($openid,$template_id,$body){
$data=[
'touser'=>$openid,
'template_id'=>$template_id,
'data'=>$body,
];
$url="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$this->getAccessToken();
$this->httpPost($url,jsonencode($data));
}
}
ThinkPHP中使用微信JsSDK
猜你喜欢
转载自blog.csdn.net/sr_www/article/details/81125209
今日推荐
周排行