(原创)微信公众号开发的简单模板及配置流程简介
2017-06-01 22:19
597 查看
/*
*公司需要,学了一下微信公众号开发,写这篇博客的时候已经开发结束半个月了
*回来记录一下,采用php语言(现学的)进行开发,不足之处还望提出来共同探讨
*/
(原创不易,转载请注明出处!)
提示:目前微信公众号包含订阅号和服务号两种。详细区别官网有介绍,这里要说的是订阅号如果自己配置服务器url的话,是没有自定义菜单栏功能的,因此配置服务器url后只能接受用户的手动输入内容。而服务号需要企业认证,个人无法申请。
一、微信开发环境搭建
1.申请和配置微信公众平台
微信公众平台已经提供了一个很便捷的开发配置方式,这里不在赘述,展示一下配置完的画面,
切记,图中画红色圈的地方一定要点击启用,否则微信客户端的请求无法发送到我们配置的服务器地址。我在这里浪费了一早上的时间,醉了。。。。
2.微信请求的传递流程
稍微解释一下,微信的服务器只是起到转发的作用,将手机客户端的请求转发到我们配置的服务器地址,就是上图看到URL地址。
3.服务器地址文件的编写
这个才是开发的重点啊,下面先贴上本人编写的源码模板,可以直接使用的。
首先是微信界面菜单栏设计的请求,将下面这个php文件放进随便一个php环境运行一下就可以了,目的是让它发出请求就好了。(订阅号配置url后没有权限,会返回失败)
接下来是前面配置的服务器url地址文件,就是那个index.php:(token要改成自己的)
这个只是一个基本的框架,微信公众号还有很多的功能,这里就不一一描述啦,详细的可以看官方的文档,上链接:
微信公众号开发官方文档
有什么错误的还希望大伙儿提出来探讨一下哈~~~
(原创不易,转载请注明出处!)
*公司需要,学了一下微信公众号开发,写这篇博客的时候已经开发结束半个月了
*回来记录一下,采用php语言(现学的)进行开发,不足之处还望提出来共同探讨
*/
(原创不易,转载请注明出处!)
提示:目前微信公众号包含订阅号和服务号两种。详细区别官网有介绍,这里要说的是订阅号如果自己配置服务器url的话,是没有自定义菜单栏功能的,因此配置服务器url后只能接受用户的手动输入内容。而服务号需要企业认证,个人无法申请。
一、微信开发环境搭建
1.申请和配置微信公众平台
微信公众平台已经提供了一个很便捷的开发配置方式,这里不在赘述,展示一下配置完的画面,
切记,图中画红色圈的地方一定要点击启用,否则微信客户端的请求无法发送到我们配置的服务器地址。我在这里浪费了一早上的时间,醉了。。。。
2.微信请求的传递流程
稍微解释一下,微信的服务器只是起到转发的作用,将手机客户端的请求转发到我们配置的服务器地址,就是上图看到URL地址。
3.服务器地址文件的编写
这个才是开发的重点啊,下面先贴上本人编写的源码模板,可以直接使用的。
首先是微信界面菜单栏设计的请求,将下面这个php文件放进随便一个php环境运行一下就可以了,目的是让它发出请求就好了。(订阅号配置url后没有权限,会返回失败)
<?php /* 以下两项可登陆微信公众平台查看 */ $appid = "******************"; $appsecret = "******************"; /* 菜单设计 */ $menu = array( 'button' => array( array('name'=>'菜单一','sub_button'=>array( array('type'=>'click', 'name'=>'二级菜单', 'key'=>'13'), array('type'=>'view','name'=>'百度','url'=>'www.baidu.com'), ) ), array('name'=>'菜单二','sub_button'=>array( array('type'=>'view','name'=>'卡种查询','url'=>'www.baidu.com'), array('type'=>'click', 'name'=>'百度', 'key'=>'21'), ) ), array('name'=>'菜单三','sub_button'=>array( array('type'=>'view', 'name'=>'百度', 'url'=>'www.baidu.com'), ) ), ) ); /* 发起更新菜单用的curl请求 */ function https_request($url,$data = null) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); if (!empty($data)) { curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); curl_close($curl); return $output; } /* 去除php版本的影响 */ function json_encode_ex($value) { if (version_compare(PHP_VERSION,'5.4.0','<')) { $str = json_encode($value); $str = preg_replace_callback( "#\\\u([0-9a-f]{4})#i", function($matchs) { return iconv('UCS-2BE', 'UTF-8', pack('H4', $matchs[1])); }, $str ); return $str; } else { return json_encode($value, JSON_UNESCAPED_UNICODE); } } /* 发起请求 */ $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}"; $result = https_request($url); $jsoninfo = json_decode($result, true); $access_token = $jsoninfo["access_token"]; $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token; $jsonmenu = json_encode_ex($menu); $result = https_request($url, $jsonmenu); var_dump($result); ?>
接下来是前面配置的服务器url地址文件,就是那个index.php:(token要改成自己的)
<?php require "./menu.class.php"; //引进回复的文件 define("TOKEN", "******"); //设置token常量,这里是*号,要改成你自己在微信公众号平台设置的token $wechatObj = new wechatCallbackapiTest(); //实例化wechatCallbackapiTest对象 //$wechatObj->valid(); //验证消息来自微信服务器第一次使用就行 $wechatObj->responseMsg(); //处理消息 class wechatCallbackapiTest { /** * 接受处理微信服务器发送过来的消息 */ public function responseMsg() { /*获取post数据(XML类型)*/ $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; if(!empty($postStr)){//判断获取到的XML数据是否为空 /* 解析XML数据 */ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); /* 获取发信方的用户名 */ $fromUsername = $postObj->FromUserName; /* 获取消息类型(event 事件 | text 文本)*/ $RX_TYPE = trim($postObj->MsgType); /* 根据 消息类型 进行跳转 */ switch ($RX_TYPE) { //点击事件 case "event": $resultStr = $this->receiveEvent($postObj, $user); break; //文本输入事件 case "text": $resultStr = $this->receiveText($postObj, $user); break; //其他 default: $resultStr = "unknow msg type: ".$RX_TYPE; break; } }else{ //XML数据为空,do nothing... } } /** * 点击事件接口 */ protected function receiveEvent($postObj, $user){ /* 获取收发方 */ $fromUsername = $postObj->FromUserName; //得到发送方名称 $toUsername = $postObj->ToUserName; //得到接收方的名称 /*event事件的类型(subscribe 新用户订阅事件 | CLICK 点击回复请求 | VIEW 界面请求)*/ $event_type = trim($postObj->Event); /* 生成一个menu对象,定义在menu.calss.php文件 */ $menu=new menu(); /*事件处理*/ if($event_type == "subscribe"){//新用户订阅事件处理 $sendData = array( "act" => "asyn_send_adduser" , "bind_openid" => $fromUsername , "bind_key" => '147258' , ); $menu->Welcome_Words($fromUsername,$toUsername);//新用户欢迎词(我封装好的接口,后面会附上) } else if($event_type == "CLICK") { switch (trim($postObj->EventKey))//对用户请求的key进行筛选 { case "13": $data="Hi,你好~"; $result=$menu->Output_Text_Message($data,$fromUsername,$toUsername); echo $result; break; case "21": $data="Hi,你好~"; $result=$menu->Output_Text_Message($data,$fromUsername,$toUsername); echo $result; break; default : $data = "没有该菜单"; $result=$menu->Output_Text_Message($data,$fromUsername,$toUsername); echo $result; break; } exit(1); } } /** * 文本消息事件接口 */ protected function receiveText($postObj, $user){ /* 获取收发方 */ $fromUsername = $postObj->FromUserName; //得到发送方名称 $toUsername = $postObj->ToUserName; //得到接收方的名称 /*获取当前时间*/ $time = time(); /* 生成一个menu对象,定义在menu.calss.php文件 */ $menu=new menu(); /*消息内容处理*/ if(is_numeric($keyword))//用户输入了纯数字 { $data="Hi,你输入了数字!"; $result=$menu->Output_Text_Message($data,$fromUsername,$toUsername); echo $result; } else {//其他情况 $data="Hi,你输入了其他内容!"; $result=$menu->Output_Text_Message($data,$fromUsername,$toUsername); echo $result; } } /** * 验证消息是否来自微信服务器(入口) */ protected function valid() { $echoStr = $_GET["echostr"]; //收集get数据(随机字符串) if($this->checkSignature()){ //判断checkSignature()自定义函数结果(验证微信服务器) echo $echoStr; //为真则输出结果(随机字符串) } } /** * 验证消息是否来自微信服务器 */ private function checkSignature() { $signature = $_GET["signature"]; //微信加密签名 $timestamp = $_GET["timestamp"]; //时间戳 $nonce = $_GET["nonce"]; //随机数 $token = TOKEN; //token与上面对应 $tmpArr = array($token, $timestamp, $nonce); //组装创建数组 sort($tmpArr, SORT_STRING); //把$tmpArr做字符串处理并排序(升序) $tmpStr = implode( $tmpArr ); //将数组变成字符串 $tmpStr = sha1( $tmpStr ); //计算字符串散列 if( $tmpStr == $signature ){ //判断是否一致 return true; //符合返回真 }else{ return false; //否则返回假 } } } ?>接下来是我封装好的menu类:
<?php class menu { /* 文本输出 */ function Output_Text_Message($data,$fromUsername,$toUsername){ $time = time(); $msgType="text"; $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $data); return $resultStr; } /* 新用户关注欢迎词 */ function Welcome_Words($fromUsername,$toUsername) { $data = "欢迎关注福建通联支付,点击菜单进入更多功能哦~".$this->bytes_to_emoji(0x1F604); $resultStr=$this->Output_Text_Message($data,$fromUsername,$toUsername); echo $resultStr; } /* 错误信息提示 */ function Input_Error($fromUsername,$toUsername) { $data="输入内容有误,请检查格式,重新输入哈~~~"; $show=$this->Output_Text_Message($data,$fromUsername,$toUsername); return $show; } /* 字节转Emoji表情 */ function bytes_to_emoji($cp) { if ($cp > 0x10000){ # 4 bytes return chr(0xF0 | (($cp & 0x1C0000) >> 18)).chr(0x80 | (($cp & 0x3F000) >> 12)).chr(0x80 | (($cp & 0xFC0) >> 6)).chr(0x80 | ($cp & 0x3F)); }else if ($cp > 0x800){ # 3 bytes return chr(0xE0 | (($cp & 0xF000) >> 12)).chr(0x80 | (($cp & 0xFC0) >> 6)).chr(0x80 | ($cp & 0x3F)); }else if ($cp > 0x80){ # 2 bytes return chr(0xC0 | (($cp & 0x7C0) >> 6)).chr(0x80 | ($cp & 0x3F)); }else{ # 1 byte return chr($cp); } } } ?>到此,一个完整的微信公众平台就搭建完成啦~
这个只是一个基本的框架,微信公众号还有很多的功能,这里就不一一描述啦,详细的可以看官方的文档,上链接:
微信公众号开发官方文档
有什么错误的还希望大伙儿提出来探讨一下哈~~~
(原创不易,转载请注明出处!)
相关文章推荐
- 原创:超简单!windows配置NDK开发环境使用JNI
- CUDA开发的配置方法与编译流程简介
- 微信公众号PHP简单开发流程
- 微信公众号开发(二):利用责任链和模板方法模式设计消息的处理流程
- python微信公众号开发简单流程
- MVC框架之—Struts原理简介与简单开发流程部署
- 简单介绍一下微信公众号的开发流程
- MVC框架之—Struts原理简介与简单开发流程部署
- 微信公众号PHP简单开发流程
- CUDA开发的配置方法与编译流程简介
- JAVAWEB开发之Solr的入门——Solr的简介以及简单配置和使用、solrJ的使用、Solr数据同步插件
- ADS开发简介(二) 环境配置和工具使用
- Struts2.0 (开发之一)--简介与简单登录的实现--CTO
- OpenCms JSP 模板开发——创建一个简单的JSP模板
- 跨平台GUI--Qt ACER Aspire on Linux 开发环境安装配置(QT + GCC ) (原创)
- petshop4.0 简单流程 学习 适合菜鸟 (原创)
- OpenCms JSP 模板开发——创建一个简单的JSP模板
- 简单驱动开发配置
- OpenCms JSP 模板开发——创建一个简单的JSP模板
- (原创)OGRE主要渲染流程简介