-
- 定义TOKEN
- 声明一个类 wechatCallbackapiTest
- 创建类wechatCallbackapiTest 的一个实例对象 ¥wechatObj
- 调用类的 valid() 办法。
微信大众,平台开辟(二) 微信大众,平台示例代码解析
添加时间: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 整体解析
原始示例代码大致分为四个项目组:
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. 扫描二维码:
卓锦姑苏 功能列表。
所有随风而逝的都属于昨天的,所有历经风雨留下来的才是面向未来的。—— 玛格丽特·米切尔 《飘》