|
|
<?php
|
|
|
|
|
|
class WeChatCommon
|
|
|
{
|
|
|
|
|
|
/**
|
|
|
* 判断是否已关注公众号
|
|
|
*/
|
|
|
public function isAuth()
|
|
|
{
|
|
|
$access_token = $this->getAccessToken();
|
|
|
$subscribe_msg = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" . $access_token . "&openid=" . session('openid');
|
|
|
$subscribe = json_decode(file_get_contents($subscribe_msg));
|
|
|
$gzxx = $subscribe->subscribe;
|
|
|
if ($gzxx === 1) {
|
|
|
return true;
|
|
|
} else {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取code
|
|
|
*/
|
|
|
public function code()
|
|
|
{
|
|
|
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . config('AppID') . "&redirect_uri=http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . "&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect";
|
|
|
header('location:' . $url);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取openid
|
|
|
* @param $code
|
|
|
* @return mixed
|
|
|
*/
|
|
|
public function getOpenid($code)
|
|
|
{
|
|
|
$get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . config('AppID') . '&secret=' . config('AppSecret') . '&code=' . $code . '&grant_type=authorization_code';
|
|
|
$ch = curl_init();
|
|
|
curl_setopt($ch, CURLOPT_URL, $get_token_url);
|
|
|
curl_setopt($ch, CURLOPT_HEADER, 0);
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
|
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
|
|
|
$res = curl_exec($ch);
|
|
|
curl_close($ch);
|
|
|
$json_obj = json_decode($res, true);
|
|
|
return $json_obj;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取access_token,全局缓存7200s
|
|
|
* @return mixed
|
|
|
*/
|
|
|
public function getAccessToken()
|
|
|
{
|
|
|
$data = cache('Vendor/access_token');
|
|
|
if (!empty($data) && ((time() - $data['time']) < 7000)) {
|
|
|
return $data['access_token'];
|
|
|
} else {
|
|
|
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . config('AppID') . "&secret=" . config('AppSecret') . "";
|
|
|
$ch = curl_init();
|
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
|
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
|
$output = curl_exec($ch);
|
|
|
curl_close($ch);
|
|
|
$jsoninfo = json_decode($output, true);
|
|
|
$access_token = $jsoninfo["access_token"];
|
|
|
$time = time();
|
|
|
$data = array(
|
|
|
'access_token' => $access_token,
|
|
|
'time' => $time
|
|
|
);
|
|
|
cache('Vendor/access_token', $data);
|
|
|
return $access_token;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取用户信息(头像、昵称等)
|
|
|
* @return array
|
|
|
*/
|
|
|
public function getUserInfo($info)
|
|
|
{
|
|
|
$url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $info['access_token'] . '&openid=' . $info['openid'] . '&lang=zh_CN';
|
|
|
$ch = curl_init();
|
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
|
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
|
$output = curl_exec($ch);
|
|
|
curl_close($ch);
|
|
|
$jsoninfo = json_decode($output, true);
|
|
|
return $jsoninfo;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 下载网址内容,配合getUserInfo使用
|
|
|
* @param $url
|
|
|
* @param $filename
|
|
|
* @return mixed
|
|
|
*/
|
|
|
public function curl_file_get_contents($url, $filename)
|
|
|
{
|
|
|
$ch = curl_init();
|
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
|
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
|
|
|
curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
|
|
|
curl_setopt($ch, CURLOPT_REFERER, _REFERER_);
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
|
$r = curl_exec($ch);
|
|
|
curl_close($ch);
|
|
|
file_put_contents('data/upload/headimg/' . $filename, $r);
|
|
|
return $filename;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取js-sdkp票据,全局缓存7200s
|
|
|
* @return mixed
|
|
|
*/
|
|
|
public function get_jsapi_ticket()
|
|
|
{
|
|
|
$ticket = cache('Vendor/ticket');
|
|
|
if (!empty($ticket) && ((time() - $ticket['time']) < 7000)) {
|
|
|
return $ticket['ticket'];
|
|
|
} else {
|
|
|
$url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' . $this->getAccessToken() . '&type=jsapi';
|
|
|
$ch = curl_init();
|
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
|
curl_setopt($ch, CURLOPT_HEADER, 0);
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
|
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
|
|
|
$res = curl_exec($ch);
|
|
|
curl_close($ch);
|
|
|
$json_obj = json_decode($res, true);
|
|
|
$jsapi_ticket = $json_obj['ticket'];
|
|
|
$time = time();
|
|
|
$data = array(
|
|
|
'ticket' => $jsapi_ticket,
|
|
|
'time' => $time
|
|
|
);
|
|
|
cache('Vendor/ticket', $data);
|
|
|
return $jsapi_ticket;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* JS_SDK
|
|
|
* @return array
|
|
|
*/
|
|
|
public function js_sdk()
|
|
|
{
|
|
|
$timestamp = time();
|
|
|
$string = 'jsapi_ticket=' . $this->get_jsapi_ticket() . '&noncestr=je9omv03bc5ryqz1×tamp=' . $timestamp . '&url=' . 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
|
|
|
$signature = sha1($string);
|
|
|
return array(
|
|
|
'appId' => config('AppId'),
|
|
|
'timestamp' => $timestamp,
|
|
|
'nonceStr' => 'je9omv03bc5ryqz1',
|
|
|
'signature' => $signature,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建菜单
|
|
|
* @return mixed|string
|
|
|
*/
|
|
|
public function creatMenu()
|
|
|
{
|
|
|
$ch = curl_init();
|
|
|
curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" . $this->getAccessToken());
|
|
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
|
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
|
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
|
|
|
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
|
|
|
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
|
|
|
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
|
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->menuItem());
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
|
$tmpInfo = curl_exec($ch);
|
|
|
if (curl_errno($ch)) {
|
|
|
return curl_error($ch);
|
|
|
}
|
|
|
curl_close($ch);
|
|
|
return $tmpInfo;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 菜单内容JSON
|
|
|
* @return string
|
|
|
*/
|
|
|
public function menuItem()
|
|
|
{
|
|
|
$data = '{
|
|
|
"button":[{
|
|
|
"type":"view",
|
|
|
"name":"登录/注册",
|
|
|
"url":"http://hospital.wx.bronet.cn/index.php/UserCenter/login"
|
|
|
}],
|
|
|
"button":[{
|
|
|
"type":"view",
|
|
|
"name":"医生预约",
|
|
|
"url":"http://hospital.wx.bronet.cn/index.php/DoctorAppointment/index"
|
|
|
}],
|
|
|
"button":[{
|
|
|
"type":"view",
|
|
|
"name":"个人中心",
|
|
|
"url":"http://hospital.wx.bronet.cn/index.php/UserCenter/index"
|
|
|
}]
|
|
|
}';
|
|
|
return $data;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 上传永久素材
|
|
|
*/
|
|
|
public function eternalMaterial()
|
|
|
{
|
|
|
$file_info = array('filename' => '/public/images/soul_of_cinder.png', //国片相对于网站根目录的路径
|
|
|
'content-type' => 'image/jpg/png', //文件类型
|
|
|
'filelength' => '71' //图文大小
|
|
|
);
|
|
|
$url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=" . $this->getAccessToken() . "&type=png";
|
|
|
$ch1 = curl_init();
|
|
|
$timeout = 5;
|
|
|
$real_path = "{$_SERVER['DOCUMENT_ROOT']}{$file_info['filename']}";
|
|
|
//$real_path=str_replace("/", "//", $real_path);
|
|
|
$data = array("media" => "@{$real_path}", 'form-data' => $file_info);
|
|
|
curl_setopt($ch1, CURLOPT_URL, $url);
|
|
|
curl_setopt($ch1, CURLOPT_POST, 1);
|
|
|
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
|
|
|
curl_setopt($ch1, CURLOPT_CONNECTTIMEOUT, $timeout);
|
|
|
curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER, FALSE);
|
|
|
curl_setopt($ch1, CURLOPT_SSL_VERIFYHOST, false);
|
|
|
curl_setopt($ch1, CURLOPT_POSTFIELDS, $data);
|
|
|
$result = curl_exec($ch1);
|
|
|
curl_close($ch1);
|
|
|
if (curl_errno() == 0) {
|
|
|
$result = json_decode($result, true);
|
|
|
var_dump($result);
|
|
|
return $result['media_id'];
|
|
|
} else {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
} |
|
|
\ No newline at end of file |
...
|
...
|
|