公司这边有做监控异常并将消息发送到企业公众号的功能。大概如下:
1 定时任务检测异常消息
2 将消息存入redis队列
3 定时处理队列异常消息
4 发送到微信企业号对应的部门组
这里我们来看一下微信发送过程,其他不做讨论。
简单的来说,只需要两个步骤即可:
1 获取AccessToken
2 发送消息到对应的项目部门组
一 获取AccessToken
AccessToken是企业号的全局唯一票据,调用接口时需携带AccessToken。
AccessToken需要用CorpID和Secret来换取,不同的Secret会返回不同的AccessToken。正常情况下AccessToken有效期为7200秒,有效期内重复获取返回相同结果。access_token至少保留512字节的存储空间。
请求说明
Https请求方式: GET
https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=id&corpsecret=secrect
corpid 企业Id
corpsecret 管理组的凭证密钥
二 发送消息
企业可以主动发消息给成员
请求说明
Https请求方式: POST
https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
消息型应用支持文本、图片、语音、视频、文件、图文等消息类型。主页型应用只支持文本消息类型,且文本长度不超过20个字。
参数
| 必须 | 说明 |
touser | 否 | 成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送 |
toparty | 否 | 部门ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数 |
totag | 否 | 标签ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数 |
msgtype | 是 | 消息类型,此时固定为:text (支持消息型应用跟主页型应用) |
agentid | 是 | 企业应用的id,整型。可在应用的设置页面查看 |
content | 是 | 消息内容,最长不超过2048个字节,注意:主页型应用推送的文本消息在微信端最多只显示20个字(包含中英文) |
safe | 否 | 表示是否是保密消息,0表示否,1表示是,默认0 |
其实过程挺简单, 简单代码如下:
<?php
/**
* 微信公众号信息处理
*/
class WeixinMessage {
//corpid
public $corpid = 'xxxxxx';
//sercret
public $corpsecret = 'xxxxx';
//微信发消息api
public $weixinSendApi = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=';
/**
* 请求微信Api,获取AccessToken
*/
public function getAccessToken()
{
error_reporting(E_ALL);
//临时存放 并不安全
$filePath = ROOT.'cache/weixinToken.txt';
$tokenInfo = array();
if(is_file($filePath)){
$tokenInfo = json_decode(file_get_contents($filePath),TRUE);
}
if(!isset($tokenInfo['access_token']) || time()>$tokenInfo['expires_in']){
//更新access_token
$getAccessTokenApi = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$this->corpid}&corpsecret={$this->corpsecret}";
$jsonString = $this->curlGet($getAccessTokenApi);
$jsonInfo = json_decode($jsonString,true);
if(isset($jsonInfo['access_token'])) {
$jsonInfo['expires_in'] = time() + 7100;
file_put_contents($filePath, json_encode($jsonInfo));
}
$tokenInfo = $jsonInfo;
}
if(isset($tokenInfo['access_token']) && $tokenInfo['expires_in']>time()){
return $tokenInfo['access_token'];
} else {
return FALSE;
}
}
/**
* 发信息接口
*
* @author wanghan
* @param $content 发送内容
* @param $touser 接收的用户 @all全部 多个用 | 隔开
* @param $toparty 接收的群组 @all全部 多个用 | 隔开
* @param $totag 标签组 @all全部 多个用 | 隔开
* @param $agentid 应用id
* @param $msgtype 信息类型 text=简单文本
*/
public function send($content,$touser='@all',$toparty='',$totag='',$agentid=8,$msgtype='text')
{
$api = $this->weixinSendApi.$this->getAccessToken();
$postData = array(
'touser' => $touser,
'toparty' => $toparty,
'totag' => $totag,
'msgtype' => $msgtype,
'agentid' => $agentid,
'text' => array(
'content' => urlencode($content)
)
);
$postString = urldecode(json_encode($postData));
$ret = $this->curlPost($api,$postString);
$retArr = json_decode($ret,TRUE);
if(isset($retArr['errcode']) && $retArr['errcode'] == 0) {
return true;
} else {
return false;
}
}
/**
* Curl Post数据
* @param string $url 接收数据的api
* @param string $vars 提交的数据
* @param int $second 要求程序必须在$second秒内完成,负责到$second秒后放到后台执行
* @return string or boolean 成功且对方有返回值则返回
*/
function curlPost($url, $vars, $second=30)
{
$ch = curl_init();
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE);
// curl_setopt($ch, CURLOPT_HTTPHEADER, array(
// 'Content-Type: application/json; charset=utf-8',
// 'Content-Length: ' . strlen($vars))
// );
$data = curl_exec($ch);
curl_close($ch);
if($data)
return $data;
return false;
}
/**
* CURL get方式提交数据
* 通过curl的get方式提交获取api数据
* @param string $url api地址
* @param int $second 超时时间,单位为秒
* @param string $log_path 日志存放路径,如果没有就不保存日志,还有存放路径要有读写权限
* @return true or false
*/
function curlGet($url,$second=30,$log_path='', $host='', $port='')
{
$ch = curl_init();
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE);
if(!empty($host)){
curl_setopt($ch,CURLOPT_HTTPHEADER,$host);
}
if(!empty($port)){
curl_setopt($ch,CURLOPT_PORT,$port);
}
$data = curl_exec($ch);
$return_ch = curl_errno($ch);
curl_close($ch);
if($return_ch!=0)
{
if(!empty($log_path))
file_put_contents($log_path,curl_error($ch)."\n\r\n\r",FILE_APPEND);
return false;
}
else
{
return $data;
}
}
}
















