微信开发第五篇:点击菜单自动回复文本消息

一、用户点击事件,微信会发送XML格式的数据给我们的服务器,如下:
// 点击菜单拉取消息时的事件推送 推送XML数据包示例:

Select Code
1
2
3
4
5
6
7
8
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[CLICK]]></Event>
<EventKey><![CDATA[EVENTKEY]]></EventKey>
</xml>

更多事件类型见文档:http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html

前面我们在index控制器的responseMsg方法中,接收到了微信服务器发送给我们服务器的信息,并且保存到服务器中。

数据如下:
接收信息

具体的格式如下:
接收信息XML

二、我们的服务器接收到XML信息后,获取事件Event和EventKey就可以写程序被动回复信息:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 获取事件类型
$event = $postObj->Event;

switch ($event) {
    case 'CLICK':
        // 用户点击后触发该事件
        $eventKey = $postObj->EventKey;

        switch ($eventKey) {
            case 'V1001_TODAY_MUSIC':
                $this->sendMsg('帮助菜单:回复A查看更多图文信息!');
                break;
        }


        break;
    
    default:
        # code...
        break;
}

click_event

click_event_case

纯文本消息发送函数:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
// 发送纯文本消息
public function sendMsg($str)
{
  $textTpl = '<xml>
  <ToUserName><![CDATA['.$this->fromUsername.']]></ToUserName>
  <FromUserName><![CDATA['.$this->toUsername .']]></FromUserName>
  <CreateTime>'.time().'</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA['.$str.']]></Content>
  </xml>';

  echo $textTpl;exit;
}

三、用户订阅事件,发送纯文本信息

Select Code
1
2
3
case 'subscribe':
    $this->sendMsg('你开心就好!');
    break;

click_event_case2

微信开发第四篇:自定义菜单

官方文档:
https://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//通过浏览器访问这个方法,来生成菜单
public function makeMenu()
{  
    $url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$this->getAccessToken();
    $data = '{
         "button":[
         {  
              "type":"click",
              "name":"今日歌曲",
              "key":"V1001_TODAY_MUSIC"
          },
          {
               "name":"菜单",
               "sub_button":[
               {    
                   "type":"view",
                   "name":"搜索",
                   "url":"http://www.soso.com/"
                },
                {
                   "type":"view",
                   "name":"博客",
                   "url":"http://www.webjust.org"
                },
                {
                   "type":"click",
                   "name":"赞一下我们",
                   "key":"V1001_GOOD"
                }]
           }]
     }';

    $res = $this->curlHttp($url, $data);
    dump($res);
}

最终效果:
微信自定菜单

curlHttp的函数封装见另外一篇文章:curlHttp

获取Token:微信开发第三篇:获取access token

源码:https://github.com/webjust/wechat_beiginner

微信开发第三篇:获取access token

access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

说明:实现中,一般请求的access_token就保存在本地数据库一份,微信接口很多需要使用到token值,而官方的访问次数也是有限制的,每天2000次。

获取access token

官方文档出处:http://mp.weixin.qq.com/wiki/2/88b2bf1265a707c031e51f26ca5e6512.html

实现源码:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//获取access_token
public function getAccessToken()
{
//appid和secret记得要替换
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx542c11817c22d123&secret=8b2d7aac7d5dc87173bc62a429545e18';

$res = $this->curlHttp($url);

$accessToken = json_decode($res, true);

// 测试行
var_dump($accessToken);exit;

return $accessToken['access_token'];
}

实现结果:
access_token_02

微信开发第二篇:被动回复文本消息和图文消息

官方文档详见:
http://mp.weixin.qq.com/wiki/1/6239b44c206cab9145b1d52c67e6c551.html

当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。

回复文本消息

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
if ($keyword=='1') {
// 纯文本消息回复
$textTpl = '<xml>
<ToUserName><![CDATA['.$this->fromUsername.']]></ToUserName>
<FromUserName><![CDATA['.$this->toUsername .']]></FromUserName>
<CreateTime>'.time().'</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[欢迎来到我的微信测试公众号]]></Content>
</xml>';

echo $textTpl;
exit;
}

效果如下:

ceshi_01

图文消息回复代码:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
elseif ($keyword=='2') {
// 图文信息回复格式
$newTpl = '<xml>
<ToUserName><![CDATA['.$this->fromUsername.']]></ToUserName>
<FromUserName><![CDATA['.$this->toUsername.']]></FromUserName>
<CreateTime>'.time().'</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[苹果正式发布iPhone 7/7 Plus:国行价格5388元/6388元起]]></Title> 
<Description><![CDATA[苹果召开新品发布会,iPhone 7和iPhone 7 Plus正式登台亮相,国行版本的售价分别为5388元和6388元起,预售从9月9日下午3:01开始。]]></Description>
<PicUrl><![CDATA[http://upload.chinaz.com/2016/0908/6360891704559950162920888.jpeg]]></PicUrl>
<Url><![CDATA[http://www.chinaz.com/mobile/2016/0908/578020.shtml]]></Url>
</item>
</Articles>
</xml>';

echo $newTpl;
exit;
}

效果如下:

ceshi_02

微信开发第一篇:实现接入流程

一、申请公众号测试号地址
http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

官方接入文档:
http://mp.weixin.qq.com/wiki/17/2d4265491f12608cd170a95559800f2d.html

TOKEN_001

TOKEN_002

TOKEN_003

成功输出,就代表配置成功!

在接口配置信息信息处,提交url和Token值

TOKEN_0004

TOKEN_0005

TOKEN_0006

代码:仅供学习测试用途

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
namespace Home\Controller;
use Think\Controller;

define("TOKEN", "ceshi");

class IndexController extends Controller {

// 采用微信官方提供的验证方法
public function index(){
	$echoStr = $_GET["echostr"];

    // 验证通过以后,会走else区间
	if($this->checkSignature() && isset($echoStr)){
		echo $echoStr;
		exit;
	} else{
		$this->responseMsg();
	}
}

// 发送者的消息会传送到自己的服务器
public function responseMsg()
{
	//get post data, May be due to the different environments
	$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

	$str = json_encode($postStr);
	
	$data['xml'] = $str;

	D('tmp')->add($data);
	
}

// 官方提供的验证
private function checkSignature()
{
    // you must define TOKEN by yourself
    if (!defined("TOKEN")) {
        throw new Exception('TOKEN is not defined!');
    }
    
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];
    		
	$token = TOKEN;
	$tmpArr = array($token, $timestamp, $nonce);
    // use SORT_STRING rule
	sort($tmpArr, SORT_STRING);
	$tmpStr = implode( $tmpArr );
	$tmpStr = sha1( $tmpStr );
	
	if( $tmpStr == $signature ){
		return true;
	}else{
		return false;
	}
}
}

见官方文档说明:
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html