PHP微信公众号开发入门(二)

好了,上一篇已经介绍到了如何成为一个微信开发者,并且简单介绍了如何获取和发送简单的文本信息,这次就来介绍一下其他类型数据的接收和发送方式。

我们可以通过微信端给我们发送来的xml来判断用户发送消息的类型,比如文本,图片,音频等等,具体获取看代码

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //获取POST数据
$postObj = simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);//这就是微信发来的xml
$fromUsername = $postObj->FromUserName; //获取发送方帐号(OpenID)
$toUsername = $postObj->ToUserName; //获取接收方账号
$keyword = trim($postObj->Content); //获取消息内容
$masType = $postObj->MsgType;//获取消息类型
$time = time(); //获取当前时间戳

可以看到,获取到的xml中,MsgType就是用户发送数据的类型,分别有 'text'(文本),'image'(图片),location(位置),voice(音频),video(视频)等。我们就做一个简单的根据用户发送类型来返回相应数据的demo。

首先用switch case来区分不同的类型,这个函数不知道的自己百度,而后对应来编写代码

1,文字

我们就做成简单的 “你发送的是:”格式的demo。先定义回复文本格式的xml模板,而后把刚获取的用户文字和我们需要的内容合并,最后通过 resultStr() 函数来格式化消息模板。函数用法自行百度

 //返回消息模板
          $textTpl = "<xml>
          <ToUserName><![CDATA[%s]]></ToUserName>
          <FromUserName><![CDATA[%s]]></FromUserName>
          <CreateTime>%s</CreateTime>
          <MsgType><![CDATA[%s]]></MsgType>
          <Content><![CDATA[%s]]></Content>
          <FuncFlag>0</FuncFlag>
          </xml>";
          switch ($masType) {
          case 'text'://文字
          $msgType = "text"; //消息类型
          $contentStr = '你发送的是:'.$keyword;
          $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
          echo $resultStr;
      break;

这样就会得到一个这样的回复。


image.png

2.图片

同样的,我们还是做一个把用户发来的图片再发回给他的demo。用户在像我们的公众号发送图片的时候,微信平台会在保存图片的同时,给这张图片一个唯一的URL以及mediaId,这个URL在浏览器直接访问就是你的那张图片。开发者需要在服务器获取该图片的mediaId,而后再按照格式发送给微信方,微信就会返还对应这个mediaId的图片给用户。

          $picUrl = $postObj->PicUrl;//图片的链接
          $mediaId = $postObj->MediaId;//图片消息媒体id
          $msgType = "image";
          $replyXml = "<xml>
                  <ToUserName><![CDATA[%s]]></ToUserName>
                  <FromUserName><![CDATA[%s]]></FromUserName>
                  <CreateTime>%s</CreateTime>
                  <MsgType><![CDATA[%s]]></MsgType>
                  <Image>
                    <MediaId><![CDATA[%s]]></MediaId>
                  </Image>
                </xml>";
          echo sprintf($replyXml,$postObj->FromUserName,$postObj->ToUserName,time(),$msgType,$mediaId);
image.png

另外,如果你想发送指定的图片给客户,那么你需要先在开发者端把图片发送给微信方,而后获取这个图片的mediaId,你可以选择发送临时素材(保存三天)或者永久素材,具体操作请看微信官方文档。

3.图文

我们自己关注的公众号,给我们发送最多的消息应该就是图文消息了,就是类似这样的


image.png

大家肯定都知道,这样的消息,在微信公众平台,点点敲敲的就可以发送了,但是这完全没有开发者的代码逻辑在内,也无法完全控制,所以我们要用代码来实现这个功能。

首先我们定义一个二维数组,其中的参数名称如代码所示

$newsArr = array(
                  array(
                    "Title"=>"本世纪最像王昊的男人!",
                    "Description"=>"究竟是为何和王昊长得如此相像?",
                    "PicUrl"=>"http://5b0988e595225.cdn.sohucs.com/images/20171019/aab0f430638b4b1f87e48d19054b7b60.jpeg",
                    "Url"=>"http://www.wanghao-home.club"
                  ),
                  array(
                    "Title"=>"艳照门祖师爷再现江湖!",
                    "Description"=>"究竟是电脑坏了还是存心所为…",
                    "PicUrl"=>"http://g.hiphotos.baidu.com/baike/pic/item/060828381f30e92496694c1044086e061c95f7c6.jpg",
                    "Url"=>"http://www.wanghao-home.club"
                  ),
                  array(
                    "Title"=>"音乐才子竟拜师?",
                    "Description"=>"伯克利音乐才子竟然为何拜师王昊门下?让我们来一探究竟!",
                    "PicUrl"=>"http://img01.e23.cn/2017/1003/20171003094603817.jpg",
                    "Url"=>"http://www.wanghao-home.club"
                  )  
                );

可以看到,这个二维数组中,一级数组一个,二级数组三个,其中的参数也都相同

Title:文章标题 Description:文章描述 PicUrl:文章图片 Url:点击会跳转的链接

好了,数组定义完成,我们就要把数组处理成为微信可以接收的xml数据了,这里我给你提供一个方法

 //判断是否为数组类型
      if(!is_array($newsArr))
      {
        return;
      }
      // 判断数组是否为空数组
      if(!$newsArr)
      {
        return;
      }
      $itemStr = "";
      //定义item模板
      $itemXml = "<item>
              <Title><![CDATA[%s]]></Title> 
              <Description><![CDATA[%s]]></Description>
              <PicUrl><![CDATA[%s]]></PicUrl>
              <Url><![CDATA[%s]]></Url>
            </item>";
      foreach($newsArr as $item)
      {
        $itemStr .= sprintf($itemXml,$item['Title'],$item['Description'],$item['PicUrl'],$item['Url']);
      }
      $replyXml = "<xml>
              <ToUserName><![CDATA[%s]]></ToUserName>
              <FromUserName><![CDATA[%s]]></FromUserName>
              <CreateTime>%s</CreateTime>
              <MsgType><![CDATA[news]]></MsgType>
              <ArticleCount>".count($newsArr)."</ArticleCount>
              <Articles>".$itemStr."</Articles>
            </xml>"; 
      echo sprintf($replyXml,$postObj->FromUserName,$postObj->ToUserName,time());

代码里也没有什么复杂的地方,就是一个循环赋值的过程,最后再格式化返回给微信方,这样我们的用户就会收到这样的一个图文消息

image.png

并且点击对应的内容,就会跳转到www.wanghao-home.club

4.用户关注

用户在关注我们公众号时,公众平台会发送给我们一个xml数据,我们可以获取其中的事件(Event),来判断,而后回复给用户一个欢迎语句

 if($postObj->Event == 'subscribe'){
            $msgType = "text"; //消息类型
            $contentStr = '感谢您关注wellHome!';
            $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
            echo $resultStr;
          }

还有就是,个人开发者的订阅号现在无法进行微信认证,所以无法自定义菜单以及一切琐碎的功能,这点这得是让我心碎啊。

自定义菜单也很简单,我们只需要准备一个 json 数组,而后根据开发者的 AppID 和 AppSecret ,在公众平台上获取一个Access_token,而后token通过验证,你的数组就可以成为公众号的菜单了。并且微信还提供了多种事件,开发者可以在代码中,通过用户不同事件所发送的值以及菜单中你自己定义的 Key值就可以做对应的操作了。

这篇文章暂时先介绍这三种回复内容的格式,下一篇再详细介绍其他内容格式,希望会对您有所帮助。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容