<?php
//========================获取access_token====================
//------------------------------------------------------------
// access_token的有效期目前为2个小时

// 方法一:

// 调用如下接口获取 access_token 
// http请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

// APPID 和 APPSECRET	就是你 “开发者中心” 中的 “开发者ID” 信息,如:
// appID		wx3dc8361f46819110
// appsecret	3c9fd5dfa11e6531701b8a38c59158f1

// 方法二:

// 在“微信公众平台接口调试工具”中的“基础支持”获取 access_token ,地址如下:
https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index

// 填写 APPID 和 APPSECRET 点击 检查问题 按钮,即可获取。


// 返回结果:access_token 在其中。
/* 200	OK
Connection: keep-alive
Date: Tue, 21 Apr 2015 11:55:10 GMT
Server: nginx/1.4.4
Content-Type: application/json; encoding=utf-8
Content-Length: 144
{
    "access_token": "B_UfOHbKg3OED632oBcBmCrb0dLPwrke4qpsxMxoAWJ_jyurCymiwayy9d6hOLBF91U5FtJr2yu7nor3HKWkBpCIeVjXnmw42UaFsA__8GA", 
    "expires_in": 7200
} */
//========================自定义菜单=========================
//------------------------------------------------------------

// 方法一:

// 调用如下接口,自定义菜单。
// http请求方式:POST(请使用https协议) 
https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

// 1. 填入 ACCESS_TOKEN
// 2. 传入如下 json 信息
/* 
 {
     "button":[
     {	
          "type":"click",
          "name":"今日歌曲",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "name":"菜单",
           "sub_button":[
           {	
               "type":"view",
               "name":"搜索",
               "url":"http://www.soso.com/"
            },
            {
               "type":"view",
               "name":"视频",
               "url":"http://v.qq.com/"
            },
            {
               "type":"click",
               "name":"赞一下我们",
               "key":"V1001_GOOD"
            }]
       }]
 }
 */

// 方法二:

// 在“微信公众平台接口调试工具”中的“自定义菜单”
https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index
// 1. 填入 ACCESS_TOKEN
// 2. 在body中填入 json 信息
// 3. 返回结果:200 OK

//--------------------------curl简介--------------------------
//------------------------------------------------------------

// 1、实现远程获取和采集内容
// 2、实现PHP 网页版的FTP上传下载
// 3、实现模拟登陆:去一个邮件系统,curl可以模拟cookies
// 4、实现接口对接(API),数据传输等:通过一个平台发送短信啊,抓取和传递所传输的信息。
// 5、实现模拟Cookie等:登陆的状态下才可以操作一些属性。

// 模拟get请求
$curl = curl_init();
curl_setopt($curl,CURLOPT_URL,'http://www.baidu.com');
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);//1代表返回还是输出
$output = curl_exec($curl);
curl_close($curl);
// var_dump($output);
//---------------------模拟post请求方法----------------------
//------------------------------------------------------------
/**
* 模拟post请求方法
* @param $url String 请求的地址
* @param $data unknown 发送的数据
* @return unknown 返回请求的数据
*/
function https_request($url,$data = null){
	$curl = curl_init();
	
	curl_setopt($curl,CURLOPT_URL,$url);
	curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
	curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false);
	
	if(!empty($data)){//如果有数据传入数据
		curl_setopt($curl,CURLOPT_POST,1);//CURLOPT_POST 模拟post请求
		curl_setopt($curl,CURLOPT_POSTFIELDS,$data);//传入数据
	}
	
	curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
	$output = curl_exec($curl);
	curl_close($curl);
	
	return $output;
}
//--------------------获取access_token------------------------
//------------------------------------------------------------
/**
* 获取 access_token 用到上面的 https_request()
* @param $appid     String appid
* @param $appsecret String appsecret
*/
function get_token($appid,$appsecret){

	$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";
	$json = https_request($url);
	
	$arr = json_decode($json,true);
	return $arr['access_token'];
}
//------------------------执行设置菜单-----------------------
//------------------------------------------------------------
// 菜单json
$menu_json = '{
	"button":[{
			"type":"click",
			"name":"顶级菜单一",
			"key":"V1001_TODAY_MUSIC"},
		{	"name":"顶级菜单二",
			"sub_button":[
				{	"type":"view",
					"name":"搜索w",
					"url":"http://www.soso.com/"},
				{	"type":"view",
					"name":"视频",
					"url":"http://v.qq.com/"},
				{	"type":"click",
					"name":"赞一下我们",
					"key":"V1001_GOOD" }]
		}]
}';
// 获取 access_token
$access_token = get_token('wx3dc8361f46819110','3c9fd5dfa11e6531701b8a38c59158f1');
// 设置菜单的接口
$menu_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$access_token}";
// 如果设置成功返回ok信息
$info = https_request($menu_url,$menu_json);
// 输出返回信息
print_r($info);
//=========================XML处理函数=======================
//------------------------------------------------------------
// $GLOBALS['HTTP_RAW_POST_DATA'] 接收另类的post数据
$postStr = $GLOBALS['HTTP_RAW_POST_DATA'];

//xml转对象
$postObj = simplexml_load_string($postStr,'simpleXMLElement',LIBXML_NOCDATA);
// 参数1,把XML转换为字符串对象
// 参数2,自己定义的类
// 参数3,常量LIBXML_NOCDATA使XML中可以用<![CDATA[hehe]]>

//========================将XML转换成对象====================
//------------------------------------------------------------
// XML的头文件必须写
$str = <<<MM
<?xml version="1.0" encoding="utf-8"?>
<xml>
	<ToUserName><![CDATA[hehe]]></ToUserName>
	<FromUserName><![CDATA[haha]]></FromUserName>
	<CreateTime>1348831860</CreateTime>
	<MsgType><![CDATA[text]]></MsgType>
	<Content><![CDATA[this is a test]]></Content>
	<MsgId>1234567890123456</MsgId>
</xml>
MM;
	$xmlObj = simplexml_load_string($str);//返回XML对象
	echo $xmlObj->MsgType;
	echo $xmlObj->CreateTime;
	echo $xmlObj->ToUserName;
	echo $xmlObj->FromUserName;
	echo $xmlObj->Content;
	echo $xmlObj->MsgId;
	
//=======================回复消息处理========================
//-----------------------回复文本消息------------------------
/*
*	param $postObj   Object XML对象
*	param $content   String 回复消息内容
*/
private function receiveText($postObj,$content = 'nothing'){
	$receiveText = "<xml>
	<ToUserName><![CDATA[%s]]></ToUserName>
	<FromUserName><![CDATA[%s]]></FromUserName>
	<CreateTime>%s</CreateTime>
	<MsgType><![CDATA[text]]></MsgType>
	<Content><![CDATA[%s]]></Content>
	</xml>";
	echo sprintf($receiveText,$postObj->FromUserName,$postObj->ToUserName,time(),$content);
}//receiveText
//------------------------------------------------------------
//------------------------回复图文消息-----------------------
// 返回图文消息
/*
*	param $postObj    Object XML对象
*	param $newsArray  Array 新闻消息数组 $newsArray = array(); $newsArray[] = array("Title"=>"标题","Description"=>"描述","PicUrl"=>"","Url"=>"");
*/
private function receiveNews($postObj,$newsArray){
	$item = "<item>
	<Title><![CDATA[%s]]></Title> 
	<Description><![CDATA[%s]]></Description>
	<PicUrl><![CDATA[%s]]></PicUrl>
	<Url><![CDATA[%s]]></Url></item>";
	foreach ($newsArray as $value){
		$items .= sprintf($item,$value['Title'],$value['Description'],$value['PicUrl'],$value['Url']);
	}
	$receiveNews = "<xml>
	<ToUserName><![CDATA[%s]]></ToUserName>
	<FromUserName><![CDATA[%s]]></FromUserName>
	<CreateTime>%s</CreateTime>
	<MsgType><![CDATA[news]]></MsgType>
	<ArticleCount>%s</ArticleCount>
	<Articles>$items</Articles></xml>";
	echo sprintf($receiveNews,$postObj->FromUserName,$postObj->ToUserName,time(),count($newsArray));
}//receiveNews
//------------------------------------------------------------
//---------------------回复音乐消息--------------------------
// 回复音乐消息
/*
*	param $postObj     Object XML对象
*	param $Title       String 音乐标题
*	param $Description String 音乐描述
*	param $MusicUrl    String 音乐地址
*	param $HQMusicUrl  String 高清音乐地址
*/
private function receiveMusic($postObj,$Title = 'title',$Description = 'des',$MusicUrl,$HQMusicUrl){
	$receiveMusic = "<xml>
	<ToUserName><![CDATA[%s]]></ToUserName>
	<FromUserName><![CDATA[%s]]></FromUserName>
	<CreateTime>%s</CreateTime>
	<MsgType><![CDATA[music]]></MsgType><Music>
	<Title><![CDATA[%s]]></Title>
	<Description><![CDATA[%s]]></Description>
	<MusicUrl><![CDATA[%s]]></MusicUrl>
	<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
	</Music></xml>";
	echo sprintf($receiveMusic,$postObj->FromUserName,$postObj->ToUserName,time(),$Title,$Description,$MusicUrl,$HQMusicUrl);
}//receiveMusic
//========================关注事件===========================
//------------------------------------------------------------
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>//事件类型,subscribe(订阅),unsubscribe(取消订阅)
</xml>
//========================文本消息===========================
//----------------------接收文本消息-------------------------
 <xml>
 <ToUserName><![CDATA[kangku]]></ToUserName>	//开发者用户名
 <FromUserName><![CDATA[xiaoming]]></FromUserName> //用户的用户名
 <CreateTime>1348831860</CreateTime>		//创建时间
 <MsgType><![CDATA[text]]></MsgType>		//文本格式
 <Content><![CDATA[hello]]></Content>		//文本消息内容
 <MsgId>1234567890123456</MsgId>			//消息id,64位整型
 </xml>
 //------------------------回复文本消息-----------------------
 //------------------------------------------------------------
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[ 你好]]></Content>
</xml>
//=========================图片消息==========================
//------------------------------------------------------------
 <xml>
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName>
 <CreateTime>1348831860</CreateTime>
 <MsgType><![CDATA[image]]></MsgType>	//消息类型image
 <PicUrl><![CDATA[this is a url]]></PicUrl>		//图片链接
 <MediaId><![CDATA[media_id]]></MediaId>	//图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
 <MsgId>1234567890123456</MsgId>			//消息id,64位整型
 </xml>
//-------------------------回复图片消息----------------------
//------------------------------------------------------------
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[media_id]]></MediaId>
</Image>
</xml>
//=========================语音消息==========================
//------------------------------------------------------------
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>	//语音为voice
<MediaId><![CDATA[media_id]]></MediaId>	//语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
<Format><![CDATA[Format]]></Format>		//语音格式,如amr,speex等
<MsgId>1234567890123456</MsgId>
</xml>
//------------------------------------------------------------
//------------------------回复语音消息-----------------------
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<Voice>
<MediaId><![CDATA[media_id]]></MediaId>
</Voice>
</xml>
//-------------------------回复音乐消息----------------------
//------------------------------------------------------------
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
<Music>
<Title><![CDATA[TITLE]]></Title>
<Description><![CDATA[DESCRIPTION]]></Description>
<MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl>//音乐链接
<HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl>//高质量音乐链接,WIFI环境优先使用该链接播放音乐
<ThumbMediaId><![CDATA[media_id]]></ThumbMediaId>
</Music>
</xml>
//==========================视频消息=========================
//------------------------------------------------------------
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[video]]></MsgType>	//视频为video
<MediaId><![CDATA[media_id]]></MediaId>	//视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>//视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据
<MsgId>1234567890123456</MsgId>
</xml>
//------------------------回复视频消息-----------------------
//------------------------------------------------------------
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<Video>
<MediaId><![CDATA[media_id]]></MediaId>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
</Video> 
</xml>
//=========================地理位置消息======================
//------------------------------------------------------------
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1351776360</CreateTime>
<MsgType><![CDATA[location]]></MsgType>	// MsgType	 location
<Location_X>23.134521</Location_X>			// Location_X	 地理位置维度
<Location_Y>113.358803</Location_Y>			// Location_Y	 地理位置经度
<Scale>20</Scale>							// Scale 地图缩放大小
<Label><![CDATA[ 位置信息]]></Label>		// Label 地理位置信息
<MsgId>1234567890123456</MsgId>
</xml>
//===========================链接消息========================
//------------------------------------------------------------
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1351776360</CreateTime>
<MsgType><![CDATA[link]]></MsgType>			//消息类型,link
<Title><![CDATA[ 链接]]></Title>				//消息标题
<Description><![CDATA[ 这是链接]]></Description>	//消息描述
<Url><![CDATA[url]]></Url>						//消息链接
<MsgId>1234567890123456</MsgId>
</xml>
//=======================回复图文消息========================
//------------------------------------------------------------
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>2</ArticleCount>			//图文消息个数,限制为10条以内
<Articles>
<item>//多条图文消息信息,默认第一个item为大图,注意,如果图文数超过10,则将会无响应
<Title><![CDATA[title1]]></Title> 	//图文消息标题
<Description><![CDATA[description1]]></Description>//图文消息描述
<PicUrl><![CDATA[picurl]]></PicUrl>	//图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
<Url><![CDATA[url]]></Url>			//点击图文消息跳转链接
</item>
<item>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
</Articles>
</xml>
//============================================================
//------------------------------------------------------------