PHP微信API的接入和关键字自动回复
https://blog.****.net/self_realian/article/details/70849159
公众账号的使用模式分类
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);
- }
- }
- }
希望这篇博客对跟我一样喜欢微信开发的小菜鸟们有所帮助