微信公众号开发–接入

微信公众号开发
  微信开发者工具:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html
  需要绑定开发者账号:微信公众平台–开发者工具–web开发者工具–绑定开发者微信号
  微信公众平台接口调试工具:https://mp.weixin.qq.com/debug/
  接口调试需要使用“access_token”,access_token的获取需要从在基本设置中的url访问获取,其他终端基本无法获取
 
1.公众号类型
  (1)订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证前后都是每天只可以群发一条消息;
  (2)服务号:主要偏于服务交互(类似银行,114,提供服务查询),认证前后都是每个月 可群发4条消息;
  (3)企业号:主要用于公司内部通讯使用,需要先验证身份才可以关注成功企业号。
 
技术分享图片
2.微信公众号开发类型:
·设置模式:无需认证,无代码需求,完全依据微信官方管理平台,小白操作,功能有限
·浅交互模式:无需认证,需对接自己的服务器,可在服务器上部署自定义的消息规则,可实现以下接口的自定义交互
技术分享图片
 
技术分享图片
·深度交互模式:微信认证,获取更高级权限
3.微信公众号接入
(1)微信公众平台–开发–基本配置
技术分享图片
技术分享图片
技术分享图片
 
技术分享图片
APPID:公众号唯一标识,连接服务的基本账号,例如:“wx123456”
appsecret:标识密码,例如:“abcdefg”
url:填写自己服务器目录下接收微信消息的文件,例如:http://服务器域名/../wechatMsgAction.php
token:任意字符串,例如“token”
EncodingAESKey:随机生成密钥,例如:“aaaaaaaaaaaaaaaaaaa”
(2)接入操作
·民间接入方式
https://www.cnblogs.com/ganwenjun/p/7143254.html
编辑wechatMsgAction.php文件
 
 1 <?php
 2 define("APPID","wx123456");//填写自己的APPID
 3 define("APPSECRET","abcdefg");//填写自己的APPSECRET
 4 define("TOKEN", "token");//token随便填,只要一致就行。
 5 $wechat = new wechat();
 6 $wechat->valid();//微信公众号安全验证
 7   
 8 class wechat{
 9     private $_appid;
10     private $_appsecret;
11     private $_token;
12     public function __construct(){
13         $this->_appid =APPID;
14         $this->_appsecret =APPSECRET;
15         $this->_token =TOKEN;
16     }
17     /**
18       *接入微信平台时验证
19     **/
20     public function valid()//检查安全性
21     {
22         $echoStr = $_GET["echostr"];
23   
24         //valid signature , option
25         if($this->checkSignature()){//检查签名是否一致
26             echo $echoStr;//验证成功后,输出
27             exit;
28         }
29     }
30     /**
31       *验证签名
32     **/
33     private function checkSignature()
34     {
35         $signature = $_GET["signature"];
36         $timestamp = $_GET["timestamp"];
37         $nonce = $_GET["nonce"];
38         $token = TOKEN;
39         $tmpArr = array($token, $timestamp, $nonce);
40         sort($tmpArr, SORT_STRING);
41         $tmpStr = implode( $tmpArr );
42         $tmpStr = sha1( $tmpStr );
43           
44         if( $tmpStr == $signature ){
45             return true;
46         }else{
47             return false;
48         }
49     }
50 }

 

官方接入方式:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319
官方接入demo:
PHP示例代码下载:下载
 
(3)接入
确认将wechatMsgAction.php文件放在服务器配置中url所写的对应位置(如http://服务器域名/../wechatMsgAction.php)后,点击“提交”,若提示成功,则配置成功,否则自行排错
 
(4)验证URL有效性成功后即接入生效,成为开发者。你可以在公众平台网站中申请微信认证,认证成功后,将获得更多接口权限,满足更多业务需求。
成为开发者后,用户每次向公众号发送消息、或者产生自定义菜单、或产生微信支付订单等情况时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件
,开发者可以依据自身业务逻辑进行响应,如回复消息。
 
4.接收推送
技术分享图片
 
技术分享图片
微信服务器在发给己方服务器的xml中的参数“MsgType”负责告诉己方服务器,用户操作的类型。
MsgType
Event
信息类型
text
 
用户发送了文本消息
image
 
用户发送了图片消息
voice
 
用户发送了语音消息
video
 
用户发送了视频消息
shortvideo
 
用户发送了小视频消息
location
 
用户发送了地理位置消息
link
 
用户发送了连接消息
event
subscribe
用户关注了公众号
event
unsubscribe
用户取消关注了公众号
event
subscribe+ EventKey
用户通过扫描带参二维码关注了公众号
event
SCAN
已关注公众号的用户扫描了带参数二维码
event
LOCATION
用户进入公众号时上报地理位置
event
CLICK
用户点击菜单拉取消息
event
VIEW
用户点击菜单跳转链接
具体参考
用户发送消息:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453
用户操作事件:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454
在微信服务器推送的消息中的关键字段:
ToUserName
开发者微信号,是接收推送的开发者
FromUserName
发送方帐号(一个OpenID),用户相对于公众号的唯一标识
 
5.事件处理

直接修改wechatMsgAction.php,添加事件处理函数,并使微信公众号推送事件调用该函数。

 1 define("APPID","wx123456");//填写自己的APPID
 2 define("APPSECRET","abcdefg");//填写自己的APPSECRET
 3 define("TOKEN", "token");//token随便填,只要一致就行。
 4 $wechat = new wechat();
 5 $WeChatMessage->Action();//不同于第三步的调用,此处是处理事件的函数
 6 class WeChatMessage{
 7     public function Action(){
 8   /*获得请求时POST:XML字符串不能用$_POST获取,因为没有key*/
 9         $xml_str = $GLOBALS[‘HTTP_RAW_POST_DATA‘];
10         if(empty($xml_str)){
11             die(‘‘);
12         }
13         if(!empty($xml_str)){
14             // 解析该xml字符串,利用simpleXML
15             libxml_disable_entity_loader(true);
16             //禁止xml实体解析,防止xml注入
17               $request_xml = simplexml_load_string($xml_str, ‘SimpleXMLElement‘, LIBXML_NOCDATA);
18             //判断该消息的类型,通过元素MsgType
19             switch ($request_xml->MsgType){
20                 case ‘event‘:
21                     //判断具体的时间类型(关注、取消、点击)
22                     $event = $request_xml->Event;
23                     $Ticket = $request_xml->Ticket;
24                       if ($event==‘subscribe‘&&$Ticket==‘‘) { // 普通关注事件
25                           $this->_doSubscribe($request_xml);
26                       }
27                       if ($event==‘subscribe‘&&$Ticket!=‘‘) {//扫描渠道二维码关注
28                           $this->_doQRSubscribe($request_xml);
29                       }
30                       if ($event==‘SCAN‘&&$Ticket!=‘‘) {//已关注公众号扫描渠道二维码事件
31                           $this->_doSCAN($request_xml);
32                       }
33                       break;
34                 case ‘text‘://文本消息
35                     $this->_doText($request_xml);
36                     break;
37                 case ‘image‘://图片消息
38                     $this->_doImage($request_xml);
39                     break;
40                 case ‘voice‘://语音消息
41                     $this->_doVoice($request_xml);
42                     break;
43                 case ‘video‘://视频消息
44                     $this->_doVideo($request_xml);
45                     break;
46                 case ‘shortvideo‘://短视频消息
47                     $this->_doShortvideo($request_xml);
48                     break;
49                 case ‘location‘://位置消息
50                     $this->_doLocation($request_xml);
51                     break;
52                 case ‘link‘://链接消息
53                     $this->_doLink($request_xml);
54                     break;
55               }        
56          }  
57     }
58 }

 

 
根据MsgType,判断事件类型进行处理(_do*()是对应的处理函数,自行编写),当然,也可以依据其他信息处理事件(此代码为网上摘来的,如果知道原著线索,请联系我)
 
 
 
5.常用概念
access_token:
·access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用 access_token。
·开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。
·access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效
· 公众号和小程序均可以使用AppID和AppSecret调用本接口来获取access_token。
· access_token只能通过在IP白名单中的服务器调用接口才能被获取到
OpenID:
·在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID
·它加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同。
·公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
 
6.回复消息模板
己方服务器向用户回复(发送)消息时,遵循一定的xml格式
具体参考:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543
 
7.请求方式
根据接口请求需要,使用curl函数调用接口
参考:https://www.cnblogs.com/CHEUNGKAMING/p/5717429.html
get请求:
 1 //初始化
 2     $curl = curl_init();
 3     //设置抓取的url
 4     curl_setopt($curl, CURLOPT_URL, ‘http://www.baidu.com‘);
 5     //设置头文件的信息作为数据流输出
 6     curl_setopt($curl, CURLOPT_HEADER, 1);
 7     //设置获取的信息以文件流的形式返回,而不是直接输出。
 8     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 9     //执行命令
10     $data = curl_exec($curl);
11     //关闭URL请求
12     curl_close($curl);
13     //显示获得的数据
14     print_r($data);

 

post请求:
 
 1 //初始化
 2     $curl = curl_init();
 3     //设置抓取的url
 4     curl_setopt($curl, CURLOPT_URL, ‘http://www.baidu.com‘);
 5     //设置头文件的信息作为数据流输出
 6     curl_setopt($curl, CURLOPT_HEADER, 1);
 7     //设置获取的信息以文件流的形式返回,而不是直接输出。
 8     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 9     //设置post方式提交
10     curl_setopt($curl, CURLOPT_POST, 1);
11     //设置post数据
12     $post_data = array(
13         "username" => "coder",
14         "password" => "12345"
15         );
16     curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
17     //执行命令
18     $data = curl_exec($curl);
19     //关闭URL请求
20     curl_close($curl);
21     //显示获得的数据
22     print_r($data);

8.主动推送消息
需认证,调用客服消息接口
具体参考:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140547
 
现在只是模糊向的开发操作,如果有错误,请联系我。
在完成这些操作时,参考了一些其他博文,但当时没有好习惯,用完就找不到了,如果有知道线索的请联系我。