创建微信公众平台

基础内容

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

基本信息 => 邮箱激活 => 选择类型 => 信息登记 => 公众号信息

注册过程不是本文的重点. 注册结束之后,将得到如下管理界面:

微信公众平台控制面板
微信公众平台控制面板

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

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

使用API

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

微信公众平台架构
微信公众平台架构

开发者要做的, 是在自己的服务器(公众平台服务器)上按照微信的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->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->openIdUser = $requestXmlObj->FromUserName; //来源openId
            $this->openIdServer = $requestXmlObj->ToUserName;  //公共账号openId
            $this->requestMsgType = $requestXmlObj->MsgType; //消息类型
            switch ($this->requestMsgType) {
                case 'text':    //文本类型消息
                    $this->requestMsgContent = trim($requestXmlObj->Content);  //内容
                    break;
                
                default:
                    $this->requestMsgType = "";   //无法适配的消息类型
                    break;
            }
        }
        else
        {
            $this->requestMsgType = "";
        }
    }
    /**!
    * @brief 给用户发送的提示, 此处调
    */
    public function sendResponse()
    {
        $this->sendMsgText();  //发送文本回复
    }

    /**!
    * @brief 用微信定义的文本消息结构, 给用户发送文本消息
    */
    private function sendMsgText(){ //发送文本消息
        // $userInfo = new userInfoClass();
        if ($this->requestMsgType != "") {
          //  $textContent = "Welcome to wechat world!".$userInfo->get_user_info($this->openIdUser);
            $textContent = "亲爱的你好,本公共账号还在开发中...\n你可以访问我的博客 https://blog.exbye.com\n也可以通过邮件给我留言: nirvana@exbye.com.";
        }
        else{
            $textContent = "";
        }
        $msgType = "text";
        $time = time();
        $textMsg = sprintf($this->tplText, $this->openIdUser, $this->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="<xml>
                    <ToUserName><![CDATA[%s]]></ToUserName>
                    <FromUserName><![CDATA[%s]]></FromUserName>
                    <CreateTime>%s</CreateTime>
                    <MsgType><![CDATA[%s]]></MsgType>
                    <Content><![CDATA[%s]]></Content>
                    <FuncFlag>0</FuncFlag>
                    </xml>"; 
}
?>

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

修改接口配置信息
修改接口配置信息

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

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

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

Nirvana订阅号二维码
Nirvana订阅号二维码

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

Tagged with: , , , ,

发表评论

邮箱地址不会被公开。 必填项已用*标注

*