您的位置:首页 > 移动开发 > 微信开发

微信公众平台的开发者模式(PHP)

2014-11-02 22:55 169 查看
该篇为原创,若转载请麻烦注明链接http://blog.csdn.net/u011852230/article/details/40718115,转自wjbianjason.

我做的主要是一个利用爬虫返回微信用户需要的检索信息,如图是第一版,新版为右边的二维码,希望大家帮我宣传下,支持检索北京的所有活动,我主要利用这个收集地理位置数据,用于离线检测我地理上下文推荐的毕设论文。





好了,废话少说,现在开始步入正题

1、首先创建一个微信公众账号,一般人用订阅号,就行了,注意创建的时候需要很详细的身份信息,做好心理准备

2、申请完后进入公众账号的操作界面,点击左下角的开发者中心,进去以后会有button让你切换到开发者模式

3、因为进入开发者模式需要把微信用户的信息传入你的服务器进行处理,所以首先你得有个服务器,如果你只是闹着玩,我有两个推荐,一是用百度的开发者中心申请服务器空间(花很少的钱),但因为需要注册百度钱包,我断然拒绝了,另外一个是去“免费空间”贴吧,里面能找到最新的免费服务器空间申请地址,一般都配好了PHP环境,我的就是在那里面找的一个网址,但那个ping值实在太高了,我就不推荐了,大家可以去找找ping值低点的,说到这,要提醒大家,微信在向你的服务器传递信息5s后若未收到回复就自动丢包了。还有就是微信只支持80端口哟!

4、讲完前戏,讲正经的了,首先你要知道和微信平台交互的数据格式。这个可以在微信开发者中心那个界面的下面找到接口权限表里看到所有格式。下面为我们主要用的两种回复格式文字、图文。

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>

往CDTA[ ]这个中括号里面填内容就行了。

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>2</ArticleCount>
<Articles>
<item>
<Title><![CDATA[title1]]></Title>
<Description><![CDATA[description1]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
<item>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
</Articles>
</xml>
图文格式需要注意的就是ArticleCount,和item,一条图文信息是一个item,每条item肯定都得包在父节点Article里,有多少个item你就得在ArticleCount里写清楚,如代码里写的2,下面就只有两个item,当有多条item时,就会隐藏掉description,不要以为会让你点一下显示出了,点一下后直接跳入Url里给出的链接了,所以当有多条时可以直接将description置为空。

5、将以下代码放入服务器,一定要能被链接到。然后在微信开发者控制板填上对应URL点提交就行了。这是微信验证你的URL的

<?php
define("TOKEN", "YoonPer"); //TOKEN值
$wechatObj = new wechat();
$wechatObj->valid();
class wechat {
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;
}
}
}
?>
大概能知道微信服务器用GET方式向你的服务器传了一些东西来验证,不去深究,验证完就删了吧。

5、然后在你服务器建立一个default.php,因为我们自己玩所以可以适当精简,比如不用密钥和令牌。你看我就没用

<?php
$wechatObj = new wechat();
$wechatObj->responseMsg();
class wechat {
public function responseMsg() {

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //获取POST数据
//用SimpleXML解析POST过来的XML数据------不了解这个函数的可以去W3school查一下,我记得还有一个解析DOM的函数。
$postObj = simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName; //获取发送方帐号(OpenID)
$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>";

$msgType = "text"; //消息类型,当为图文的时候应该填news
$contentStr = 'helloWorld'; //返回消息内容

//格式化消息模板
$resultStr = sprintf($textTpl,$fromUsername,$toUsername,
$time,$msgType,$contentStr);//学过C就知道这个函数吧
echo $resultStr; //输出结果,直接返回给微信,返回模式类似于ajax
}
}
?>
代码写好后,发条信息测试一下,能收到helloworld,那就恭喜了,因为你可以通关微信干许多好玩的事了,比如搜电影,搜图书之类,这要看你怎么用检索,无非是获取源代码正则匹配罢了,说到这要提一点,有些网站能用fopen获取网页源代码,但是fopen有个问题是它会在HTTP包里告诉服务器我是来获取源代码的,所以很容易遇到403forbidden,这和爬虫框架Scrapy很像,会傻了吧唧告诉人家我是爬虫哦!不过Scrapy可以更改用户池来修正这个,我以后会讲,所以最好的办法是用CURL获取网页源代码,是因为它自动设置代理,模拟浏览器行为啦,被你检索的服务器自然以为来了一位客户。

好了,第一次写博文,请多多指教

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: