Loading

PHP语言开发微信公众平台(订阅号)之开启开发者模式(3)

(1)打开上一篇我们从花生壳官网获得的外网网址就会看到localhost根目录下的文件(这里不再赘述php环境的搭建)。注:因为外网网址在能联网时,访问外网网址的任何人都能看到根目录下的所有文件,不仅能看还能执行,故博主推荐实现内网穿透后不要把重要文件放在localhost目录下,毕竟小心驶得万年船。

(2)在localhost根目录新建一个wx文件夹,在文件夹里面新建一个api.php打开新建的api.php并将以下代码复制进去(如下代码中都有相当详细的注释,在此不再解释以下代码)

  1 <?php
  2 /**
  3   * wechat php test
  4   */
  5 header('Content-type:text');
  6 //define your token
  7 //定义TOKEN密钥
  8 define("TOKEN", "weixin");
  9 //实例化微信对象
 10 $wechatObj = new wechatCallbackapiTest();
 11 //验证成功后注释掉valid方法
 12 $wechatObj->valid();
 13 //开启自动回复功能
 14 $wechatObj->responseMsg();
 15 //定义类文件
 16 class wechatCallbackapiTest
 17 {
 18     //实现valid验证方法:实现对接微信公众平台
 19     public function valid()
 20     {
 21         //通过GET请求接收随机字符串
 22         $echoStr = $_GET["echostr"];
 23         //调用checkSignature方法进行用户(开发者)数字签名验证
 24         //valid signature , option
 25         if($this->checkSignature()){
 26             //如果成功,则返回接收到的随机字符串
 27             echo $echoStr;
 28             //并退出
 29             exit;
 30         }
 31     }
 32 
 33     public function responseMsg()
 34     {
 35         //get post data, May be due to the different environments
 36         //接收用户端(客户)发送过来的XML数据
 37         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
 38 
 39           //extract post data
 40         //判断XML数据是否为空
 41         if (!empty($postStr)){
 42                 /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
 43                    the best way is to check the validity of xml by yourself */
 44                 libxml_disable_entity_loader(true);
 45                 //通过simplexml进行xml解析     PHP中有两大类可以完成对XML的解析,1.PHP的Dom模型2.通过simplexml模型
 46                   $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
 47                 //手机端
 48                 $fromUsername = $postObj->FromUserName;
 49                 //微信公众平台
 50                 $toUsername = $postObj->ToUserName;
 51                 //接收用户发送的关键词
 52                 $keyword = trim($postObj->Content);
 53                 //时间戳
 54                 $time = time();
 55                 //文本发送模板
 56                 $textTpl = "<xml>
 57                             <ToUserName><![CDATA[%s]]></ToUserName>
 58                             <FromUserName><![CDATA[%s]]></FromUserName>
 59                             <CreateTime>%s</CreateTime>
 60                             <MsgType><![CDATA[%s]]></MsgType>
 61                             <Content><![CDATA[%s]]></Content>
 62                             <FuncFlag>0</FuncFlag>
 63                             </xml>";   
 64                 //判断用户发送关键词是否为空
 65                 if(!empty( $keyword ))
 66                 {
 67                     //回复类型,如果为"text",代表文本类型
 68                       $msgType = "text";
 69                     //回复内容
 70                     $contentStr = "Welcome to wechat world!";
 71                     //格式化字符串(对xml进行格式化操作,把里面相关的变量格式化成字符串)
 72                     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
 73                     //把XML数据返回给手机端
 74                     echo $resultStr;
 75                 }
 76                 //如果用户发送的关键词为空,则返回下列字符串
 77                 else{
 78                     echo "Input something...";
 79                 }
 80 
 81         }else {
 82             echo "";
 83             exit;
 84         }
 85     }
 86     
 87     //定义checkSignature方法
 88     private function checkSignature()
 89     {
 90         // you must define TOKEN by yourself
 91         
 92         //判断TOKEN密钥是否定义
 93         if (!defined("TOKEN")) {
 94             //如果没有定义则抛出异常,返回'TOKEN is not defined!'字符串
 95             throw new Exception('TOKEN is not defined!');
 96         }
 97         //接收微信加密签名
 98         $signature = $_GET["signature"];
 99         //接收时间戳信息
100         $timestamp = $_GET["timestamp"];
101         //接收随机数
102         $nonce = $_GET["nonce"];
103         //把TOKEN常量赋值给$token变量    
104         $token = TOKEN;
105         //把相关参数组装为数组(密钥文件、时间戳、随机数)
106         $tmpArr = array($token, $timestamp, $nonce);
107         // use SORT_STRING rule
108         //通过字典法进行排序
109         sort($tmpArr, SORT_STRING);
110         //把排序后的数组转化为字符串
111         $tmpStr = implode( $tmpArr );
112         //通过哈希算法对字符串进行加密操作
113         $tmpStr = sha1( $tmpStr );
114         //与加密签名进行对比
115         if( $tmpStr == $signature ){
116             return true;
117         }else{
118             return false;
119         }
120     }
121 }
122 
123 ?>

(3)打开微信公众平台"开发"菜单中的"基本配置"项,并点击"修改配置"

(4)1.进入修改配置页面填写配置信息。这里假设获得的域名为ww,baidu.com,url处填写我们上一篇获得的域名并详细到第二步我们创建的php文件,例:http://www.baidu.com/wx/api.php

2.token处填写我们第二步创建的php文件的第8行定义的token

3.第三项随机生成,第四项根据业务需要选择

4.最后点击提交按钮

(5)提交后,页面顶端会有提示,显示提交成功,则为提交成功;若显示其他,则为提交不成功

(6)此时,服务器配置旁边会显示"已启用"字样。至此微信公众平台的开发者模式已开启,今后我们就可以通过修改api.php文件来修改公众号的功能了注:验证成功后请注释掉api.php文件中的第十二行,因为valid方法仅仅具有验证功能,如果不注释,每运行一遍此文件,就会调一次验证方法,但是验证通过后,不需要再调用此方法){好吧,确实有点绕反正验证通过后注释掉就行了}

 

注:未经允许,禁止转载

posted @ 2017-03-19 00:44  5572  阅读(7505)  评论(2编辑  收藏  举报