一、打开开发者模式
1.
请登录微信官网:http://mp.weixin.qq.com
进入后台-基本配置。打开开发模式。
- 根据已经申请成功的SAE云端可用域名(其它可用域名也可)和自定义的Token进行对接。
- 填写【接口配置信息】
如果提交验证失败请访问:debug.fangbei.org进行在线调试,直到成功
测试是否成功:
关注后能够在手机端进行发送文本、语音、图片、视频、地理位置并进行自动回复。
代码详细解析:
参考文档: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
2020/5/22