当前位置:首页 > PHP教程 > php高级应用 > 列表

基于PHP的微信公众号的开发流程详解

发布:smiling 来源: PHP粉丝网  添加日期:2022-03-22 08:41:57 浏览: 评论:0 

微信公众号开发分傻瓜模式和开发者模式两种,前者不要考虑调用某些接口,只要根据后台提示傻瓜式操作即可,适用于非专业开发人员。

开发模式当然就是懂程序开发的人员使用的。

下面简单说一下微信公众号开发的简易流程,新手看看会有帮助,高手请一笑而过。

1、配置服务器:

A、首先在本机建立如下结构的文件夹(这里是我自己的习惯,仅供参考)

基于PHP的微信公众号的开发流程详解

MMPN:总目录mro message public number 微信公众号

backup:备份目录,主要用于备份php文件,每次修改时将原稿备份到里面去。

images:存放图片

includes:包含文件,包括mysql配置,smarty模板包含文件等等

menu:存放公众号菜单信息,txt文档即可

gr****zx.php:开发文件,即公众号关联的程序文件,也就是配置的url对应的文件

最后的是需求等等的文件

主程序文件:gr****zx.php

  1. <?php 
  2.  
  3.  define("TOKEN", "aabbc_lzpt"); 
  4.  
  5.  //获取微信发送数据 
  6.  $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 
  7.  //返回回复数据 
  8.  if (!emptyempty($postStr)) 
  9.  { 
  10.   //解析数据 
  11.   $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 
  12.   //发送消息方ID 
  13.   $fromUsername = $postObj->FromUserName; 
  14.   //接送消息方ID 
  15.   $toUsername = $postObj->ToUserName; 
  16.   //消息类型 
  17.   $form_MsgType = $postObj->MsgType; 
  18.  
  19.   //事件消息 
  20.   if($form_MsgType=="event") 
  21.   { 
  22.    //获取事件类型 
  23.    $form_Event = $postObj->Event; 
  24.    //订阅事件 
  25.    if($form_Event=="subscribe") 
  26.    { 
  27.  
  28.     //回复欢迎图文信息 
  29.     /* 
  30.     $resultStr = "<xml> 
  31.         <ToUserName><![CDATA[".$fromUsername."]]></ToUserName> 
  32.         <FromUserName><![CDATA[".$toUsername."]]></FromUserName> 
  33.         <CreateTime>".time()."</CreateTime> 
  34.         <MsgType><![CDATA[news]]></MsgType> 
  35.         <ArticleCount>2</ArticleCount> 
  36.         <Articles> 
  37.          <item> 
  38.           <Title><![CDATA[ 欢迎关注***微信服务平台,****]]></Title> 
  39.           <Description><![CDATA[这是简短描述文字]]></Description> 
  40.           <PicUrl><![CDATA[http://a.hiphotos.baidu.com/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=5cae7405f21f3a294ec5dd9cf84cd754/32fa828ba61ea8d32de5a1df950a304e241f5822.jpg]]></PicUrl> 
  41.           <Url><![CDATA[http://www.baidu.com]]></Url> </item> 
  42.          <item> 
  43.           <Title><![CDATA[最新动态]]></Title> 
  44.           <Description><![CDATA[]]></Description> 
  45.           <PicUrl><![CDATA[http://a.hiphotos.baidu.com/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=5cae7405f21f3a294ec5dd9cf84cd754/32fa828ba61ea8d32de5a1df950a304e241f5822.jpg]]></PicUrl> 
  46.           <Url><![CDATA[http://www.baidu.com]]></Url> </item> 
  47.  
  48.         </Articles> 
  49.         </xml> "; 
  50.     */ 
  51.     //回复欢迎文字信息 
  52.  
  53.     $reply="您好,欢迎关注******微信公众平台"; 
  54.     $resultStr="<xml> 
  55.         <ToUserName><![CDATA[".$fromUsername."]]></ToUserName> 
  56.         <FromUserName><![CDATA[".$toUsername."]]></FromUserName> 
  57.         <CreateTime>".time()."</CreateTime> 
  58.         <MsgType><![CDATA[text]]></MsgType> 
  59.         <Content><![CDATA[".$reply."]]></Content> 
  60.        </xml>"; 
  61.    } 
  62.    else if($form_Event=="CLICK") 
  63.    { 
  64.     $form_Event_Key = $postObj->EventKey; 
  65.     if($form_Event_Key=="V3002_CONTACT") 
  66.     { 
  67.      /* 
  68.       $resultStr = "<xml> 
  69.         <ToUserName><![CDATA[".$fromUsername."]]></ToUserName> 
  70.         <FromUserName><![CDATA[".$toUsername."]]></FromUserName> 
  71.         <CreateTime>".time()."</CreateTime> 
  72.         <MsgType><![CDATA[news]]></MsgType> 
  73.         <ArticleCount>1</ArticleCount> 
  74.         <Articles> 
  75.          <item> 
  76.           <Title><![CDATA[如何成为本站会员]]></Title> 
  77.           <Description><![CDATA[本栏目介绍详细的加入流程!]]></Description> 
  78.           <PicUrl><![CDATA[http://a.hiphotos.baidu.com/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=5cae7405f21f3a294ec5dd9cf84cd754/32fa828ba61ea8d32de5a1df950a304e241f5822.jpg]]></PicUrl> 
  79.           <Url><![CDATA[http://www.baidu.com]]></Url> 
  80.          </item> 
  81.         </Articles> 
  82.         </xml> "; 
  83.      */ 
  84.      $reply="我们的地址:黄河东路222号\n我们的热线:0510-88888888"; 
  85.      $resultStr="<xml> 
  86.         <ToUserName><![CDATA[".$fromUsername."]]></ToUserName> 
  87.         <FromUserName><![CDATA[".$toUsername."]]></FromUserName> 
  88.         <CreateTime>".time()."</CreateTime> 
  89.         <MsgType><![CDATA[text]]></MsgType> 
  90.         <Content><![CDATA[".$reply."]]></Content> 
  91.        </xml>"; 
  92.     } 
  93.    } 
  94.  
  95.   } 
  96.   else if($form_MsgType=="location"){ 
  97.    $lng1=$postObj->Location_X; 
  98.    $lat1=$postObj->Location_Y; 
  99.    $from_Location_Label=$postObj->Label; 
  100.    $reply="地理位置:"; 
  101.    $reply.="纬度".$lat1."\t经度".$lng1."位置".$from_Location_Label; 
  102.    $resultStr = "<xml> 
  103.        <ToUserName><![CDATA[".$fromUsername."]]></ToUserName> 
  104.        <FromUserName><![CDATA[".$toUsername."]]></FromUserName> 
  105.        <CreateTime>".time()."</CreateTime> 
  106.        <MsgType><![CDATA[text]]></MsgType> 
  107.        <Content><![CDATA[".$reply."]]></Content> 
  108.        </xml> "; 
  109.  
  110.   } 
  111.   echo $resultStr; 
  112.   exit; 
  113.  } 
  114.  else 
  115.  { 
  116.   echo ""; 
  117.   exit; 
  118.  } 
  119. ?> 

临时文件:wx_sample.php

  1. <?php 
  2. /** 
  3.  * wechat php test 
  4.  */ 
  5.  
  6. //define your token 
  7. define("TOKEN", "aabbc_lzpt"); 
  8. $wechatObj = new wechatCallbackapiTest(); 
  9. $wechatObj->valid(); 
  10.  
  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 (!emptyempty($postStr)){ 
  31.       
  32.      $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 
  33.     $fromUsername = $postObj->FromUserName; 
  34.     $toUsername = $postObj->ToUserName; 
  35.     $keyword = trim($postObj->Content); 
  36.     $time = time(); 
  37.     $textTpl = "<xml> 
  38.        <ToUserName><![CDATA[%s]]></ToUserName> 
  39.        <FromUserName><![CDATA[%s]]></FromUserName> 
  40.        <CreateTime>%s</CreateTime> 
  41.        <MsgType><![CDATA[%s]]></MsgType> 
  42.        <Content><![CDATA[%s]]></Content> 
  43.        <FuncFlag>0</FuncFlag> 
  44.        </xml>";     
  45.     if(!emptyempty( $keyword )) 
  46.     { 
  47.       $msgType = "text"; 
  48.      $contentStr = "Welcome to wechat world!"; 
  49.      $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); 
  50.      echo $resultStr; 
  51.     }else{ 
  52.      echo "Input something..."; 
  53.     } 
  54.  
  55.   }else { 
  56.    echo ""; 
  57.    exit; 
  58.   } 
  59.  } 
  60.     
  61.  private function checkSignature() 
  62.  { 
  63.   $signature = $_GET["signature"]; 
  64.   $timestamp = $_GET["timestamp"]; 
  65.   $nonce = $_GET["nonce"];  
  66.       
  67.   $token = TOKEN; 
  68.   $tmpArr = array($token, $timestamp, $nonce); 
  69.   sort($tmpArr, SORT_STRING); 
  70.   $tmpStr = implode( $tmpArr ); 
  71.   $tmpStr = sha1( $tmpStr ); 
  72.     
  73.   if( $tmpStr == $signature ){ 
  74.    return true; 
  75.   }else{ 
  76.    return false; 
  77.   } 
  78.  } 
  79. } 
  80.  
  81. ?> 
注意看两个文件开头都有代码:define("TOKEN", "aabbc_lzpt"); 这是定义token,后面的值自己设置,但是自己要记住,在微信后台配置服务器要用到它。

B、现在开始操作,首先,将gr****zx.php文件中的内容(代码),临时清空,代替以临时文件中的内容(代码),保存。将MMPN项目传到服务器,这时,主程序文件url为“http://www.****.com/MMPN/fy_hzx/grape_fy_hzx.php”这样的形式,确保路径正确,打开微信公众号后台开发者中心,点击下图中“修改配置”,将刚才的url填入相应控件

基于PHP的微信公众号的开发流程详解

基于PHP的微信公众号的开发流程详解

token就是刚才提到要记住的token的值,要一致。第三个“消息加密密钥”可以随机生成,然后提交。

token正确和url正确以及文件代码无误的话,会提示成功,再点启用。

C、刚才主程序文件中的代码是临时的,只是为了开通注册验证token,成功以后,可以再次清除,恢复成原来的内容。(保存好再上传到服务器)

这样服务器配置工作就结束了。

2、介绍一下主程序文件中的代码

$form_MsgType = $postObj->MsgType;

$form_MsgType消息类型,分为“事件”、“位置”(粉丝发送位置)、“文字类型”、“图片类型”等,具体可查看后台接口文档

$form_Event = $postObj->Event;

$form_Event 事件类型分为“订阅”(subscribe)(也就是点关注)、退订(unsubscribe)、“点击”(CLICK)——点击菜单,但是只针对click类型的菜单,如果是url类型的菜单,则直接打开对应的url,无须在代码中处理。

回复粉丝的内容形式一般为文字或图文两种,代码中都有。

3、菜单配置

菜单配置要知道开发者ID中的AppID(这个可以直接看到)和AppSecret(这个有可能是被隐藏的,要通过公众号管理员验证通过申请查看才能显示完整,显示完整后要及时保存记录,这样下次就不用再找管理员了)。

配置菜单前,首先要拿到access_token,它的有效期为2小时。如图点击获取access_token

基于PHP的微信公众号的开发流程详解

然后在右下方点击“使用网页调试工具调试该接口”

基于PHP的微信公众号的开发流程详解

输入appid和secret,点“检查问题”提交

基于PHP的微信公众号的开发流程详解

拷贝获取到的access_token

基于PHP的微信公众号的开发流程详解

重新选择自定义菜单:

基于PHP的微信公众号的开发流程详解

将刚获取到的access_token 拷入

如果接口列表选择的是查询菜单,提交的结果是不存在,这就对了,因为我们还没有创建菜单呢

基于PHP的微信公众号的开发流程详解

那么,我们就创建一个,将以下json格式代码拷入body中,提交

  1. { 
  2.   "button": [ 
  3.    { 
  4.     "name": "首页",  
  5.     "sub_button": [ 
  6.      { 
  7.       "type": "view",  
  8.       "name": "注册登录",  
  9.       "url": "http://www.baidu.com",  
  10.       "sub_button": [ ] 
  11.      },  
  12.      { 
  13.       "type": "click",  
  14.       "name": "娱乐一刻",  
  15.       "key": "V1001_QUERY",  
  16.       "sub_button": [ ] 
  17.      },  
  18.      { 
  19.       "type": "view",  
  20.       "name": "查看官网",  
  21.       "url": "http://www.baidu.com",  
  22.       "sub_button": [ ] 
  23.      } 
  24.        
  25.     ] 
  26.    },  
  27.    { 
  28.     "name": "主页",  
  29.     "sub_button": [ 
  30.      { 
  31.       "type": "view",  
  32.       "name": "注册登录",  
  33.       "url": "http://www.baidu.com",  
  34.       "sub_button": [ ] 
  35.      },  
  36.      { 
  37.       "type": "click",  
  38.       "name": "娱乐一刻",  
  39.       "key": "V1001_QUERY",  
  40.       "sub_button": [ ] 
  41.      },  
  42.      { 
  43.       "type": "view",  
  44.       "name": "查看官网",  
  45.       "url": "http://www.baidu.com",  
  46.       "sub_button": [ ] 
  47.      } 
  48.        
  49.     ] 
  50.    },  
  51.    { 
  52.     "name": "关注我们",  
  53.     "sub_button": [ 
  54.      { 
  55.       "type": "view",  
  56.       "name": "注册登录",  
  57.       "url": "http://www.baidu.com",  
  58.       "sub_button": [ ] 
  59.      },  
  60.      { 
  61.       "type": "click",  
  62.       "name": "娱乐一刻",  
  63.       "key": "V1001_QUERY",  
  64.       "sub_button": [ ] 
  65.      },  
  66.      { 
  67.       "type": "view",  
  68.       "name": "查看官网",  
  69.       "url": "http://www.baidu.com",  
  70.       "sub_button": [ ] 
  71.      } 
  72.     ] 
  73.    } 
  74.   ] 
  75.  } 

提交,提示成功菜单即生成。

基于PHP的微信公众号的开发流程详解

菜单内容中,有两个类型 (type),一个是view,这个会直接打开相应url链接;一个是click,这个就会在刚才主程序文件中寻找对应key值运行相关的代码。

格式不要弄错就行。

如果要修改菜单,先删除,再创建;一般来说,菜单更改后,公众号须重新关注才能马上看到更改效果,否则要等24小时自动更新。

Tags: PHP微信公众号开发流程

分享到: