|
|
@ -34,17 +34,8 @@ class WechatMenu |
|
|
|
return json_decode($token_data, true); |
|
|
|
} |
|
|
|
|
|
|
|
//获取关注者列表
|
|
|
|
public function get_user_list($next_openid = NULL) |
|
|
|
{ |
|
|
|
$url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=".$this->access_token."&next_openid=".$next_openid; |
|
|
|
$res = $this->http($url); |
|
|
|
return json_decode($res, true); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 自定义菜单创建 |
|
|
|
* |
|
|
|
* @param string $jsonmenu |
|
|
|
*/ |
|
|
|
public function create_menu($jsonmenu) |
|
|
@ -53,6 +44,423 @@ class WechatMenu |
|
|
|
return $this->http($url, $jsonmenu); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 查询菜单 |
|
|
|
* @param $access_token 已获取的ACCESS_TOKEN |
|
|
|
*/ |
|
|
|
public function getmenu($access_token) |
|
|
|
{ |
|
|
|
# code...
|
|
|
|
$url = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=".$this->access_token; |
|
|
|
$data = file_get_contents($url); |
|
|
|
return $data; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 删除菜单 |
|
|
|
* @param $access_token 已获取的ACCESS_TOKEN |
|
|
|
*/ |
|
|
|
public function delmenu($access_token) |
|
|
|
{ |
|
|
|
# code...
|
|
|
|
$url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=".$this->access_token; |
|
|
|
$data = json_decode(file_get_contents($url),true); |
|
|
|
if ($data['errcode']==0) |
|
|
|
{ |
|
|
|
# code...
|
|
|
|
return true; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 获取最新5天关注用户发过来的消息,消息id,用户fakeid,昵称,消息内容 |
|
|
|
* |
|
|
|
* 返回结构:id:msgId; fakeId; nickName; content; |
|
|
|
* |
|
|
|
* @return array |
|
|
|
*/ |
|
|
|
public function newmesg() |
|
|
|
{ |
|
|
|
$url = 'https://mp.weixin.qq.com/cgi-bin/getmessage?t=wxm-message&token='.$this->access_token.'&lang=zh_CN&count=50&rad='.rand(10000, 99999); |
|
|
|
$stream = $this->http($url); |
|
|
|
|
|
|
|
preg_match('/< type="json" id="json-msgList">(.*?)<\/>/is', $stream, $match); |
|
|
|
$json = json_decode($match[1], true); |
|
|
|
$returns = array(); |
|
|
|
foreach ( $json as $val) |
|
|
|
{ |
|
|
|
if ( $val['starred'] == '0') |
|
|
|
{ |
|
|
|
$returns[] = $val; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return $returns; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 设置标记 |
|
|
|
* |
|
|
|
* @param integer $msgId 消息标记 |
|
|
|
* @return boolean |
|
|
|
*/ |
|
|
|
public function start($msgId) |
|
|
|
{ |
|
|
|
$url = 'https://mp.weixin.qq.com/cgi-bin/setstarmessage?t=ajax-setstarmessage&rad='.rand(10000, 99999); |
|
|
|
$post = 'msgid='.$msgId.'&value=1&token='.$this->access_token.'&ajax=1'; |
|
|
|
$stream = $this->http($url, $post); |
|
|
|
|
|
|
|
// 是不是设置成功
|
|
|
|
$html = preg_replace("/^.*\{/is", "{", $stream); |
|
|
|
$json = json_decode($html, true); |
|
|
|
|
|
|
|
return (boolean)$json['msg'] == 'sys ok'; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 发送消息 |
|
|
|
* |
|
|
|
* 结构 $param = array(fakeId, content, msgId); |
|
|
|
* @param array $param |
|
|
|
* @return boolean |
|
|
|
*/ |
|
|
|
public function sendmesg($param) |
|
|
|
{ |
|
|
|
$url = 'https://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response'; |
|
|
|
$post = 'error=false&tofakeid='.$param['fakeId'].'&type=1&content='.$param['content'].'&quickreplyid='.$param['msgId'].'&token='.$this->access_token.'&ajax=1'; |
|
|
|
|
|
|
|
$stream = $this->http($url, $post); |
|
|
|
$this->start($param['msgId']); |
|
|
|
|
|
|
|
// 是不是设置成功
|
|
|
|
$html = preg_replace("/^.*\{/is", "{", $stream); |
|
|
|
$json = json_decode($html, true); |
|
|
|
return (boolean)$json['msg'] == 'ok'; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 主动发消息结构 |
|
|
|
* $param = array(fakeId, content); |
|
|
|
* @param array $param |
|
|
|
* @return [type] [description] |
|
|
|
*/ |
|
|
|
public function send($param) |
|
|
|
{ |
|
|
|
$url = 'https://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response&lang=zh_CN'; |
|
|
|
//$post = 'ajax=1&appmsgid='.$param['msgid'].'&error=false&fid='.$param['msgid'].'&tofakeid='.$param['fakeId'].'&token='.$this->access_token.'&type=10';
|
|
|
|
$post = 'ajax=1&content='.$param['content'].'&error=false&tofakeid='.$param['fakeId'].'&token='.$this->access_token.'&type=1'; |
|
|
|
$stream = $this->html($url, $post); |
|
|
|
// 是不是设置成功
|
|
|
|
$html = preg_replace("/^.*\{/is", "{", $stream); |
|
|
|
$json = json_decode($html, true); |
|
|
|
return (boolean)$json['msg'] == 'ok'; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 批量发送(可能需要设置超时) |
|
|
|
* $param = array(fakeIds, content); |
|
|
|
* @param array $param |
|
|
|
* @return [type] [description] |
|
|
|
*/ |
|
|
|
public function batSend($param) |
|
|
|
{ $url = 'https://mp.weixin.qq.com/cgi-bin/masssend?t=ajax-response'; |
|
|
|
$post = 'ajax=1&city=&content='.$param['content'].'&country=&error=false&groupid='.$param['groupid'].'&needcomment=0&province=&sex=0&token='.$this->access_token.'&type=1'; |
|
|
|
$stream = $this->html($url, $post); |
|
|
|
// 是不是设置成功
|
|
|
|
$html = preg_replace("/^.*\{/is", "{", $stream); |
|
|
|
$json = json_decode($html, true); |
|
|
|
return (boolean)$json['msg'] == 'ok'; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 新建图文消息 |
|
|
|
*/ |
|
|
|
public function setNews($param, $post_data) |
|
|
|
{ |
|
|
|
$url = 'https://mp.weixin.qq.com/cgi-bin/sysnotify?lang=zh_CN&f=json&begin=0&count=5'; |
|
|
|
$post = 'ajax=1&token='.$this->access_token.''; |
|
|
|
$stream = $this->html($url, $post); |
|
|
|
//上传图片
|
|
|
|
$url = 'https://mp.weixin.qq.com/cgi-bin/uploadmaterial?cgi=uploadmaterial&type='.$param['type'].'&token='.$this->access_token.'&t=iframe-uploadfile&lang=zh_CN&formId=1'; |
|
|
|
$stream = $this->_uploadFile($url, $post_data); |
|
|
|
echo '</pre>'; |
|
|
|
print_r($stream); |
|
|
|
echo '</pre>'; |
|
|
|
exit; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 获得用户发过来的消息(消息内容和消息类型) |
|
|
|
*/ |
|
|
|
public function getMsg() |
|
|
|
{ |
|
|
|
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; |
|
|
|
if ($this->debug) { |
|
|
|
$this->write_log($postStr); |
|
|
|
} |
|
|
|
if (!empty($postStr)) { |
|
|
|
$this->msg = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); |
|
|
|
$this->msgtype = strtolower($this->msg['MsgType']);//获取用户信息的类型
|
|
|
|
$this->eventkey = strtolower($this->msg['EventKey']);//获取key值
|
|
|
|
} |
|
|
|
} |
|
|
|
/** |
|
|
|
* 回复文本消息 |
|
|
|
* @param string $text |
|
|
|
* @return string |
|
|
|
*/ |
|
|
|
public function makeText($text='') |
|
|
|
{ |
|
|
|
$createtime = time(); |
|
|
|
$funcflag = $this->setFlag ? 1 : 0; |
|
|
|
$textTpl = "<xml>
|
|
|
|
<ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName> |
|
|
|
<FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName> |
|
|
|
<CreateTime>{$createtime}</CreateTime> |
|
|
|
<MsgType><![CDATA[text]]></MsgType> |
|
|
|
<Content><![CDATA[%s]]></Content> |
|
|
|
<FuncFlag>%s</FuncFlag> |
|
|
|
</xml>";
|
|
|
|
return sprintf($textTpl,$text,$funcflag); |
|
|
|
} |
|
|
|
/** |
|
|
|
* 回复图文消息 |
|
|
|
* @param array $newsData |
|
|
|
* @return string |
|
|
|
*/ |
|
|
|
public function makeNews($newsData=array()) |
|
|
|
{ |
|
|
|
$createtime = time(); |
|
|
|
$funcflag = $this->setFlag ? 1 : 0; |
|
|
|
$newTplHeader = "<xml>
|
|
|
|
<ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName> |
|
|
|
<FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName> |
|
|
|
<CreateTime>{$createtime}</CreateTime> |
|
|
|
<MsgType><![CDATA[news]]></MsgType> |
|
|
|
<Content><![CDATA[%s]]></Content> |
|
|
|
<ArticleCount>%s</ArticleCount><Articles>";
|
|
|
|
$newTplItem = "<item>
|
|
|
|
<Title><![CDATA[%s]]></Title> |
|
|
|
<Description><![CDATA[%s]]></Description> |
|
|
|
<PicUrl><![CDATA[%s]]></PicUrl> |
|
|
|
<Url><![CDATA[%s]]></Url> |
|
|
|
</item>";
|
|
|
|
$newTplFoot = "</Articles>
|
|
|
|
<FuncFlag>%s</FuncFlag> |
|
|
|
</xml>";
|
|
|
|
$content = ''; |
|
|
|
$itemsCount = count($newsData['items']); |
|
|
|
$itemsCount = $itemsCount < 10 ? $itemsCount : 10;//微信公众平台图文回复的消息一次最多10条
|
|
|
|
if ($itemsCount) { |
|
|
|
foreach ($newsData['items'] as $key => $item) { |
|
|
|
$content .= sprintf($newTplItem,$item['title'],$item['description'],$item['picUrl'],$item['url']);//微信的信息数据
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
$header = sprintf($newTplHeader,$newsData['content'],$itemsCount); |
|
|
|
$footer = sprintf($newTplFoot,$funcflag); |
|
|
|
return $header . $content . $footer; |
|
|
|
} |
|
|
|
/** |
|
|
|
* 回复音乐消息 |
|
|
|
* @param array $newsData |
|
|
|
* @return string |
|
|
|
*/ |
|
|
|
public function makeMusic($newsData=array()) |
|
|
|
{ |
|
|
|
$createtime = time(); |
|
|
|
$funcflag = $this->setFlag ? 1 : 0; |
|
|
|
$textTpl = "<xml>
|
|
|
|
<ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName> |
|
|
|
<FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName> |
|
|
|
<CreateTime>{$createtime}</CreateTime> |
|
|
|
<MsgType><![CDATA[music]]></MsgType> |
|
|
|
<Music> |
|
|
|
<Title><![CDATA[{$newsData['title']}]]></Title> |
|
|
|
<Description><![CDATA[{$newsData['description']}]]></Description> |
|
|
|
<MusicUrl><![CDATA[{$newsData['MusicUrl']}]]></MusicUrl> |
|
|
|
<HQMusicUrl><![CDATA[{$newsData['HQMusicUrl']}]]></HQMusicUrl> |
|
|
|
</Music> |
|
|
|
<FuncFlag>%s</FuncFlag> |
|
|
|
</xml>";
|
|
|
|
return sprintf($textTpl,'',$funcflag); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 得到制定分组的用户列表 |
|
|
|
* @param number $groupid |
|
|
|
* @param number $pagesize,每页人数 |
|
|
|
* @param number $pageidx,起始位置 |
|
|
|
* @return Ambigous <boolean, string, mixed> |
|
|
|
*/ |
|
|
|
public function getfriendlist($groupid=0,$pagesize=500,$pageidx=0) |
|
|
|
{ |
|
|
|
$url = 'https://mp.weixin.qq.com/cgi-bin/contactmanagepage?token='.$this->access_token.'&t=wxm-friend&lang=zh_CN&pagesize='.$pagesize.'&pageidx='.$pageidx.'&groupid='.$groupid; |
|
|
|
$referer = "https://mp.weixin.qq.com/"; |
|
|
|
$response = $this->html($url, $referer); |
|
|
|
if (preg_match('%< id="json-friendList" type="json/text">([\s\S]*?)</>%', $response, $match)) |
|
|
|
{ |
|
|
|
$tmp = json_decode($match[1], true); |
|
|
|
} |
|
|
|
|
|
|
|
return $tmp; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 返回给用户信息 |
|
|
|
* |
|
|
|
*/ |
|
|
|
public function reply($data) |
|
|
|
{ |
|
|
|
echo $data; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
*@param type: text 文本类型, news 图文类型 |
|
|
|
*@param value_arr array(内容),array(ID) |
|
|
|
*@param o_arr array(array(标题,介绍,图片,超链接),...小于10条),array(条数,ID) |
|
|
|
*/ |
|
|
|
private function make_xml($type,$value_arr,$o_arr=array(0)) |
|
|
|
{ |
|
|
|
//=================xml header============
|
|
|
|
$con="<xml>
|
|
|
|
<ToUserName><![CDATA[{$this->fromUsername}]]></ToUserName> |
|
|
|
<FromUserName><![CDATA[{$this->toUsername}]]></FromUserName> |
|
|
|
<CreateTime>{$this->times}</CreateTime> |
|
|
|
<MsgType><![CDATA[{$type}]]></MsgType>";
|
|
|
|
|
|
|
|
//=================type content============
|
|
|
|
switch($type) |
|
|
|
{ |
|
|
|
case "text" : |
|
|
|
$con.="<Content><![CDATA[{$value_arr[0]}]]></Content>
|
|
|
|
<FuncFlag>{$o_arr}</FuncFlag>";
|
|
|
|
break; |
|
|
|
|
|
|
|
case "news" : |
|
|
|
$con.="<ArticleCount>{$o_arr[0]}</ArticleCount>
|
|
|
|
<Articles>";
|
|
|
|
foreach($value_arr as $id=>$v){ |
|
|
|
if($id>=$o_arr[0]) break; else null; //判断数组数不超过设置数
|
|
|
|
$con.="<item>
|
|
|
|
<Title><![CDATA[{$v[0]}]]></Title> |
|
|
|
<Description><![CDATA[{$v[1]}]]></Description> |
|
|
|
<PicUrl><![CDATA[{$v[2]}]]></PicUrl> |
|
|
|
<Url><![CDATA[{$v[3]}]]></Url> |
|
|
|
</item>";
|
|
|
|
} |
|
|
|
$con.="</Articles>
|
|
|
|
<FuncFlag>{$o_arr[1]}</FuncFlag>";
|
|
|
|
break; |
|
|
|
} //end switch
|
|
|
|
//=================end return============
|
|
|
|
$con.="</xml>"; |
|
|
|
|
|
|
|
return $con; |
|
|
|
} |
|
|
|
|
|
|
|
//获取关注者列表
|
|
|
|
public function get_user_list($next_openid = null) |
|
|
|
{ |
|
|
|
$url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=".$this->access_token."&next_openid=".$next_openid; |
|
|
|
$res = $this->http($url); |
|
|
|
return json_decode($res, true); |
|
|
|
} |
|
|
|
|
|
|
|
//获取用户基本信息
|
|
|
|
public function get_user_info($openid) |
|
|
|
{ |
|
|
|
$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$this->access_token."&openid=".$openid."&lang=zh_CN"; |
|
|
|
$res = $this->http($url); |
|
|
|
return json_decode($res, true); |
|
|
|
} |
|
|
|
|
|
|
|
//发送客服消息,已实现发送文本,其他类型可扩展
|
|
|
|
public function send_custom_message($touser, $type, $data) |
|
|
|
{ |
|
|
|
$msg = array('touser' =>$touser); |
|
|
|
switch($type) |
|
|
|
{ |
|
|
|
case 'text': |
|
|
|
$msg['msgtype'] = 'text'; |
|
|
|
$msg['text'] = array('content'=> urlencode($data)); |
|
|
|
break; |
|
|
|
} |
|
|
|
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$this->access_token; |
|
|
|
return $this->http($url, urldecode(json_encode($msg))); |
|
|
|
} |
|
|
|
|
|
|
|
//生成参数二维码
|
|
|
|
public function create_qrcode($scene_type, $scene_id) |
|
|
|
{ |
|
|
|
switch($scene_type) |
|
|
|
{ |
|
|
|
case 'QR_LIMIT_SCENE': //永久
|
|
|
|
$data = '{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": '.$scene_id.'}}}'; |
|
|
|
break; |
|
|
|
case 'QR_SCENE': //临时
|
|
|
|
$data = '{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": '.$scene_id.'}}}'; |
|
|
|
break; |
|
|
|
} |
|
|
|
$url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$this->access_token; |
|
|
|
$res = $this->http($url, $data); |
|
|
|
$result = json_decode($res, true); |
|
|
|
return "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".urlencode($result["ticket"]); |
|
|
|
} |
|
|
|
|
|
|
|
//创建分组
|
|
|
|
public function create_group($name) |
|
|
|
{ |
|
|
|
$data = '{"group": {"name": "'.$name.'"}}'; |
|
|
|
$url = "https://api.weixin.qq.com/cgi-bin/groups/create?access_token=".$this->access_token; |
|
|
|
$res = $this->http($url, $data); |
|
|
|
return json_decode($res, true); |
|
|
|
} |
|
|
|
|
|
|
|
//移动用户分组
|
|
|
|
public function update_group($openid, $to_groupid) |
|
|
|
{ |
|
|
|
$data = '{"openid":"'.$openid.'","to_groupid":'.$to_groupid.'}'; |
|
|
|
$url = "https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=".$this->access_token; |
|
|
|
$res = $this->http($url, $data); |
|
|
|
return json_decode($res, true); |
|
|
|
} |
|
|
|
|
|
|
|
//上传多媒体文件
|
|
|
|
public function upload_media($type, $file) |
|
|
|
{ |
|
|
|
$data = array("media" => "@".dirname(__FILE__).'\\'.$file); |
|
|
|
$url = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=".$this->access_token."&type=".$type; |
|
|
|
$res = $this->http($url, $data); |
|
|
|
return json_decode($res, true); |
|
|
|
} |
|
|
|
|
|
|
|
private function checkSignature() |
|
|
|
{ |
|
|
|
$signature = $_GET["signature"]; |
|
|
|
$timestamp = $_GET["timestamp"]; |
|
|
|
$nonce = $_GET["nonce"]; |
|
|
|
|
|
|
|
$token = 'weixin'; |
|
|
|
$tmpArr = array($token, $timestamp, $nonce); |
|
|
|
sort($tmpArr); |
|
|
|
$tmpStr = implode( $tmpArr ); |
|
|
|
$tmpStr = sha1( $tmpStr ); |
|
|
|
|
|
|
|
if( $tmpStr == $signature ) |
|
|
|
{ |
|
|
|
return true; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// cURL函数简单封装
|
|
|
|
public function http($url, $data = null) |
|
|
|
{ |
|
|
|