PHP微信API的接入和关键字自动回复
在正式写之前,先写一些微信数据交互流程:
微信应用(即微信app)为微信用户和微信公众号提供了一个信息交互的平台
微信数据交互流程
第一个交互场景
首先是微信用户在微信界面的输入框中输入信息,这个步骤是微信用户向微信服务器发出请求
微信服务器在接收到微信用户的请求之后将信息传递给第三方的服务器第三方服务器其实就是
我们的公众账号,然后第三方服务器进行自身的业务逻辑处理,比如用户输入关键字,企业地址
然后第三方服务器将企业地址通过响应的形式传送给微信服务器,然后微信服务器再将第三方服务器
传递过来的消息封装成特定的数据结构,然后重新响应给微信用户,微信用户此时就可以在微信对话
界面上看到公众账号提供的企业地址
第二个交互场景
第三方服务器与微信服务器之间进行的,首先,微信服务器在我们第一次进行认证的时候,
认证第三方服务器的合法性的时候,推送带有一些参数的GET请求给第三方服务器,第三方服务器也可以
通过获取,比如说用户的详细信息头像,以及性别、地区等等,通过微信服务器提供的一些接口来获取用户的
一些信息
公众账号的使用模式分类
1,编辑模式:有微信公众平台,提供给微信公众账号管理者的一个简单的,可视化操作的界面,主要是方便
微信公众账号管理者,能够进行一些简单的微信运营
2,开发者模式:就是调用一些微信的公用接口,来完成一些自身业务
应用中接入API接口步骤
1,填写服务器URL,token(注意:只支持80端口 也就是http服务必须在80端口打开,才能接收发送过来的消息
这里的url就是指第三方服务器的url,它的作用主要是接收微信推送的消息
这里的token是开发者与微信公众平台之间约定的口令,主要是用来验证第三方服务器真正的合法性
2,验证服务器地址的有效性,加密/校验流程如下:
(1)将token、timestamp、nonce三个参数进行字典序排序(这三个都是微信通过get方法传送过来的三个参数,通过这三个参数可以来验证请求是否来自于微信)
(2)将三个参数字符串拼接成一个字符串进行sha1加密
(3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
3,关于access_token
(1)access_token与appid,appsecred的关系
当你在微信公众平台注册微信公众账号时,微信公众平台为你生成了一个appid和appsecred,这两个值就是你在微信公众平台上的一个唯一标识
appid和appsecred(edd7d19a4d8c625ed1244d17f78a9165)就是用来产生access_token,access_token其实就是一个动态口令,它有时间性,一段时间内有效
也可以将access_token理解成调用微信公众平台的一些接口的钥匙
特点:(1)唯一有效性(2)全局有效性 (至于access_token的详解,可以进入微信,查看“开发者文档”)
微信开放接口
1,获取access_token
2,获取微信服务器地址
说完这些之后,下边就是代码部分。首先提醒大家,要想添加自己的这些功能,首先要有一个自己的公网可以访问的域名,没有的可以在腾讯云或阿里云上申请一个(我用的框架是ThinkPHP3.2.2的)
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function index(){
$timestamp = $_GET['timestamp'];//timestamp其实就是一个时间戳
$nonce = $_GET['nonce'];//nonce是一个随机参数
$token = "weixin";//这个token填写你在微信公众平台上写的那个值
$signature = $_GET['signature'];//这个signature其实就是在微信公众平台已经加密好的字符串
$echostr = $_GET['echostr'];
$array = array( $timestamp, $nonce, $token);
sort($array);
$tmpstr = implode('', $array);
$tmpstr = sha1($tmpstr);
if( $tmpstr == $signature && $echostr){
echo $echostr;
exit;
}else{
$this->reponseMsg();
}
}
public function reponseMsg(){
$postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
$postObj = simplexml_load_string( $postArr );
if( strtolower( $postObj->MsgType) == 'event'){
//如果是关注事件(subscribe)
if( strtolower($postObj->Event == 'subscribe') ){
//回复用户消息
$toUser = $postObj->FromUserName;
$fromUser = $postObj->ToUserName;
$time = time();
$msgType = 'text';
$content = '欢迎关注 书旅and良玉 微信公众账号'.$postObj->FromUserName.'-'.$postObj->ToUserName;
$template = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$info = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
echo $info;
}
}
//回复纯文本或单图文消息
if(($postObj->MsgType) == 'text' && trim($postObj->Content) == '夏目友人帐'){
$toUser = $postObj->FromUserName;
$fromUser = $postObj->ToUserName;
$arr = array(
array(
'title'=>'夏目友人帐',
'description'=>"此生无悔入夏目",
'picUrl'=>'http://img4.duitang.com/uploads/item/201508/16/20150816015528_X8dKY.jpeg',
'url'=>'http://www.shulvchen.cn',
),
);
$template = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<ArticleCount>".count($arr)."</ArticleCount>
<Articles>";
foreach($arr as $k=>$v){
$template .="<item>
<Title><![CDATA[".$v['title']."]]></Title>
<Description><![CDATA[".$v['description']."]]></Description>
<PicUrl><![CDATA[".$v['picUrl']."]]></PicUrl>
<Url><![CDATA[".$v['url']."]]></Url>
</item>";
}
$template .="</Articles>
</xml> ";
echo sprintf($template, $toUser, $fromUser, time(), 'news');
}else{
switch( trim($postObj->Content) ){
case 'bb':
$content = '我喜欢你';
break;
case '良玉':
$content = '我喜欢你';
break;
case '书旅':
$content = '加油';
break;
case 'dsdf':
$content = '不愿错过他';
break;
case '垒哥':
$content = '垒哥已死,有事儿烧纸';
break;
case '书旅and良玉':
$content = 'Forever with you';
break;
case '学弟':
$content = '书旅是你学长';
break;
default:
$content = "<a href='http://www.baidu.com'>百度一下,你就知道(点击文字,进入百度)</a>";
}
$template1 = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$fromUser = $postObj->ToUserName;//消息从哪里来
$toUser = $postObj->FromUserName;//发送给谁
$time = time();
//$content = '我喜欢你';
$msgType = 'text';
echo sprintf($template1, $toUser, $fromUser,$time, $msgType, $content);
}
}
}
希望这篇博客对跟我一样喜欢微信开发的小菜鸟们有所帮助