熟悉阿北的伙计知道最近我搞了一个专门针对于yii2的微信SDK,已经开源, github,也欢迎大家给我加个星星哈。
当用户和公众号发生互动(比如输入文本、点击菜单等),微信允许我们接收这些信息并给予回复,当然我们需要先配置并提供用于接收的url,这就是服务端。
use abei2017\wx\Application;
$config = [];
$app = new Application(['conf'=>$config);
$server = $app->driver("mp.server");
$server->setMessageHandler(function($message) {
return "欢迎你";
});
$response = $server->serve();
return $response;
上面的代码接收用户传过来的$message并给予回复一句"欢迎你",在yii2中还要关掉csrf验证,因此在接口控制器中要有如下设置 **public $enableCsrfValidation = false;** 否则微信服务器给我们服务器推送的消息会被挡住。
你可能对上面还不是太懂,没关系,我们一点点说。
$message
$message是一个数组,它代表用户给公众号发的消息(文本、语音、视频等等),我们可以根据$message数组的MsgType值来判断具体类型,这里有一个特殊的类型就是event,针对于event类型的消息还需要通过Event来区别。
关于$message的消息的类型可以通过下面两个链接查看
- https://mp.weixin.qq.com/wiki...
- https://mp.weixin.qq.com/wiki...
回复
现在我们已经能收到用户发送的消息了,但是微信规定我们还要给用户一个响应或SUCCESS,这部分逻辑我们可以写到如下代码中
$server->setMessageHandler(function($message) {
return "欢迎你";
});
回复的类型也有很多种,不过你不用担心,这些yii2-wx已经帮你处理好了。
- Image
- Music
- News
- Text
- Transfer
- Video
- Voice
假设我们现在要回复一个文本,可以如下代码
use abei2017\wx\mp\message\Text;
$server->setMessageHandler(function($message) {
return (new Text(['props'=>['Content'=>'欢迎你']))
});
考虑到回复文本消息出镜率非常高,因此当你回复文本类型时,你还有一种更加简洁的方式
$server->setMessageHandler(function($message) {
return "欢迎你";
});
是的,yii2-wx可以判断是否为字符串并且自动初始化Text类对象。
回复消息类型归总
我们可以给用户回复六种类型的消息,依次如下:
文本类型
use abei2017\wx\mp\message\Text;
$msg = new Text(['props'=>['Content'=>'欢迎你']);
图片类型
use abei2017\wx\mp\message\Image;
$msg = new Image(['props'=>['MediaId'=>'xxxx']);
语音类型
use abei2017\wx\mp\message\Voice;
$msg = new Voice(['props'=>['MediaId'=>'xxxx']);
视频类型
use abei2017\wx\mp\message\Video;
$msg = new Video(['props'=>['MediaId'=>'xxxx','Title'=>'标题(选填)','Description'=>'简介(选填)']);
音乐类型
use abei2017\wx\mp\message\Music;
$msg = new Music(['props'=>['ThumbMediaId'=>'xxx','Title'=>'标题(选填)','Description'=>'简介(选填)','MusicURL'=>'音乐链接(选填)','HQMusicUrl'=>'高质量音乐链接(选填)']]);
图文类型
use abei2017\wx\mp\message\News;
$msg = new News(['props'=>['ArticleCount'=>1,'Articles'=>[['Title'=>'','Description'=>'','PicUrl'=>'','Url'=>''],['Title'=>'','Description'=>'','PicUrl'=>'','Url'=>'']]]]);