源码论坛公告:本站是一个交流学习建站资源的社区论坛,旨在交流学习源码脚本等资源技术,欢迎大家投稿发言! 【点击此处将锦尚放在桌面

源码论坛,商业源码下载,尽在锦尚中国商业源码论坛

 找回密码
 会员注册

QQ登录

只需一步,快速开始

查看: 9184|回复: 0

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

[复制链接]

1169

主题

1557

帖子

8820

金币

超级版主

Rank: 8Rank: 8

积分
19326
发表于 2020-9-18 20:07:12 | 显示全部楼层 |阅读模式

这篇文章主要介绍了基于PHP的微信公众号的开发流程详解,文章通过示例代码和服务器及菜单配置的图文讲解介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

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

1、配置服务器:

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

2020080716593329.png


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

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

images:存放图片

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

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

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

最后的是需求等等的文件

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

  1. <?php

  2. define("TOKEN", "aabbc_lzpt");

  3. //获取微信发送数据
  4. $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
  5. //返回回复数据
  6. if (!empty($postStr))
  7. {
  8.   //解析数据
  9.   $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  10.   //发送消息方ID
  11.   $fromUsername = $postObj->FromUserName;
  12.   //接送消息方ID
  13.   $toUsername = $postObj->ToUserName;
  14.   //消息类型
  15.   $form_MsgType = $postObj->MsgType;

  16.   //事件消息
  17.   if($form_MsgType=="event")
  18.   {
  19.    //获取事件类型
  20.    $form_Event = $postObj->Event;
  21.    //订阅事件
  22.    if($form_Event=="subscribe")
  23.    {

  24.     //回复欢迎图文信息
  25.     /*
  26.     $resultStr = "<xml>
  27.         <ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
  28.         <FromUserName><![CDATA[".$toUsername."]]></FromUserName>
  29.         <CreateTime>".time()."</CreateTime>
  30.         <MsgType><![CDATA[news]]></MsgType>
  31.         <ArticleCount>2</ArticleCount>
  32.         <Articles>
  33.          <item>
  34.           <Title><![CDATA[ 欢迎关注***微信服务平台,****]]></Title>
  35.           <Description><![CDATA[这是简短描述文字]]></Description>
  36.           <PicUrl><![CDATA[http://a.hiphotos.baidu.com/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=5cae7405f21f3a294ec5dd9cf84cd754/32fa828ba61ea8d32de5a1df950a304e241f5822.jpg]]></PicUrl>
  37.           <Url><![CDATA[http://www.baidu.com]]></Url> </item>
  38.          <item>
  39.           <Title><![CDATA[最新动态]]></Title>
  40.           <Description><![CDATA[]]></Description>
  41.           <PicUrl><![CDATA[http://a.hiphotos.baidu.com/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=5cae7405f21f3a294ec5dd9cf84cd754/32fa828ba61ea8d32de5a1df950a304e241f5822.jpg]]></PicUrl>
  42.           <Url><![CDATA[http://www.baidu.com]]></Url> </item>

  43.         </Articles>
  44.         </xml> ";
  45.     */
  46.     //回复欢迎文字信息

  47.     $reply="您好,欢迎关注******微信公众平台";
  48.     $resultStr="<xml>
  49.         <ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
  50.         <FromUserName><![CDATA[".$toUsername."]]></FromUserName>
  51.         <CreateTime>".time()."</CreateTime>
  52.         <MsgType><![CDATA[text]]></MsgType>
  53.         <Content><![CDATA[".$reply."]]></Content>
  54.        </xml>";
  55.    }
  56.    else if($form_Event=="CLICK")
  57.    {
  58.     $form_Event_Key = $postObj->EventKey;
  59.     if($form_Event_Key=="V3002_CONTACT")
  60.     {
  61.      /*
  62.       $resultStr = "<xml>
  63.         <ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
  64.         <FromUserName><![CDATA[".$toUsername."]]></FromUserName>
  65.         <CreateTime>".time()."</CreateTime>
  66.         <MsgType><![CDATA[news]]></MsgType>
  67.         <ArticleCount>1</ArticleCount>
  68.         <Articles>
  69.          <item>
  70.           <Title><![CDATA[如何成为本站会员]]></Title>
  71.           <Description><![CDATA[本栏目介绍详细的加入流程!]]></Description>
  72.           <PicUrl><![CDATA[http://a.hiphotos.baidu.com/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=5cae7405f21f3a294ec5dd9cf84cd754/32fa828ba61ea8d32de5a1df950a304e241f5822.jpg]]></PicUrl>
  73.           <Url><![CDATA[http://www.baidu.com]]></Url>
  74.          </item>
  75.         </Articles>
  76.         </xml> ";
  77.      */
  78.      $reply="我们的地址:黄河东路222号\n我们的热线:0510-88888888";
  79.      $resultStr="<xml>
  80.         <ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
  81.         <FromUserName><![CDATA[".$toUsername."]]></FromUserName>
  82.         <CreateTime>".time()."</CreateTime>
  83.         <MsgType><![CDATA[text]]></MsgType>
  84.         <Content><![CDATA[".$reply."]]></Content>
  85.        </xml>";
  86.     }
  87.    }

  88.   }
  89.   else if($form_MsgType=="location"){
  90.    $lng1=$postObj->Location_X;
  91.    $lat1=$postObj->Location_Y;
  92.    $from_Location_Label=$postObj->Label;
  93.    $reply="地理位置:";
  94.    $reply.="纬度".$lat1."\t经度".$lng1."位置".$from_Location_Label;
  95.    $resultStr = "<xml>
  96.        <ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
  97.        <FromUserName><![CDATA[".$toUsername."]]></FromUserName>
  98.        <CreateTime>".time()."</CreateTime>
  99.        <MsgType><![CDATA[text]]></MsgType>
  100.        <Content><![CDATA[".$reply."]]></Content>
  101.        </xml> ";

  102.   }
  103.   echo $resultStr;
  104.   exit;
  105. }
  106. else
  107. {
  108.   echo "";
  109.   exit;
  110. }
  111. ?>
复制代码


临时文件:wx_sample.php

  1. <?php
  2. /**
  3. * wechat php test
  4. */

  5. //define your token
  6. define("TOKEN", "aabbc_lzpt");
  7. $wechatObj = new wechatCallbackapiTest();
  8. $wechatObj->valid();

  9. class wechatCallbackapiTest
  10. {
  11. public function valid()
  12. {
  13.   $echoStr = $_GET["echostr"];

  14.   //valid signature , option
  15.   if($this->checkSignature()){
  16.    echo $echoStr;
  17.    exit;
  18.   }
  19. }

  20. public function responseMsg()
  21. {
  22.   //get post data, May be due to the different environments
  23.   $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

  24.    //extract post data
  25.   if (!empty($postStr)){
  26.    
  27.      $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  28.     $fromUsername = $postObj->FromUserName;
  29.     $toUsername = $postObj->ToUserName;
  30.     $keyword = trim($postObj->Content);
  31.     $time = time();
  32.     $textTpl = "<xml>
  33.        <ToUserName><![CDATA[%s]]></ToUserName>
  34.        <FromUserName><![CDATA[%s]]></FromUserName>
  35.        <CreateTime>%s</CreateTime>
  36.        <MsgType><![CDATA[%s]]></MsgType>
  37.        <Content><![CDATA[%s]]></Content>
  38.        <FuncFlag>0</FuncFlag>
  39.        </xml>";   
  40.     if(!empty( $keyword ))
  41.     {
  42.       $msgType = "text";
  43.      $contentStr = "Welcome to wechat world!";
  44.      $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
  45.      echo $resultStr;
  46.     }else{
  47.      echo "Input something...";
  48.     }

  49.   }else {
  50.    echo "";
  51.    exit;
  52.   }
  53. }
  54.   
  55. private function checkSignature()
  56. {
  57.   $signature = $_GET["signature"];
  58.   $timestamp = $_GET["timestamp"];
  59.   $nonce = $_GET["nonce"];
  60.    
  61.   $token = TOKEN;
  62.   $tmpArr = array($token, $timestamp, $nonce);
  63.   sort($tmpArr, SORT_STRING);
  64.   $tmpStr = implode( $tmpArr );
  65.   $tmpStr = sha1( $tmpStr );
  66.   
  67.   if( $tmpStr == $signature ){
  68.    return true;
  69.   }else{
  70.    return false;
  71.   }
  72. }
  73. }

  74. ?>
复制代码


注意看两个文件开头都有代码:define("TOKEN", "aabbc_lzpt"); 这是定义token,后面的值自己设置,但是自己要记住,在微信后台配置服务器要用到它。

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

2020080716593432.png


2020080716593433.png


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

2020080716593434.png


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

2020080716593435.png


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

2020080716593436.png


拷贝获取到的access_token

2020080716593437.png


重新选择自定义菜单:

2020080716593438.png


将刚获取到的access_token 拷入

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

2020080716593439.png


那么,我们就创建一个,将以下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. }
复制代码


2020080716593440.png


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

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

  格式不要弄错就行。

  如果要修改菜单,先删除,再创建;一般来说,菜单更改后,公众号须重新关注才能马上看到更改效果,否则要等24小时自动更新。
您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

锦尚中国源码论坛

聚合标签|锦尚中国,为中国网站设计添动力 ( 鲁ICP备09033200号 ) |网站地图

GMT+8, 2024-4-16 00:41 , Processed in 0.057447 second(s), 22 queries .

带宽由 锦尚数据 提供 专业的数据中心

© 锦尚中国源码论坛 52jscn Inc. 非法入侵必将受到法律制裁 法律顾问:IT法律网 & 褚福省律师 锦尚爱心 版权申诉 版权与免责声明