微信大众,平台开辟(二) 微信大众,平台示例代码解析

    添加时间:2013-6-7 点击量:

    一、择要


    微信大众,平台供给了一个简单的php示例代码,在做进一步开辟之前,我们有须要将其具体懂得一下。


    二、获庖代码


    微信官网:http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip


    三、解析代码


    完全代码如下:



    <?php
    
    /
    wechat php test
    /

    //define your token
    define(TOKEN, weixin);
    ¥wechatObj = new wechatCallbackapiTest();
    ¥wechatObj->valid();

    class wechatCallbackapiTest
    {
    public function valid()
    {
    ¥echoStr = ¥_GET[echostr];

    //valid signature , option
    if¥this->checkSignature()){
    echo ¥echoStr;
    exit;
    }
    }

    public function responseMsg()
    {
    //get post data, May be due to the different environments
    ¥postStr = ¥GLOBALS[HTTP_RAW_POST_DATA];

    //extract post data
    if (!empty¥postStr)){

    ¥postObj = simplexml_load_string¥postStr, SimpleXMLElement, LIBXML_NOCDATA);
    ¥Username = ¥postObj->FromUserName;
    ¥toUsername = ¥postObj->ToUserName;
    ¥keyword = trim¥postObj->Content);
    ¥time = time();
    ¥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>
    ;
    if(!empty¥keyword ))
    {
    ¥msgType = text;
    ¥contentStr = Welcome to wechat world!;
    ¥resultStr = sprintf¥textTpl¥Username¥toUsername¥time¥msgType¥contentStr);
    echo ¥resultStr;
    }
    else{
    echo Input something...;
    }

    }
    else {
    echo ;
    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;
    }
    }
    }

    ?>


    3.1 整体解析


    原始示例代码大致分为四个项目组:



    • 定义TOKEN

    • 声明一个类 wechatCallbackapiTest

    • 创建类wechatCallbackapiTest 的一个实例对象 ¥wechatObj

    • 调用类的 valid() 办法。


    3.2 具体解析


    3.2.1 定义TOKEN


    define(TOKEN, weixin);


    define 是用来给常量赋值的函数,这句话的意思是付与“TOKEN”这个常量值为“weixin”。


    TOKEN 是用来进行交互安然认证的,开辟者可以随便定义,要和大众,平台里设置的一样。


    3.2.2 声明一个类


    class wechatCallbackapiTest{


    }


    声明一个类 wechatCallbackapiTest,该类中包含有三个办法(函数)。


    a. public function valid()


    用于申请 成为开辟者 时向微信发送验证信息。


    b. public function responseMsg()


    处理惩罚并答复用户发送过来的消息,也是用的最多的一个函数,几乎所有的功能都在这里实现。



    responseMsg 函数详解:

    ¥postStr = ¥GLOBALS[HTTP_RAW_POST_DATA];
    接管微信大众,平台发送过来的用户消息,该消息数据布局为XML,不是php默认的辨认数据类型,是以这里用了¥GLOBALS[HTTP_RAW_POST_DATA]来接管,同时赋值给了¥postStr

    if (!empty(¥postStr))
    断定¥postStr是否为空,若是不为空(接管到了数据),就持续履行下面的语句;若是为空,则跳转到与之相对应的else语句。

    ¥postObj = simplexml_load_string(¥postStr, SimpleXMLElement, LIBXML_NOCDATA);
    应用simplexml_load_string() 函数将接管到的XML消息数据载入对象¥postObj中。这个严谨的写法后面还得加个断定是否载入成功的前提语句,不过不写也没事。

    ¥Username = ¥postObj->FromUserName;
    将对象¥postObj中的发送消息用户的OPENID赋值给¥Username变量

    ¥toUsername = ¥postObj->ToUserName;
    将对象¥postObj中的大众,账号的ID赋值给¥toUsername变量

    ¥keyword = trim(¥postObj->Content);
    trim() 函数从字符串的两端删除空白字符和其他预定义字符,这里就可以获得用户输入的关键词

    ¥time = time();
    time() 函数返回当前时候的 Unix 时候戳,即自从 Unix (格林威治时候 1970 年 1 月 1 日 00:00:00)到当前时候的秒数。

    ¥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>;
    存放微信输出内容的模板

    if(!empty( ¥keyword ))
    断定¥keyword是否为空,不为空则持续履行下面的语句;若是为空,则跳转到与之相对应的else语句,即 echo Input something...;

    ¥msgType = text;
    消息类型是文本类型

    ¥contentStr = Welcome to wechat world!;
    答复的消息内容

    ¥resultStr = sprintf(¥textTpl, ¥Username, ¥toUsername, ¥time, ¥msgType, ¥contentStr);
    应用sprintf() 函数将格局化的数据写入到变量中去;
    ¥Username, ¥toUsername, ¥time, ¥msgType, ¥contentStr 分别次序调换模板里“%s”地位,也便是“¥resultStr”这个变量最后实际为:

    <xml>
    <ToUserName><![CDATA[¥toUsername]]></ToUserName>
    <FromUserName><![CDATA[¥Username]]></FromUserName>
    <CreateTime>¥time</CreateTime>
    <MsgType><![CDATA[¥msgType]]></MsgType>
    <Content><![CDATA[¥contentStr]]></Content>
    <FuncFlag>0</FuncFlag>      //位0 x0001被标记时,星标刚收到的消息。
    </xml>


    echo ¥resultStr;     //把答复的消息输出





    c. private function checkSignature()


    开辟者经由过程查验signature对恳求进行校验(下面有校验体式格式)。若确认此次GET恳求来自微信办事器,恳求原样返回echostr参数内容,则接入生效,不然接入失败。


    signature连络了开辟者填写的token参数和恳求中的timestamp参数、nonce参数。



    加密/校验流程:
    
    1. 将token、timestamp、nonce三个参数进行字典序排序
    2. 将三个参数字符串拼接成一个字符串进行sha1加密
    3. 开辟者获得加密后的字符串可与signature对比,标识该恳求起原于微信


    3.2.3 创建实例对象


    ¥wechatObj = new wechatCallbackapiTest();


    3.2.4 调用类办法验证


    ¥wechatObj->valid();


    调用类的valid()办法履行接口验证,接口设置成功后将其注释掉。


    四、总结


    以上是对微信官方示例代码的一个解析,有申明不合错误的处所,还请高手指出。别的,该代码只是官方给出的简单示例代码,若是要做错杂的开辟,还是请求开辟者遵守严谨的开辟模式改写该段代码,会在后续教程中娓娓道来。


    五、参考


    微信官方大众,平台API文档:http://mp.weixin.qq.com/wiki/index.php


    六、存眷


    请存眷 卓锦姑苏 微信大众,帐号,卓锦姑苏 基于SAE 平台开辟,针对于主流的微信功能进行开辟测试。


    您可以存眷 卓锦姑苏 大众,帐号进行功能测试,以及获取新的应用开辟。


    1. 登录微信客户端,伴侣们 -> 添加伴侣 -> 搜号码 -> zhuojinsz,查找并存眷。


    2. 扫描二维码:



    卓锦姑苏 功能列表。


    所有随风而逝的都属于昨天的,所有历经风雨留下来的才是面向未来的。—— 玛格丽特·米切尔 《飘》
    分享到: