Contents
  1. 1. 基础内容
  2. 2. 使用API

基础内容

微信是一把利器,我们日常用它来交流,商家用它来营销.于是我们以商家的视角,来看一下微信为其提供的服务.微信公众平台的管理入口为 https://mp.weixin.qq.com ,尚不明白如此大的品牌,微信为何依然使用qq.com域名.且说公众平台的注册流程,有如下过程:

基本信息 => 邮箱激活 => 选择类型 => 信息登记 => 公众号信息
注册过程不是本文的重点. 注册结束之后,将得到如下管理界面:

[caption id=”attachment_2847” align=”aligncenter” width=”848”]微信公众平台控制面板 微信公众平台控制面板[/caption]

微信公众平台分两种类型:订阅号,服务号. 从注册方面来说, 订阅号可以个人注册,不用缴费; 服务号一般需要以团体机构的身份去申请,并且在申请过程中需要缴纳一定费用. 从使用方面来说, 订阅号无法获取公众平台的appkey与appsecret, 因而与之相关的功能无法使用, (虽然订阅号可以申请测试的appkey与appsecret, 但测试账号与正式的账号并非一物); 而服务号具有更加强大的功能, 比如可以在程序中获取用户信息, 在手机端的聊天界面, 可以显示底部菜单等. 本文仅为创建使用订阅号,提供一定指导.

按下不表, 且回到上图界面. 订阅号的常规功能已经可在界面上操作, 比如管理用户信息, 设置用户的自动回复. 能把繁杂的功能抽丝去茧整合成简洁的操作面板, 确实显示了微信强大的产品能力(对比以前管理 虚拟主机 的那种界面). PS: 左侧导航链接文案作者一定有词语对齐的强迫症^ - ^.

使用API

当然界面的操作能力总是有限的, 我们想用代码来控制. 整体上, 使用微信公众平台的架构如下:

[caption id=”attachment_2853” align=”aligncenter” width=”798”]微信公众平台架构 微信公众平台架构[/caption]

开发者要做的, 是在自己的服务器(公众平台服务器)上按照微信的API规范部署代码, 响应由微信服务器传递过来的用户请求. 所以你需要有一份自己的web服务器. 微信官方给出了一份php的代码范例:http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip.本文做了一些重命名与结构调整工作,以方便读者理解. Show the code:

<?php
define(“TOKEN”, “Weixin”); ////web response

//wechat response
$wechatResponse = new wechatResponseClass(); //创建响应微信请求的类
$wechatResponse->valid(); //验证请求消息是否来源 微信
$wechatResponse->receiveRequest(); // 接受由微信传送过来的用户请求(比如用户发送的文本消息)
$wechatResponse->sendResponse(); //反馈给用户消息

class wechatResponseClass
{
private $openIdUser; //用户的openId
private $openIdServer; //公众账号的openId
private $requestMsgType; //消息类型,如果为空,则不需要回复此条消息
private $requestMsgContent; //文本消息内容

/**!
* @brief 验证微信访问是否合法
*/
public function valid()
{
    $echoStr = $_GET["echostr"];
    //valid signature , option
    if($this-&gt;checkSignature()){
        echo $echoStr;
        exit;
    }
}

/**!
* @brief 接受用户的请求信息,并将其解析
*/
public function receiveRequest()
{
    //get post data, May be due to the different environments
    $requestString = $GLOBALS["HTTP_RAW_POST_DATA"];
        //extract post data
    if (!empty($requestString))
    {            
        $requestXmlObj = simplexml_load_string($requestString, 'SimpleXMLElement', LIBXML_NOCDATA);
        $this-&gt;openIdUser = $requestXmlObj-&gt;FromUserName; //来源openId
        $this-&gt;openIdServer = $requestXmlObj-&gt;ToUserName;  //公共账号openId
        $this-&gt;requestMsgType = $requestXmlObj-&gt;MsgType; //消息类型
        switch ($this-&gt;requestMsgType) {
            case 'text':    //文本类型消息
                $this-&gt;requestMsgContent = trim($requestXmlObj-&gt;Content);  //内容
                break;

            default:
                $this-&gt;requestMsgType = "";   //无法适配的消息类型
                break;
        }
    }
    else
    {
        $this-&gt;requestMsgType = "";
    }
}
/**!
* @brief 给用户发送的提示, 此处调
*/
public function sendResponse()
{
    $this-&gt;sendMsgText();  //发送文本回复
}

/**!
* @brief 用微信定义的文本消息结构, 给用户发送文本消息
*/
private function sendMsgText(){ //发送文本消息
    // $userInfo = new userInfoClass();
    if ($this-&gt;requestMsgType != "") {
      //  $textContent = "Welcome to wechat world!".$userInfo-&gt;get_user_info($this-&gt;openIdUser);
        $textContent = "亲爱的你好,本公共账号还在开发中...\n你可以访问我的博客 http://blog.exbye.com\n也可以通过邮件给我留言: nirvana@exbye.com.";
    }
    else{
        $textContent = "";
    }
    $msgType = "text";
    $time = time();
    $textMsg = sprintf($this-&gt;tplText, $this-&gt;openIdUser, $this-&gt;openIdServer, $time, $msgType, $textContent);
    echo $textMsg;
}

/**!
* @brief 在将此接口提供给微信调用时,微信会发送一个get请求,请求内容包括签名时间戳等信息.
* 本web页面将token、timestamp、nonce三个参数进行排序,使用sha1加密并将加密后的字符串与signature对比.
* 如果一致,那么认为这是一次合法的微信请求. 此举, 我想应该防止第三方伪造 微信 的请求.
*/
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;
    }
}
/**!
* @brief 文本回复模板, 同样也可以创建图片回复模板,音频回复模板等.
* 但由于涉及二进制回复内容(音频\视频\图片)的回复,都需要使用使用appkey,即需要进行开发者认证.
* 故此处不再演示.
*/
private $tplText="&lt;xml&gt;
                &lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
                &lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
                &lt;CreateTime&gt;%s&lt;/CreateTime&gt;
                &lt;MsgType&gt;&lt;![CDATA[%s]]&gt;&lt;/MsgType&gt;
                &lt;Content&gt;&lt;![CDATA[%s]]&gt;&lt;/Content&gt;
                &lt;FuncFlag&gt;0&lt;/FuncFlag&gt;
                &lt;/xml&gt;"; 

}
?>
注释都在代码里了. 读者可将此代码保存到index.php文件中, 并将文件放到支持php的web服务器上, 不过在此之前,需要修改一些内容,看图:

[caption id=”attachment_2858” align=”aligncenter” width=”814”]修改接口配置信息 修改接口配置信息[/caption]

至此, 部署就基本完成了. 然后在微信公众账号控制面板中:

设置 => 公众账号设置 => 二维码

你就可以生成一个二维码,供 其他人扫码添加了.比如我的Nirvana公众账号二维码(快快扫码关注吧^ - ^):

[caption id=”attachment_2860” align=”aligncenter” width=”430”]Nirvana订阅号二维码 Nirvana订阅号二维码[/caption]

参考资料: 微信官方文档. PS: 文档也很容易阅读.

Contents
  1. 1. 基础内容
  2. 2. 使用API