您的位置:首页 > 移动开发 > 微信开发

php开发个人微信公众号总结

2016-11-29 00:00 274 查看
早已听过微信公众号的大名,但想开发个人公众号却并非由来已久,而只是一时兴起。 就像当初做一个个人网站一样,也是一时兴起,还不知道自己能不能做,看到有便宜的云服务器,就想在上面弄出一番花样。 恰巧IT这个行业本来就是日新月异,精髓的东西永远学不完,而新的东西又开始挑逗你的脑细胞。 十年前人们觉得svn十款免费好用的版本控制工具,开发者纷纷奔向它的怀抱。十年后的今天,linux继续统治着着服务器端,托瓦兹"丧心病狂"的发布git。它不再仅仅是个版本控制工具,还支持着分布式,与github搭配着尝试与全世界开发者共享技术的乐土。 于是在这个几乎程序员盛行连隔壁老奶奶都懂修电脑的年代,许许多多的新奇想法,都只差那么一次实践。 开发者不再需要一时兴起,拍脑袋决策,各式各样的开发者文档为好奇而来的人指引着方向。
经过两天的研究,我发现个人公众号(订阅号)也并非是高台楼阁,只有懂门道的人才能知道如何开发。 个人订阅号就是个人人可申请的东西,
微信公众平台就是这个申请的入口,申请成功后便可以每天群发一条消息,也可以定义一些自己的自动回复,这些都不需要任何代码基础做支撑的,仅需登录个人公众平台简单设置便可。
所以单纯想开通个人公众号的,每天发发群消息的,真的无需犹豫,直接开通便可。 我下面要讲的是作为一个开发者去做一个公众号,调用微信的开发接口使得我们有了更多灵活处理的方式,不仅是发出各式各样的模板消息,还有着丰富的功能菜单,甚至微信支付等等一系列的东西,这其中许多都是需要代码去实现的高级功能。 当然作为一个没认证也没法认证的个人订阅号,接口权限就有点少得可怜了,差不多就以下寥寥几项。



但是我们还是可以扯住它漏出的一根毛线,织成一件毛衣的! 实现自定义订阅号,是需要一个第三方服务器的。这里同样给不想敲代码的小伙子一条捷径!那就是去
图灵机器人的官网注册一个账号,然后新建一个用于微信公众号的机器人即可,然后在它的平台把自己的公众号添加进去,并可实现由图灵机器人代理你的消息回复功能。 以上简单也不做讨论。我做公众号的初衷其实也是想给自己一次学习的机会,再为将来的面试做一点铺垫,也能分享一些好的东西给身边的朋友。 于是这个第三方服务器我选择由自己来代理,即是自己的个人云服务器,首先它得拥有一个公网可访问的域名http://findhcq.cn。

第一步,在个人网站的根目录下,新建一个hellohcq.php作为入口文件,基于thinkPHP框架新建thinkPHP文件夹放置。 [code lang="php"] <?php //基于thinkphp框架 //定义项目的名称 define('APP_NAME','Hello丶HCQ'); //定义项目的路径 define('APP_PATH','Hello丶HCQ/'); //引入tp的核心文件 require('./ThinkPHP/ThinkPHP.php'); [/code]

然后在浏览器地址栏输入hellohcq.php的公网访问路径,这里我输入http://findhcq.cn/hellohcq.php

接下来,修改在个人微信公众平台的开发基本配置,这里的url指向网站的入口文件,token可以理解为一个与个人网站后台沟通的暗号,加密密钥随机生成即可,加密方式我这里选择兼容模式,然后暂时不提交。


经过以上两步,这时候个人网站的根目录下会生成一个Hello丶HCQ的文件夹,进入其Home目录下的Controller文件夹,找到IndexController.class.php文件,这是我们编写关键代码的地方。简单查看目录结构会发现,这同样是一个MVC的开发模式,Controller掌管控制层,在这里我们需要拿到微信传来的token即暗号,给出反应,表示允许相关微信使用自己作为第三方服务器的意思。这里代码就一并贴出,并在关键部分做好了注释。 [code lang="php"] <?php namespace Home\Controller; use Think\Controller; use Home\Model\IndexModel; class IndexController extends Controller { public function index(){ //将三个参数按字典排序 $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $echostr = $_GET["echostr"]; $token = "haha";//这里指暗号 $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr); //将排序好的三个参数拼接后sha1加密 $tmpStr = implode($tmpArr); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature &&$echostr){ //第一次接入findhcq api接口的时候 echo $echostr; exit; }else{ $this->reponseMsg(); } } //接收事件推送,并回复 public function reponseMsg(){ //获取微信推送过来的xml格式数据 $postArr = $GLOBALS['HTTP_RAW_POST_DATA']; //处理消息类型,并设置回复类型和内容 $postObj = simplexml_load_string( $postArr ); //判断该数据包是否是订阅的的事件推送,即处理用户关注后的消息推送 if( strtolower( $postObj->MsgType) == 'event'){ //如果是关注 subscribe 事件 if( strtolower($postObj->Event == 'subscribe') ){ //回复用户消息(纯文本格式) $arr = array( array( 'title'=>'感谢您的关注,HCQ定会尽心尽力!', 'description'=>"专注技术分享与交流,共同学习,一起进步!", 'picUrl'=>'http://img.mukewang.com/5533b3350001bfe305800326-200-200.jpg', 'url'=>'http://findhcq.cn', ) ); $indexModel = new IndexModel; $indexModel->responseSubscribe($postObj,$arr); } } //如果用户发过来的消息是文本,并且是HCQ的话 if( strtolower($postObj->MsgType) == 'text' && trim($postObj->Content)=='HCQ' ){ $arr = array( array( 'title'=>'个人网站', 'description'=>"专注技术交流与分享!", 'picUrl'=>'http://img.mukewang.com/5533b3350001bfe305800326-200-200.jpg', 'url'=>'http://findhcq.cn', ) ); $indexModel = new IndexModel; $indexModel->responseNews($postObj,$arr); //注意:进行多图文发送时,子图文个数不能超过10个 }//if end }//reponseMsg end [/code]

控制层掌握关键逻辑,而模型层主要提供消息模板支持,方便调用与管理,在Home目录下的Model目录下,新建IndexModel.class.php文件。 [code lang="php"] <?php class IndexModel extends Model{ //回复多图文类型的微信消息 public function responseNews($postObj ,$arr){ $toUser = $postObj->FromUserName; $fromUser = $postObj->ToUserName; //这里是采用微信提供的图文模板消息,以下同 $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'); } // 回复单文本 public function responseText($postObj,$content){ $template = "<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(); $msgType = 'text'; echo sprintf($template, $toUser, $fromUser, $time, $msgType, $content); } //回复微信用户的关注事件 public function responseSubscribe($postObj, $arr){ $this->responseNews($postObj,$arr); } //回复纯文本 } [/code]

至此,一只简单的个人微信订阅号就实现了,他能对用户的关注事件作出相应图文反馈,并能对关键字进行相应回复,主要功能的实现差不多都这个逻辑,也只需再小修小补,在消息接收功能上再做增强。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: