You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
7.4 KiB
241 lines
7.4 KiB
2 months ago
|
<?php
|
||
|
namespace app\Common\extend\wxWork;
|
||
|
/**
|
||
|
* Created by PhpStorm.
|
||
|
* User: ZengZhengFu
|
||
|
* Date: 2018/11/20 0020
|
||
|
* Time: 上午 10:16
|
||
|
*/
|
||
|
|
||
|
class work
|
||
|
{
|
||
|
// 每个企业都拥有唯一的corpid,获取此信息可在管理后台“我的企业”-“企业信息”下查看“企业ID”(需要有管理员权限)
|
||
|
protected $appid;
|
||
|
// secret是企业应用里面用于保障数据安全的“钥匙”,每一个应用都有一个独立的访问密钥,为了保证数据的安全,secret务必不能泄漏。
|
||
|
protected $appsecret;
|
||
|
|
||
|
function __construct($appid = '', $appsecret = '')
|
||
|
{
|
||
|
$this->appid = $appid;
|
||
|
$this->appsecret = $appsecret;
|
||
|
$path = ROOT_PATH;
|
||
|
if (!is_dir($path . 'runtime/data')) {
|
||
|
mkdir($path . 'runtime/data',0777,true);
|
||
|
}
|
||
|
if (!is_dir($path . 'runtime/data/tpl')) {
|
||
|
mkdir($path . 'runtime/data/tpl',0777,true);
|
||
|
}
|
||
|
if (!is_dir($path . 'runtime/data/tpl/web')) {
|
||
|
mkdir($path . 'runtime/data/tpl/web',0777,true);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* 给员工推送应用消息
|
||
|
* array $data 发送数据
|
||
|
*/
|
||
|
public function send(array $data)
|
||
|
{
|
||
|
if (is_array($data)) {
|
||
|
$data = json_encode($data, JSON_UNESCAPED_UNICODE);
|
||
|
}
|
||
|
$accessTokenWW = $this->getAccessTokenWW();
|
||
|
|
||
|
if (is_array($accessTokenWW)) {
|
||
|
return $accessTokenWW;
|
||
|
}
|
||
|
$url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={$accessTokenWW}";
|
||
|
|
||
|
$res = $this->curlPost($url, $data);
|
||
|
return $res;
|
||
|
}
|
||
|
/*
|
||
|
* 给员工推送应用消息
|
||
|
* array $data 发送数据
|
||
|
*/
|
||
|
public function send_multi(array $data)
|
||
|
{
|
||
|
$accessTokenWW = $this->getAccessTokenWW();
|
||
|
if (is_array($accessTokenWW)) {
|
||
|
return $accessTokenWW;
|
||
|
}
|
||
|
$url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={$accessTokenWW}";
|
||
|
foreach ($data as $index => $item)
|
||
|
{
|
||
|
$data[$index]['url'] = $url;
|
||
|
}
|
||
|
$res = $this->curl_multi($data);
|
||
|
return $res;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* 获取AccessToken
|
||
|
*/
|
||
|
protected function getAccessTokenWW()
|
||
|
{
|
||
|
$appidMd5 = md5($this->appid);
|
||
|
if (!is_file(ROOT_PATH . 'runtime/data/tpl/web/' . $appidMd5 . '.txt')) {
|
||
|
$url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$this->appid}&corpsecret={$this->appsecret}";
|
||
|
$data = $this->curlPost($url);
|
||
|
$data = json_decode($data, true);
|
||
|
if (!isset($data['access_token'])) {
|
||
|
return $data;
|
||
|
}
|
||
|
$access_token = $data['access_token'];
|
||
|
|
||
|
|
||
|
file_put_contents(ROOT_PATH . 'runtime/data/tpl/web/' . $appidMd5 . '.txt', json_encode(['at' => $access_token, 'time' => time() + 6200]));
|
||
|
return $access_token;
|
||
|
}
|
||
|
if (is_file(ROOT_PATH . 'runtime/data/tpl/web/' . $appidMd5 . '.txt')) {
|
||
|
$fileInfo = file_get_contents(ROOT_PATH . 'runtime/data/tpl/web/' . $appidMd5 . '.txt');
|
||
|
if (!$fileInfo) {
|
||
|
$url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$this->appid}&corpsecret={$this->appsecret}";
|
||
|
$data = $this->curlPost($url);
|
||
|
$data = json_decode($data, true);
|
||
|
if (!isset($data['access_token'])) {
|
||
|
return $data;
|
||
|
}
|
||
|
$access_token = $data['access_token'];
|
||
|
|
||
|
file_put_contents(ROOT_PATH . '/data/tpl/web/' . $appidMd5 . '.txt', json_encode(['at' => $access_token, 'time' => time() + 6200]));
|
||
|
return $access_token;
|
||
|
} else {
|
||
|
$fileInfo = json_decode($fileInfo, true);
|
||
|
if ($fileInfo['time'] < time()) {
|
||
|
$url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$this->appid}&corpsecret={$this->appsecret}";
|
||
|
$data = $this->curlPost($url);
|
||
|
$data = json_decode($data, true);
|
||
|
if (!isset($data['access_token'])) {
|
||
|
return $data;
|
||
|
}
|
||
|
$access_token = $data['access_token'];
|
||
|
|
||
|
file_put_contents(ROOT_PATH . 'runtime/data/tpl/web/' . $appidMd5 . '.txt', json_encode(['at' => $access_token, 'time' => time() + 6200]));
|
||
|
return $access_token;
|
||
|
}
|
||
|
return $fileInfo['at'];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* 发送http请求
|
||
|
* string $url 请求链接
|
||
|
* string(json) $data 请求数据
|
||
|
* number $time 请求超时时间
|
||
|
*/
|
||
|
protected function curlPost($url, $data = '', $time = 20)
|
||
|
{
|
||
|
// if (!empty($data))
|
||
|
// $data = $this->arr2xml($data);
|
||
|
|
||
|
//初使化init方法
|
||
|
$ch = curl_init();
|
||
|
|
||
|
//指定URL
|
||
|
curl_setopt($ch, CURLOPT_URL, $url);
|
||
|
|
||
|
//设定请求后返回结果
|
||
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||
|
|
||
|
//声明使用POST方式来进行发送
|
||
|
curl_setopt($ch, CURLOPT_POST, 1);
|
||
|
|
||
|
//发送什么数据呢
|
||
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
|
||
|
|
||
|
|
||
|
//忽略证书
|
||
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
||
|
|
||
|
//忽略header头信息
|
||
|
curl_setopt($ch, CURLOPT_HEADER, 0);
|
||
|
|
||
|
//设置超时时间
|
||
|
curl_setopt($ch, CURLOPT_TIMEOUT, $time);
|
||
|
|
||
|
//发送请求
|
||
|
$output = curl_exec($ch);
|
||
|
|
||
|
//关闭curl
|
||
|
curl_close($ch);
|
||
|
|
||
|
//返回数据
|
||
|
// $output = (array)\simplexml_load_string($output, null, LIBXML_NOCDATA | LIBXML_COMPACT);
|
||
|
return $output;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* 批量发送http请求
|
||
|
* string $url 请求链接
|
||
|
* string(json) $data 请求数据
|
||
|
* number $time 请求超时时间
|
||
|
*/
|
||
|
protected function curl_multi ($array)
|
||
|
{
|
||
|
global $_GPC, $_W;
|
||
|
$mh = curl_multi_init();
|
||
|
$curls = array();
|
||
|
|
||
|
foreach ($array as $index => $item)
|
||
|
{
|
||
|
$tmp = curl_init();
|
||
|
|
||
|
curl_setopt($tmp, CURLOPT_URL, $item['url']);
|
||
|
curl_setopt($tmp, CURLOPT_HEADER, 0);
|
||
|
|
||
|
|
||
|
|
||
|
//设定请求后返回结果
|
||
|
curl_setopt($tmp, CURLOPT_RETURNTRANSFER, 1);
|
||
|
|
||
|
//声明使用POST方式来进行发送
|
||
|
curl_setopt($tmp, CURLOPT_POST, 1);
|
||
|
|
||
|
//发送什么数据呢
|
||
|
curl_setopt($tmp, CURLOPT_POSTFIELDS, $item['data']);
|
||
|
|
||
|
|
||
|
//忽略证书
|
||
|
curl_setopt($tmp, CURLOPT_SSL_VERIFYPEER, false);
|
||
|
curl_setopt($tmp, CURLOPT_SSL_VERIFYHOST, false);
|
||
|
|
||
|
//忽略header头信息
|
||
|
curl_setopt($tmp, CURLOPT_HEADER, 0);
|
||
|
|
||
|
//设置超时时间
|
||
|
curl_setopt($tmp, CURLOPT_TIMEOUT, 100);
|
||
|
|
||
|
|
||
|
array_push($curls, $tmp);
|
||
|
curl_multi_add_handle($mh, $tmp);
|
||
|
}
|
||
|
|
||
|
$running=null;
|
||
|
|
||
|
do {
|
||
|
$mrc = curl_multi_exec($mh, $running);
|
||
|
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
|
||
|
|
||
|
while ($running && $mrc == CURLM_OK) {
|
||
|
if (curl_multi_select($mh) != -1) {
|
||
|
do {
|
||
|
$mrc = curl_multi_exec($mh, $running);
|
||
|
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
foreach ($curls as $index => $item)
|
||
|
{
|
||
|
curl_multi_remove_handle($mh, $item);
|
||
|
}
|
||
|
curl_multi_close($mh);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
}
|