《微信公众平台开发最佳实践》——第3章 基 础 接 口 3.1 接收用户消息

本节书摘来自华章出版社《微信公众平台开发最佳实践》一 书中的第3章,第3.1节,作者:方倍工作室,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

第3章 基 础 接 口

基础接口是微信公众账号在申请后就默认拥有而不需要通过微信认证获得的接口。微信公众平台开发者中心启用之后,需要使用基础接口实现基本消息的接收与发送。基础接口包括三个主要的部分:接收用户消息,发送被动响应消息,接收事件推送消息。本章将介绍这三个部分是如何实现的。

3.1 接收用户消息 

51ceba05bba4ff66e0f72a58ed3f43474c984c77

微信公众账号能够接收用户发送的六种格式的消息:文本(包括表情)、图片、语音、视频、地理位置、链接。下面将分别介绍这六种消息。

3.1.1 文本消息

用户向微信公众账号发送文本消息的示例如图3-1所示。
用户发送文本消息时,微信公众账号接收到的XML数据格式如下所示:

<xml>
    <ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
    <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_
ruZGsfk]]></FromUserName>
    <CreateTime>1359028446</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[微信公众平台开发教程]]></Content>
    <MsgId>5836982729904121631</MsgId>
</xml>```
用户发送的文本消息的参数及描述如表3-1所示。

<div style="text-align: center"><img src="https://yqfile.alicdn.com/30b5023f90f46c2ca2aa5bcb23b987dfbb81d72f.png" width="" height="">
</div>

####3.1.2 图片消息
用户向微信公众账号发送图片消息的示例如图3-2所示。
<div style="text-align: center"><img src="https://yqfile.alicdn.com/4ca8680b910d0e600117d0f85744f5b498eab289.png" width="" height="">
</div>

用户发送图片消息时,微信公众账号接收到的XML数据格式如下所示:

<ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
<FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
<CreateTime>1359028479</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz/L4qjYtOibummHn90t1mnaibYiaR8ljyicF3MW7XX3BLp1qZgUb7CtZ0DxqYFI4uAQH1FWs3hUicpibjF0pOqLEQyDMlg/0]]></PicUrl>
<MsgId>5836982871638042400</MsgId>
<MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D

0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]>
`

用户发送图片消息的参数及描述如表3-2所示。

e33bf6aeecd2a04508fc126f239707aa744f4cc5
3.1.3 语音消息

用户向微信公众账号发送语音消息的示例如图3-3所示。

fd9b5fa277dd3bc80fc757145122e2c790764c53

用户发送语音消息时,微信公众账号接收到的XML数据格式如下所示:

<xml>
    <ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
    <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_
ruZGsfk]]></FromUserName>
    <CreateTime>1359028025</CreateTime>
    <MsgType><![CDATA[voice]]></MsgType>
    <MediaId><![CDATA[hGm9wmKth8RO_tuv5k9fJkSbovXWzZ
VYwG2jSsL7ukCqq6q1SiLzYnFEngFNUijs]]></MediaId>
    <Format><![CDATA[amr]]></Format>
    <MsgId>5836980921722890003</MsgId>
    <Recognition><![CDATA[]]></Recognition>
</xml>```
用户发送语音消息的参数及描述如表3-3所示。

<div style="text-align: center"><img src="https://yqfile.alicdn.com/bc9b8b4915eb20983b5184732d830ba369a269e7.png" width="" height="">
</div>

####3.1.4 视频消息
用户向微信公众账号发送视频消息的示例如图3-4所示。
<div style="text-align: center"><img src="https://yqfile.alicdn.com/e59d3fb62c47745e4e4104628c3e64f1767775a5.png" width="" height="">
</div>

用户发送视频消息时,微信公众账号接收到的XML数据格式如下所示:

<ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
<FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_

ruZGsfk]]>

<CreateTime>1359028186</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<MediaId><![CDATA[DBVFRIj29LB2hxuYpc0R6VLyxwgyCH

ZPbRj_IIs6YaGhutyXUKtFSDcSCPeoqUYr]]>

<ThumbMediaId><![CDATA[mxUJ5gcCeesJwx2T9qsk62YzI

clCP_HnRdfTQcojlPeT2G9Q3d22UkSLyBFLZ01J]]>

<MsgId>5836981613212624665</MsgId>

用户发送视频消息的参数及描述如表3-4所示。
<div style="text-align: center"><img src="https://yqfile.alicdn.com/49a817be659a338d6a671b1c1608f5d4b27596be.png" width="" height="">
</div>

####3.1.5 地理位置消息
用户向微信公众账号发送地理位置消息的示例如图3-5所示。
<div style="text-align: center"><img src="https://yqfile.alicdn.com/beaa7aae2fb63c1d09f95861fc0aa580d9afb711.png" width="" height="">
</div>

用户发送地理位置消息时,微信公众账号接收到的XML数据格式如下所示:

<ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
<FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_

ruZGsfk]]>

<CreateTime>1359036619</CreateTime>
<MsgType><![CDATA[location]]></MsgType>
<Location_X>22.539968</Location_X>
<Location_Y>113.954980</Location_Y>
<Scale>16</Scale>
<Label><![CDATA[中国广东省深圳市南山区深南大道9001号 

邮政编码: 518053]]>

<MsgId>5837017832671832047</MsgId>

`
用户发送地理位置消息的参数及描述如表3-5所示。

77a523ebbca54e5e29bc4d57f9203081c64c33b0
3.1.6 链接消息

用户向微信公众账号发送链接消息的示例如图3-6所示。

a9c981d63bab3ce4522b6a8c4481a16d785facbe

用户发送链接消息时,微信公众账号接收到的XML数据格式如下所示:

<xml>
    <ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName> 
    <FromUserName><![CDATA[oIDrpjl2LYdfTAM-oxDgB4XZ
cnc8]]></FromUserName> 
    <CreateTime>1359709372</CreateTime> 
    <MsgType><![CDATA[link]]></MsgType> 
    <Title><![CDATA[微信公众平台开发者的江湖]]></Title> 
    <Description><![CDATA[陈坤的微信公众号这段时间大火,大家...]]></Description> 
    <Url><![CDATA[http://www.cnblogs.com/txw1958/]]></Url> 
    <MsgId>5839907284805129867</MsgId> 
</xml> ```

用户发送的链接消息的参数及描述如表3-6所示。
<div style="text-align: center"><img src="https://yqfile.alicdn.com/2dfbbe59908e3344d57a154ea05955c30eafb0a2.png" width="" height="">
</div>

####3.1.7 案例
前面的章节已经介绍了各种基础消息,本节将用代码实现上面的各种消息类型并且做出相应的回复处理。代码如下所示:.

<?php

//
// 接收用户消息
// 微信公众账号接收到用户的消息类型判断
//

define("TOKEN", "weixin");

$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {

$wechatObj->responseMsg();

}else{

$wechatObj->valid();

}

class wechatCallbackapiTest
{

public function valid()
{
    $echoStr = $_GET["echostr"];
    if($this->checkSignature()){
        echo $echoStr;
        exit;
    }
}

private function checkSignature()
{
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];

    $token = TOKEN;
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr);
    $tmpStr = implode( $tmpArr );
    $tmpStr = sha1( $tmpStr );

    if( $tmpStr == $signature ){
        return true;
    }else{
        return false;
    }
}

public function responseMsg()
{
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
    if (!empty($postStr)){
        $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        $RX_TYPE = trim($postObj->MsgType);

        //用户发送的消息类型判断
        switch ($RX_TYPE)
        {
            case "text":    //文本消息
                $result = $this->receiveText($postObj);
                break;
            case "image":   //图片消息
                $result = $this->receiveImage($postObj);
                break;
            case "voice":   //语音消息
                $result = $this->receiveVoice($postObj);
                break;
            case "video":   //视频消息
                $result = $this->receiveVideo($postObj);
                break;
            case "location"://位置消息
                $result = $this->receiveLocation($postObj);
                break;
            case "link":    //链接消息
                $result = $this->receiveLink($postObj);
                break;
            default:
                $result = "unknow msg type: ".$RX_TYPE;
                break;
        }
        echo $result;
    }else {
        echo "";
        exit;
    }
}

/*
 * 接收文本消息
 */
private function receiveText($object)
{
    $content = "你发送的是文本,内容为:".$object->Content;
    $result = $this->transmitText($object, $content);
    return $result;
}

/*
 * 接收图片消息
 */
private function receiveImage($object)
{
    $content = "你发送的是图片,地址为:".$object->PicUrl;
    $result = $this->transmitText($object, $content);
    return $result;
}

/*
 * 接收语音消息
 */
private function receiveVoice($object)
{
    $content = "你发送的是语音,媒体ID为:".$object->MediaId;
    $result = $this->transmitText($object, $content);
    return $result;
}

/*
 * 接收视频消息
 */
private function receiveVideo($object)
{
    $content = "你发送的是视频,媒体ID为:".$object->MediaId;
    $result = $this->transmitText($object, $content);
    return $result;
}

/*
 * 接收位置消息
 */
private function receiveLocation($object)
{
    $content = "你发送的是位置,纬度为:".$object->Location_X.";经度为:".$object->Location_Y.";缩放级别为:".$object->Scale.";位置为:".$object->Label;
    $result = $this->transmitText($object, $content);
    return $result;
}

/*
 * 接收链接消息
 */
private function receiveLink($object)
{
    $content = "你发送的是链接,标题为:".$object->Title.";内容为:".$object->

Description.";链接地址为:".$object->Url;

    $result = $this->transmitText($object, $content);
    return $result;
}

/*
 * 回复文本消息
 */
private function transmitText($object, $content)
{
    $textTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[%s]]></Content>
    </xml>";
    $result = sprintf($textTpl, $object->FromUserName, $object-> ToUserName, time(), $content);
    return $result;
}

}
?>`
在responseMsg()方法中,先提取消息类型$postObj->MsgType,从而实现各种消息类型的分离。在类wechatCallbackapiTest中,为每种消息类型定义了接收方法函数。在每个方法里面,返回消息的主要特征值,组成文本消息作为内容回复。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值