微信应用开发-个人订阅号开发模式接入

 

一、打开开发者模式

1.

请登录微信官网:http://mp.weixin.qq.com

进入后台-基本配置。打开开发模式。

 

先要上传index.php文件到新浪云【右键commit就好】;

 

  1. 根据已经申请成功的SAE云端可用域名(其它可用域名也可)和自定义的Token进行对接。
  2. 填写【接口配置信息】

如果提交验证失败请访问:debug.fangbei.org进行在线调试,直到成功

测试是否成功:

关注后能够在手机端进行发送文本、语音、图片、视频、地理位置并进行自动回复。

 

 

 

 

 

 index.php代码详细解析:

参考文档:https://www.cnblogs.com/mchina/archive/2013/06/07/3120592.html

 

  1 <?php
  2 /**
  3  * Created by PhpStorm.
  4  * Date: 2020/5/22
  5  * Time: 15:54
  6  * Content:接口文件
  7  *
  8  */
  9 
 10 header('Content-type:text');
 11 //定义token,token很重要在应用中要注意保密
 12 define("TOKEN", "weixin");
 13 /**将class wechatCallbackapiTest类实例化
 14  * 新建一个wechatCallbackapiTest类型对象wechatObj
 15  * 下面有wechatCallbackapiTest类
 16  */
 17 $wechatObj = new wechatCallbackapiTest();
 18 
 19 //对接请求那么请求中包含'echostr'
 20 //全局变量$_GET
 21 if (isset($_GET['echostr'])) { //echostr存在的话去执行wechatObj类中的valid函数
 22     $wechatObj->valid();//使用->访问类中valid方法,用来验证开发模式
 23 } else {//echostr不存在的话去执行wechatObj类中的responseMsg函数
 24     $wechatObj->responseMsg();
 25 }
 26 
 27 
 28 /**
 29  *声明一个类 wechatCallbackapiTest,该类中包含有三个方法(函数)。
 30  * signature    微信加密签名,
 31  * signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
 32  * timestamp    时间戳
 33  * nonce    随机数
 34  * echostr    随机字符串
 35  */
 36 class wechatCallbackapiTest
 37 {
 38 //验证接口的函数,用于申请成为开发者时向微信发送验证信息。
 39     public function valid()
 40     {
 41 //从微信用户端获取一个随机字符赋予变量echostr
 42         $echoStr = $_GET["echostr"];
 43 //valid signature,option访问地的checkSignature函数签名验证方法,
 44 //如果签名一致,输出变量echostr,完整验证配置接口的操作
 45 /**this在OOP中就是伪变量,
 46  * (伪变量不是真正的变量,只是形式上是变量,变量中存储的是固定的值,$this中并没有,哪个对象调用,$this就代表哪个对象)
 47  * 同时,也可以将$this理解为对象的引用,$this通过引用的形式访问一个对象的方法和属性
 48  * 所以$this代表这个类wechatCallbackapiTest
 49  **/
 50         if ($this->checkSignature()) {//函数在下面
 51             echo $echoStr;
 52             exit;
 53         }
 54     }
 55 
 56 //校验函数,校验对接身份函数,签名验证程序
 57     private function checkSignature()
 58     {
 59 //从用户端获取参数signature的值再赋值给变量signature(签名)
 60 //获取参数timestamp的值再赋值给变量timestamp(时间戳)
 61 //获取参数nonce的值再赋值给变量nonce(随机数、临时数)
 62         $signature = $_GET["signature"];
 63         $timestamp = $_GET["timestamp"];
 64         $nonce = $_GET["nonce"];
 65 //将TOKEN赋值给变量token(就是固定值"weixin")
 66         $token = TOKEN;
 67 //数组变量tmpArr,存储$token, $timestamp, $nonce
 68         $tmpArr = array($token, $timestamp, $nonce);
 69 //新建排序,将token、timestamp、nonce三个参数进行字典序排序
 70         sort($tmpArr);
 71 //implode() 函数返回由数组元素组合成的字符串
 72         $tmpStr = implode($tmpArr);
 73 //shal加密!!!
 74         $tmpStr = sha1($tmpStr);
 75 
 76         if ($tmpStr == $signature) {
 77             return true;
 78         } else {
 79             return false;
 80         }
 81     }
 82 
 83 
 84 //响应消息函数
 85 //发送问号响应回复用户时间
 86     public function responseMsg()
 87     {
 88 //接收微信公众平台发送过来的用户消息,
 89 //该消息数据结构为XML,不是php默认的识别数据类型,
 90 //因此这里用了$GLOBALS['HTTP_RAW_POST_DATA']来接收,
 91 //同时赋值给了$postStr
 92         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
 93 
 94         if (!empty($postStr)) {
 95 
 96             $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
 97 //将对象$postObj中的发送消息用户的OPENID赋值给$fromUsername变量
 98             $fromUsername = $postObj->FromUserName;
 99 //将对象$postObj中的公众账号的ID赋值给$toUsername变量
100             $toUsername = $postObj->ToUserName;
101 //trim() 函数从字符串的两端删除空白字符和其他预定义字符,这里就可以得到用户输入的关键词
102             $keyword = trim($postObj->Content);
103 //time() 函数返回当前时间的 Unix 时间戳,即自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。
104             $time = time();
105 //xml的数据格式,存放微信输出内容的模板
106             $textTpl = "<xml>
107                         <ToUserName><![CDATA[%s]]></ToUserName>
108                         <FromUserName><![CDATA[%s]]></FromUserName>
109                         <CreateTime>%s</CreateTime>
110                         <MsgType><![CDATA[%s]]></MsgType>
111                         <Content><![CDATA[%s]]></Content>
112                         <FuncFlag>0</FuncFlag>
113                         </xml>";
114             if ($keyword == "学号") {
115                 $msgType = "text";
116                 $content = "1111111";
117                 $result = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content);
118                 echo $result;
119             }
120             if ($keyword == "?" || $keyword == "?") {//两个问号不一样,一个中文一个英文
121                 $msgType = "text";
122                 $content = date("Y-m-d H:i:s", time());
123                 $result = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content);
124                 echo $result;
125             }
126         } else {
127             echo "";
128             exit;
129         }
130     }
131 }
index.php

 

没有注解的index.php

 1 <?php
 2 header('Content-type:text');
 3 define("TOKEN", "weixinac");
 4 $wechatObj = new wechatCallbackapiTest();
 5 if (isset($_GET['echostr'])) { 
 6     $wechatObj->valid();
 7 } else {
 8     $wechatObj->responseMsg();
 9 }
10 
11 class wechatCallbackapiTest
12 {
13 //验证接口的函数,用于申请成为开发者时向微信发送验证信息。
14     public function valid()
15     {
16         $echoStr = $_GET["echostr"];
17         if ($this->checkSignature()) {
18             echo $echoStr;
19             exit;
20         }
21     }
22 //校验函数,校验对接身份函数,签名验证程序
23     private function checkSignature()
24     {
25         $signature = $_GET["signature"];
26         $timestamp = $_GET["timestamp"];
27         $nonce = $_GET["nonce"];
28         $token = TOKEN;
29         $tmpArr = array($token, $timestamp, $nonce);
30         sort($tmpArr);
31         $tmpStr = implode($tmpArr);
32         $tmpStr = sha1($tmpStr);
33         if ($tmpStr == $signature) {
34             return true;
35         } else {
36             return false;
37         }
38     }
39 //响应消息函数
40     public function responseMsg()
41     {
42         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
43         if (!empty($postStr)) {
44             $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
45             $fromUsername = $postObj->FromUserName;
46             $toUsername = $postObj->ToUserName;
47             $keyword = trim($postObj->Content);
48             $time = time();
49             $textTpl = "<xml>
50                         <ToUserName><![CDATA[%s]]></ToUserName>
51                         <FromUserName><![CDATA[%s]]></FromUserName>
52                         <CreateTime>%s</CreateTime>
53                         <MsgType><![CDATA[%s]]></MsgType>
54                         <Content><![CDATA[%s]]></Content>
55                         <FuncFlag>0</FuncFlag>
56                         </xml>";
57             if ($keyword == "学号") {
58                 $msgType = "text";
59                 $content = 1111111
60                 $result = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content);
61                 echo $result;
62             }
63             if ($keyword == "?" || $keyword == "?") {//两个问号不一样,一个中文一个英文
64                 $msgType = "text";
65                 $content = date("Y-m-d H:i:s", time());
66                 $result = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content);
67                 echo $result;
68             }
69         } else {
70             echo "";
71             exit;
72         }
73     }
74 }
index.php

 

 

注:若是index.php代码有所修改

 

所以需要先commit到服务器

 

 

 

 

点击ok就好啦。

 

 

 

2020/5/22


 

posted @ 2020-05-22 16:58  九鸩  阅读(510)  评论(0编辑  收藏  举报