前期准备
1、搭建服务器,创建应用,配置域名,
一、在本地建一个文件夹,名字为1,在这个文件夹下,从服务器的svn仓库把代码checkout下来,新建index.php文件,先进行校验。
<?php $WechatObj = new wechatCallbackapiTest($appID,$appsecret); if (!isset($_GET['echostr'])) { $WechatObj ->action(); }else{ $WechatObj ->valid(); } class wechatCallbackapiTest { public function valid() { $echoStr = $_GET["echostr"]; if($this->checkSignature()){ echo $echoStr; exit; } } //加密签名,检验该请求是否来源于微信 private function checkSignature(){ $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode($tmpArr); $tmpStr = sha1($tmpStr); if($tmpStr == $signature){ return true; }else{ return false; } } //微信操作 public function action(){ echo 'helloworld'; } }
二、申请公众号,开启开发者模式,
进入公众平台测试账号,修改接口配置信息,URL和上面服务器的域名相同,Token与校验代码中的相同。然后下面有测试号二维码,用手机扫一扫就可以关注进行测试。
接口配置信息提交时有时会提示token验证失败,首先检查填写的token与代码中的是否相同,如果填写没有错误,试着在输出echostr前加一行代码:header('content-type:text);就好了。如下图
三、以上步骤是必须的,接下来就可以看着开发文档一步步进行啦。
1、实现公众号自动回复。用printf将xml所需的参数组装起来,返回给用户。
其中type为event表示触发事件时回复,有两种情况即新用户关注公众号和取消关注。
//自动回复 public function response_msg(){ $poststr = $GLOBALS['HTTP_RAW_POST_DATA'];//接收用户信息 $postobj = simplexml_load_string($poststr,'SimpleXMLElement',LIBXML_NOCDATA);//将xml转换为对象 $fromusername = $postobj ->FromUserName;//消息发送方 $tousername = $postobj ->ToUserName;//消息接收方 $type = $postobj ->MsgType;//消息类型 $event = $postobj ->Event;//事件 $event_key = $postobj ->Event_Key; $mid = $postobj ->MediaId;//媒体消息id $link = $postobj ->Url;//链接消息地址 $latitude = $postobj ->Location_X;//位置的经度 $longitude = $postobj ->Location_Y;//纬度 $keyword = trim($postobj ->Content);//用户发送的关键字,去除多余空格 $time = time();//消息接收时间 //文本模板 $textTpl = " <xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>";
if($type == 'text'){ switch ($keyword) { case '早上好': $content = '早安,又是美好的一天!';break; case '晚安': $content = '美好的一天过去了,晚安,你和世界!';break; default: $content = '熊孩子,你好呀!';break; } }elseif($type == 'event'){ switch ($event) { case 'subscribe': $content = '欢迎关注,带你进入奇妙有趣的微信公众号开发之旅';break; case 'unsubscribe': $content = '欢迎再次关注!';break; } }else{ switch ($type) { case 'image': $content = 'image'.$mid;break; case 'voice': $content = 'voice'.$mid;break;case 'video': $content = 'video'.$mid;break; case 'location': $content = $latitude.','.$longitude;break; case 'link': $content = $link;break; } } $result = printf($textTpl,$fromusername,$tousername,$time,$content); echo $result; }
2、上面公众号自动回复的全是文本消息,下面看看还有些什么类型的消息。
- 用户可给公众号发送六种类型的消息:文本(包括表情)、语音、图片、视频、位置、链接。
①文本:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> //发送的目的地 <FromUserName><![CDATA[fromUser]]></FromUserName> //发送者 <CreateTime>1348831860</CreateTime> //消息创建时间 <MsgType><![CDATA[text]]></MsgType> //消息类型 <Content><![CDATA[你好]]></Content> //文本内容 <MsgId>1234567890123456</MsgId> //消息ID </xml>
②图片:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[image]]></MsgType> <PicUrl><![CDATA[图片路径]]></PicUrl> <MediaId><![CDATA[media_id]]></MediaId> <MsgId>1234567890123456</MsgId> </xml>
③语音:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <MediaId><![CDATA[media_id]]></MediaId> <Format><![CDATA[语音格式]]></Format> <MsgId>1234567890123456</MsgId> </xml>
开启语音识别功能的公众号,xml添加了一个元素
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <MediaId><![CDATA[media_id]]></MediaId> <Format><![CDATA[语音格式]]></Format> <Recognition><![CDATA[语音识别结果]]></Recognition> <MsgId>1234567890123456</MsgId> </xml>
④视频:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA[video]]></MsgType> <MediaId><![CDATA[media_id]]></MediaId> <ThumbMediaId><![CDATA[视频消息缩略图的媒体id]]></ThumbMediaId> <MsgId>1234567890123456</MsgId> </xml>
还有一个小视频类型,MsgType为shortvideo,其他的和上面的视频都一样。
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA[shortvideo]]></MsgType> <MediaId><![CDATA[media_id]]></MediaId> <ThumbMediaId><![CDATA[视频消息缩略图的媒体id]]></ThumbMediaId> <MsgId>1234567890123456</MsgId> </xml>
⑤地理位置:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1351776360</CreateTime> <MsgType><![CDATA[location]]></MsgType> <Location_X>纬度</Location_X> <Location_Y>经度</Location_Y> <Scale>20</Scale> <Label><![CDATA[位置信息]]></Label> <MsgId>1234567890123456</MsgId> </xml>
⑥链接:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1351776360</CreateTime> <MsgType><![CDATA[link]]></MsgType> <Title><![CDATA[消息标题]]></Title> <Description><![CDATA[消息描述]]></Description> <Url><![CDATA[消息链接]]></Url> <MsgId>1234567890123456</MsgId> </xml>
- 公众号给用户回复的消息类型有:文本、图片、语音、视频、音乐、图文。前四种模板和上面都是一样的,就是少最后的MsgId,这个id是发送消息后才生成的,因此公众号给用户发送消息时还没有id。
①文本:
<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>12345678</CreateTime> <MsgType><![CDATA[image]]></MsgType> <Image> <MediaId><![CDATA[media_id]]></MediaId> //通过素材管理中的接口上传多媒体文件,得到的id。 </Image> </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[video]]></MsgType> <Video> <MediaId><![CDATA[media_id]]></MediaId> <Title><![CDATA[视频消息标题]]></Title> <Description><![CDATA[视频消息描述]]></Description> </Video> </xml>
⑤音乐:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[music]]></MsgType> <Music> <Title><![CDATA[音乐标题]]></Title> <Description><![CDATA[音乐描述]]></Description> <MusicUrl><![CDATA[音乐链接]]></MusicUrl> <HQMusicUrl><![CDATA[高质量音乐链接]]></HQMusicUrl> <ThumbMediaId><![CDATA[缩略图的媒体id]]></ThumbMediaId> </Music> </xml>
⑥图文:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>2</ArticleCount> //图文消息个数,限制为10条以内 <Articles> <item> <Title><![CDATA[图文消息标题]]></Title> <Description><![CDATA[图文消息描述]]></Description> <PicUrl><![CDATA[图片链接]]></PicUrl> <Url><![CDATA[点击图文消息跳转链接]]></Url> </item> <item> <Title><![CDATA[title]]></Title> <Description><![CDATA[description]]></Description> <PicUrl><![CDATA[picurl]]></PicUrl> <Url><![CDATA[url]]></Url> </item> </Articles> </xml>
四、微信JSSDK开发。需要获取access_token。
在测试号管理里面设置JS接口安全域名。域名与上面服务器域名相同。
公众号创建自定义菜单,http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
1、获取access_token。在测试号信息里面找到appID和appsecret。
http请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
//获取access_token function getAccessToken(){ $appid = "wx16f3xxxxxxxxxdcd"; $appsecret = "9a8094xxxxxxxxxxxxxxxxdfc79eae"; $url_get = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url_get); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $json = curl_exec($ch); curl_close($ch); $output = json_decode($json,true); $access_token = $output['access_token']; }
2、创建菜单,示例如下:
//自定义菜单 post方式 public function menu($access_token){ $url = " https://api.weixin.qq.com/cgi-bin/menu/create?access_token=$access_token"; $menu = ' { "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" }] }] }'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $menu); $output = curl_exec($ch); curl_close($ch); $output = json_decode($output,true); var_dump($output); }
扫码关注测试号后显示如下:截图是电脑端微信
五、PHP CURL
PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。
PHP中使用cURL实现Get和Post请求的方法,网上有好多demo,这里就不举例了。
1、Get方式(如获取access_token)
2、Post方式(如创建自定义菜单)