php微信公众号开发,入门篇(实现了关注公众号发送欢迎信息,发关键词自回复)

时间:2024-02-16 08:38:13

 大致效果如下图所示!

一、入门经历

首先我看的慕课网的视频,理论的东西还不错,可是跟着把代码敲一遍的时候就没懵逼了,除了验证服务器通过之外,

关注公众号根本不会自动回复,着急呀,再找其他的,敲完代码,再测试依然不行,折磨人呀!于是我重新来排查一遍,

说下都排查了哪些些:

第一:用的订阅号没问题(有在关注时回复信息的功能)

第二:开发用的服务器的公网开发地址(要直接指向自己的程序)要配置好

第三:服务器上的文件目录要和第二部的网址对应起来,检测也没问题

 

然后我就各种检查代码,结果一次次失败,关注公众号就是不会回复欢迎信息,我没放弃,不断尝试,换了其他方式,比如下载别人的

源代码,结果也是徒劳,搞得我都认为不是代码出错了,而是其他环节出错了,而事实证明只要你能成功验证服务器,那么就可以进行开发

出错的话,就是程序的问题,果不其然,我又尝试了一份源码,结果可以用,好开心呀,下面把源码粘上,谢谢大家耐心看我吐槽!

二、入门经历

下面为index.php只有这一个页面就实现了回复欢迎信息及发送关键词回复信息的功能

  1 <?php
  2 /**
  3  * wechat php test
  4  */
  5  
  6 //define your token
  7 define("TOKEN", "weixin");
  8 $wechatObj = new wechatCallbackapiTest();
  9 //$wechatObj->valid();//接口验证
 10 $wechatObj->responseMsg();//调用回复消息方法
 11 class wechatCallbackapiTest
 12 {
 13  public function valid()
 14  {
 15  $echoStr = $_GET["echostr"];
 16  
 17  //valid signature , option
 18  if($this->checkSignature()){
 19  echo $echoStr;
 20  exit;
 21  }
 22  }
 23  
 24  public function responseMsg()
 25  {
 26  //get post data, May be due to the different environments
 27  $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
 28  
 29  //extract post data
 30  if (!empty($postStr)){
 31  /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
 32   the best way is to check the validity of xml by yourself */
 33  libxml_disable_entity_loader(true);
 34   $postObj = simplexml_load_string($postStr, \'SimpleXMLElement\', LIBXML_NOCDATA);
 35  $fromUsername = $postObj->FromUserName;
 36  $toUsername = $postObj->ToUserName;
 37  $keyword = trim($postObj->Content);
 38  $time = time();
 39  $msgType = $postObj->MsgType;//消息类型
 40  $event = $postObj->Event;//时间类型,subscribe(订阅)、unsubscribe(取消订阅)
 41  $textTpl = "<xml>
 42   <ToUserName><![CDATA[%s]]></ToUserName>
 43   <FromUserName><![CDATA[%s]]></FromUserName>
 44   <CreateTime>%s</CreateTime>
 45   <MsgType><![CDATA[%s]]></MsgType>
 46   <Content><![CDATA[%s]]></Content>
 47   <FuncFlag>0</FuncFlag>
 48   </xml>"; 
 49    
 50  switch($msgType){
 51   case "event":
 52   if($event=="subscribe"){
 53   $contentStr = "Hi,欢迎关注海仙日用百货!"."\n"."回复数字\'1\',了解店铺地址."."\n"."回复数字\'2\',了解商品种类.";
 54   } 
 55   break;
 56   case "text":
 57   switch($keyword){
 58   case "1":
 59   $contentStr = "店铺地址:"."\n"."杭州市江干艮山西路233号新东升市场地下室第一排."; 
 60   break;
 61   case "2":
 62   $contentStr = "商品种类:"."\n"."杯子、碗、棉签、水桶、垃圾桶、洗碗巾(刷)、拖把、扫把、"
 63    ."衣架、粘钩、牙签、垃圾袋、保鲜袋(膜)、剪刀、水果刀、饭盒等.";
 64   break;
 65   default:
 66   $contentStr = "对不起,你的内容我会稍后回复";
 67   }
 68   break;
 69  }
 70  $msgType = "text";
 71  $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
 72  echo $resultStr;
 73  }else {
 74  echo "";
 75  exit;
 76  }
 77  }
 78   
 79  private function checkSignature()
 80  {
 81  // you must define TOKEN by yourself
 82  if (!defined("TOKEN")) {
 83  throw new Exception(\'TOKEN is not defined!\');
 84  }
 85   
 86  $signature = $_GET["signature"];
 87  $timestamp = $_GET["timestamp"];
 88  $nonce = $_GET["nonce"];
 89   
 90  $token = TOKEN;
 91  $tmpArr = array($token, $timestamp, $nonce);
 92  // use SORT_STRING rule
 93  sort($tmpArr, SORT_STRING);
 94  $tmpStr = implode( $tmpArr );
 95  $tmpStr = sha1( $tmpStr );
 96   
 97  if( $tmpStr == $signature ){
 98  return true;
 99  }else{
100  return false;
101  }
102  }
103 }

 

好难呀,接下来还要开发微信卡包会员卡,希望顺利吧!