当前位置:   article > 正文

PHP开发微信公众平台一、根据消息类型回复消息_php 微信公众号 自定义回复

php 微信公众号 自定义回复

1.微信公众平台开发

1.1开发者模式

1).微信公众平台账号(http://mp.weixin.qq.com)

订阅号:个人版用户,每天可群发一条消息

服务号:企业版用户,每月可以发送四条消息

2).在线虚拟主机或者服务器,(SAM云引擎,BAE云引擎,阿里云服务器)

3).TortoiseSVN(SVN客户端软件),把代码放到服务器上

1.2开发原理图

解释:手机端用户发送消息到腾讯服务器,腾讯服务器的内部源代码解析后发送给我们自定义的放服务器,其中TortoiseSVN主要是把我们自己的源代码放到自定义服务其中,自定义服务器通过内部源代码处理腾讯服务器发过来的xml,再返回给腾讯服务器,腾讯服务器经过 处理再返回给用户,实现完整流程。

2.申请测试号,配置接口信息

 代码如下

  1. <?php
  2. /**
  3. * wechat php test
  4. */
  5. //define your token
  6. //定义TOKEN密钥
  7. define("TOKEN", "weixin");
  8. //实例化微信对象
  9. $wechatObj = new wechatCallbackapiTest();
  10. //验证成功后注释掉valid功能
  11. // $wechatObj->valid();
  12. //开启自动回复功能
  13. $wechatObj->responseMsg();
  14. //定义类文件
  15. class wechatCallbackapiTest
  16. {
  17. //实现valid验证方法:实现对接微信公众平台
  18. public function valid()
  19. {
  20. //通过get请求接收随机字符串
  21. $echoStr = $_GET["echostr"];
  22. //valid signature , option
  23. //进行用户数字签名验证
  24. if($this->checkSignature()){
  25. //如果成功,则返回接收到的随机字符串
  26. echo $echoStr;
  27. //退出
  28. exit;
  29. }else{
  30. echo 'cuowu';
  31. }
  32. }
  33. //定义自动回复功能
  34. public function responseMsg()
  35. {
  36. //get post data, May be due to the different environments
  37. //接收用户端发送过来的xml数据
  38. // $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
  39. $postStr = file_get_contents("php://input");
  40. //extract post data
  41. //判断xml数据是否为空
  42. if (!empty($postStr)){
  43. //通过simplexml进行xml解析
  44. $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  45. //手机端
  46. $fromUsername = $postObj->FromUserName;
  47. //微信公众平台
  48. $toUsername = $postObj->ToUserName;
  49. echo $toUsername;
  50. //接收用户发送的关键词
  51. $keyword = trim($postObj->Content);
  52. //接收用户消息类型
  53. $msgType = $postObj->MsgType;
  54. echo $msgType;
  55. //时间戳
  56. $time = time();
  57. //文本发送模板
  58. $textTpl = "<xml>
  59. <ToUserName><![CDATA[%s]]></ToUserName>
  60. <FromUserName><![CDATA[%s]]></FromUserName>
  61. <CreateTime>%s</CreateTime>
  62. <MsgType><![CDATA[%s]]></MsgType>
  63. <Content><![CDATA[%s]]></Content>
  64. <FuncFlag>0</FuncFlag>
  65. </xml>";
  66. if($msgType=='text'){
  67. //判断用户发送关键词是否为空
  68. if(!empty( $keyword ))
  69. {
  70. //回复类型,如果为"text",代表文本类型
  71. $msgType = "text";
  72. //回复内容
  73. $contentStr = "你发送的是文本消息";
  74. //格式化字符串
  75. $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
  76. //把xml数据返回给手机端
  77. echo $resultStr;
  78. }else{
  79. echo "Input something...";
  80. }
  81. }elseif($msgType=="image"){
  82. //回复类型,如果为"text",代表文本类型
  83. $msgType = "text";
  84. //回复内容
  85. $contentStr = "你发送的是图片消息";
  86. //格式化字符串
  87. $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
  88. //把xml数据返回给手机端
  89. echo $resultStr;
  90. }elseif($msgType=="voice"){
  91. //回复类型,如果为"text",代表文本类型
  92. $msgType = "text";
  93. //回复内容
  94. $contentStr = "你发送的是语音消息";
  95. //格式化字符串
  96. $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
  97. //把xml数据返回给手机端
  98. echo $resultStr;
  99. }elseif($msgType=="shortvideo"){
  100. //回复类型,如果为"text",代表文本类型
  101. $msgType = "text";
  102. //回复内容
  103. $contentStr = "你发送的是短视频消息";
  104. //格式化字符串
  105. $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
  106. //把xml数据返回给手机端
  107. echo $resultStr;
  108. }
  109. elseif($msgType=="video"){
  110. //回复类型,如果为"text",代表文本类型
  111. $msgType = "text";
  112. //回复内容
  113. $contentStr = "你发送的是视频消息";
  114. //格式化字符串
  115. $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
  116. //把xml数据返回给手机端
  117. echo $resultStr;
  118. }
  119. }else {
  120. echo "";
  121. exit;
  122. }
  123. }
  124. //定义checkSignature
  125. private function checkSignature()
  126. {
  127. //判断TOKEN密钥是否定义
  128. if(!defined("TOKEN")){
  129. //如果没有定义抛出异常
  130. throw new Exception('TOKEN is not defined!');
  131. }
  132. //接收微信加密签名
  133. $signature = $_GET["signature"];
  134. //接收时间戳
  135. $timestamp = $_GET["timestamp"];
  136. //接收随机数
  137. $nonce = $_GET["nonce"];
  138. //把TOKEN常量赋值给$token变量
  139. $token = TOKEN;
  140. //把相关参数组装成数组(密钥,时间戳,随机数)
  141. $tmpArr = array($token, $timestamp, $nonce);
  142. //通过字典法进行排序
  143. sort($tmpArr);
  144. //把排序后的数组转化成字符串
  145. $tmpStr = implode( $tmpArr );
  146. //通过哈希算法对字符串进行加密
  147. $tmpStr = sha1( $tmpStr );
  148. //与加密签名进行对比
  149. if( $tmpStr == $signature ){
  150. return true;
  151. }else{
  152. return false;
  153. }
  154. }
  155. }
  156. ?>

3.回复功能测试

就是上述代码,$GLOBALS好多没有打开,建议用下图

 

4.测试

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/341489
推荐阅读
相关标签
  

闽ICP备14008679号