前言

微信开发需要一定的代码能力和Linux基本操作,完全不懂的请跳过本教程

开始前,先简单的讲一讲微信开开发中的三种应用场景

1.微信公众号

微信用户关注公众号之后,可以发送各种类型(文字图片视频等)的信息,也可以点击预设的菜单(菜单分为两种,事件和链接。事件类菜单只是一个有特殊标志的按钮,告诉公众号用户点了哪个按钮,公众号可以用这个特殊标志作为代码逻辑判断的条件。链接类菜单则直接让用户跳转到指定的微网站

微信公众号开发的主要内容,就是用户所发送信息的接收回复和界面菜单的设置

2.微网站

指的是通过微信内置浏览器打开的网站。这类网站和传统网站不同之处在于是通过微信内置浏览器打开,所以可以调用一些微信浏览器独有的功能,如页面发起支付、分享到朋友圈、分享给好友等,微信官方还为微网站提供了一套标准样式库WEUI,方便实现开发者设计的微网站和微信软件本身界面的一致性。

微网站一般是为了扩展公众号的功能(抽奖、星座运势、购物、在线客服等)而专门设计的,通过公众号的菜单让用户访问。

3.传统网站

在这种应用场景下,微信是作为第三方工具出现,例如微信扫一扫登录,扫一扫支付。

准备工作

1.一台线上linux主机(本地环境无法做微信开发)

本教程中把/var/www/html/wechat/目录作为开发目录

在该目录下新建一个文件weixin.php作为微信公众平台的服务端

2.申请一个微信公众号

申请微信开发平台

开发工作

1.安装composer

Composer 是 PHP 的一个依赖管理工具,帮助软件开发工具包(SDK)解决依赖关系的工具

简单理解就是easywechat是本教程开发微信所需要用到的SDK,composer是帮助easywechat安装依赖库的

至于为什么要用easywechat这个SDK开发,而不是用官方提供的API ? 

答:官方的文档太混乱,API太操蛋。

进入到需要安装composer的项目目录(/var/www/html/weixin/

curl -sS https://getcomposer.org/installer | php

不同的linux版本在安装过程中可能会遇到各种不同的问题,请谷歌百度自行解决

2.安装easywechat

Easywechat官方文档地址(https://easywechat.org/zh-cn/docs/index.html)

在项目目录(/var/www/html/weixin/)里安装easywechat

composer require overtrue/wechat:~3.0 -vvv

3.登录微信公众平台

对url服务器地址 、token令牌进行配置并按钮

Url服务器地址就是这个文件的web路径,如过你的域名是xingzai.org,那么这里的url服务器地址就填写http://www.xingzai.org/weixin/weixin.php

Token随意填写 

4.初步配置weixin.php 

这里简单提一下微信公众号的逻辑,用户关注了你的微信公众号后,假设用户发送了一条消息给你的公众号,实际上是先发送到腾讯的服务器上,腾讯把内容转成特定的xml格式,再转发到你指定的服务端(/var/www/html/weixin/weixin.php)。你的服务端接收并解析这个xml,根据用户发来信息的内容进行逻辑处理,最后返回一个特定的xml格式内容给腾讯服务器,腾讯再转发给用户。

微信平台工作原理图

不要纠结代码细节,最后面会贴出完整的代码

微信代码截图

$options中填入配置信息,包括appidappsecrettoken

Appidappsecret在微信公众平台获取,token自己随意写,两边一致就行

5.实现接收、回复消息

微信平台代码截图

另外,可以根据用户发送的消息类型进行回复

微信代码截图

到这里,用户发送的消息类型(文字,图片,语音、视频、文字、坐标等)已经被过滤出来。一般来说,回复的逻辑就是根据用户发送的消息的不同来回复不同的信息。经常可以见到公众号让用户发送一些指定的词汇,然后进行个性化的回复。

这里省点事,接个第三方的聊天机器人(小黄鸡)来自动回复。

去图灵(http://www.tuling123.com/)那里申请一只聊天机器人

图灵机器人

 

这个api的使用方法是post或get请求以下地址,地址规则如下:

http://www.tuling123.com/openapi/api?key=【API KEY】&info=【文字内容】;

在这里,我们直接把微信用户发来的内容转给小黄鸡,再把小黄鸡回复的内容发给用户

至此,微信公众号聊天的功能已经实现。

机器人测试接口

weixin.php完整代码

<?php
//引入composer入口文件
include '/var/www/html/mytest/vendor/autoload.php';
//引入我们的主项目的入口类。
use EasyWeChat\Foundation\Application;
use EasyWeChat\Message\Text;
use EasyWeChat\Message\Image;
use EasyWeChat\Message\Video;
use EasyWeChat\Message\Voice;
use EasyWeChat\Message\News;
use EasyWeChat\Message\Article;
use EasyWeChat\Message\Material;
use EasyWeChat\Message\Raw;

//在options中填入配置信息
$options = [
    //打开调试模式
'debug'     => true,
//微信基本配置,从公众平台获取
    'app_id'    => '【微信公众号appid】',
    'secret'    => '【微信公众号appsecret】',
'token'     => '【微信公众号自定义token】',
//日志配置
    'log' => [
        'level' => 'debug',
        'file'  => '/tmp/easywechat.log',
    ],

];
//使用配置初始化一个项目实例
$app = new Application($options);
//从项目实例中得到一个服务端应用实例
$server = $app->server;
//用户实例,可以通过类似$user->nickname这样的方法拿到用户昵称,openid等等
$user = $app->user;
//接收用户发送的消息
$server->setMessageHandler(function ($message) use ($user){	
//对用户发送的消息根据不同类型进行区分处理
	switch ($message->MsgType) {
                   //事件类型消息(点击菜单、关注、扫码),略
	    	case 'event':
			switch ($message->Event) {
            			case 'subscribe':
                			// code...
                			break;

            			default:
                			// code...
                			break;
        			}
            	break;
                   //文本信息处理
        		case 'text':
                   //获取到用户发送的文本内容
		$content = $message->Content;
                   //发送到图灵机器人接口
		$url = "http://www.tuling123.com/openapi/api?key=【图
                   灵机器人API KEY】&info=".$content;
                   //获取图灵机器人返回的内容
		$content = file_get_contents($url);
                   //对内容json解码
		$content = json_decode($content);
                   //把内容发给用户
		return new Text(['content' => $content->text]);	
            	break;
		//图片信息处理,略
        		case 'image':
		$mediaId  = $message->MediaId;
		return new Image(['media_id' => $mediaId]);
            	break;
		//声音信息处理,略
        		case 'voice':
		$mediaId  = $message->MediaId;
		return new Voice(['media_id' => $mediaId]);
                  	break;
		//视频信息处理,略
        		case 'video':
		$mediaId  = $message->MediaId;
		return new Video(['media_id' => $mediaId]);
                  	break;
		//坐标信息处理,略
        		case 'location':
		return new Text(['content' => $message->Label]);
                  	break;

		//链接信息处理,略
        		case 'link':
		return new Text(['content' => $message->Description]);
            	break;

        		default:
            	break;
         }
});
//响应输出
$server->serve()->send();