2013年5月29日星期三
Android图书下载
中文图书:
Google_Android手机游戏设计达人讲座
http://u.115.com/file/bh0mhw49#
51CTO下载-Google_Android手机游戏设计达人讲座.pdf
Google_Android_SDK开发范例大全
http://u.115.com/file/aqacq4kt#
Google_Android_SDK开发范例大全.pdf
Android高级编程
http://u.115.com/file/aqaci1rr#
Android高级编程.pdf
ANDROID_2.0游戏开发实战宝典
http://u.115.com/file/cloeu7ss#
ANDROID_2.0游戏开发实战宝典.pdf
Google.Android开发入门与实战
http://u.115.com/file/bh0m6lv7#
Google.Android开发入门与实战.pdf
Android应用框架原理与程序设计】高焕堂
http://u.115.com/file/e6rj3w5x#
Android应用框架原理与程序设计】高焕堂.pdf
Android应用开发详解
http://u.115.com/file/dn9kdyo1#
Android应用开发详解.pdf
大话企业级android开发
http://u.115.com/file/e6rj3hqp#
51CTO下载-大话企业级android开发.pdf
[Android系统原理及开发要点详解].(韩超,梁泉)
http://u.115.com/file/bh0m68cp#
[Android系统原理及开发要点详解].(韩超,梁泉).扫描版pdf
英文图书:
Professional_Android__Application_Development
http://u.115.com/file/e6rj66vq#
Professional_Android__Application_Development.pdf
Pro_Android_Games
http://u.115.com/file/cloelh38#
Pro_Android_Games.pdf
Pro_Android_Media
http://u.115.com/file/aqacqdzt#
Pro_Android_Media.pdf
Beginning_Android_Games.2011
http://u.115.com/file/bh0mh2k7#
Beginning_Android_Games.2011.pdf
android_essensial
http://u.115.com/file/e6rj6bsx#
android_essensial.pdf
Wrox.Professional.Android.2.Application.Development.2010
http://u.115.com/file/bh0mhs1r#
Wrox.Professional.Android.2.Application.Development.2010.pdf
Learn.Java.for.Android.Development
http://u.115.com/file/aqacg9ht#
[android.开发书籍].Learn.Java.for.Android.Development.pdf
Beginning.Android.2
http://u.115.com/file/bh0m74mv#
[android.开发书籍].Beginning.Android.2.(Apress,.2010,.1430226293).pdf
Practical.Android.Projects
http://u.115.com/file/aqaciux5#
[android.开发书籍].Practical.Android.Projects.pdf
[Android.游戏开发入门](美)Mario.Zechner.插图版
http://u.115.com/file/cloeu0k8#
[Android.游戏开发入门](美)Mario.Zechner.插图版.pdf
Hello.Android.3rd.Edition
http://u.115.com/file/e6rj3g02#
[android.开发书籍].Hello.Android.3rd.Edition.pdf
Pro.Android.3(第1版)
http://u.115.com/file/e6rj3adm#
[Pro.Android.3(第1版)].(Pro.Android.3).S.Komatineni&D.MacLean&S.Hashimi.文字版.pdf
使用HTML,CSS,JavaScript开发Android应用程序
http://u.115.com/file/aqacixtt#
[使用HTML,CSS,JavaScript开发Android应用程序].(Building.Android.Apps.with.HTML.CSS.and.JavaScript).Jonathan.Stark.文字版.pdf
Android.User.Interface.Development.Beginners.Guide.Feb.2011
http://u.115.com/file/bh0m6y77#
[android.开发书籍].Android.User.Interface.Development.Beginners.Guide.Feb.2011.pdf
Beginning_Android_Games.2011
http://u.115.com/file/dn9kdiz2#
Beginning_Android_Games.2011.pdf
老鹰主机+Godaddy域名
准备搭建自己的网站,Godaddy是全球域名注册排名第一的服务商,去Godaddy购买域名是一个非常不错的选择,它性价比是非常高的,要注意买的时候一定要找优惠码,这可使价格便宜不少呢!虽然是英文界面,但实际注册起来并不麻烦的,建议在网上找找相关的注册教程,非常多的。另外Godaddy是支持我们国内的支付宝的,当然如果有PalPay或国外某些支付工具的话会更好,因为很多优惠是不支持支付宝,而那些价格会更加低廉。
在主机方面,为什么我不选择Godaddy的主机呢,在网上看到很多评论说Godaddy的容易被封,我去看了一下,在价格方面也是相对高点的,而老鹰主机提供商,据说国内访问速度不错,也很稳定,性价比也很高,我买的是basic主机,第一年注册使用优惠码优惠50%,人民币折合是124块多,45G月流量,3000M空间,无限MySQL数据库等,具体可以上官网去看看的。网址为:http://www.hawkhost.com/Shared/compare ,我使用的优惠码是whts50v2,这款basic主机是共享IP的,如果你需要独立IP的话可以另行购买的,也不贵。支付方式上,老鹰主机现在也支持我们国内的支付宝了。开通后不久(我等了一个小时左右)就会收到来自老鹰主机的邮件, 这个时候你的主机就可以正常使用了。
使用Godaddy的域名的时候,绑定到老鹰主机上有两种方法的,一种是登录到老鹰主机的CPanel面板,点击Stats,下面就会有共享IP地址,然后到Godaddy的控制面板,将域名解析到这个IP即可。另外一种方式是修改域名的DNS,将其DNS修改成老鹰主机的DNS即可。老鹰主机的DNS是ns1.hawkhost.com和ns2.hawkhost.com,在你购买完老鹰主机后,会发一封邮件通知你的,里面有DNS,后面的CPanel面板里也有。
微信公众平台消息接口开发(3)
上面那篇讲了翻译宝宝,调用有道翻译的接口,现在开发天气宝宝,调用的接口是中国气象网的,这个返回给用户的信息是图文信息。
先了解下中国气象网的api,其实只是一条url,即http://m.weather.com.cn/data/城市代码.html,如http://m.weather.com.cn/data/101280101.html,其中的101280101是城市代码,可以在浏览器输入这条url,看看返回什么数据。
{
"weatherinfo": {
"city": "广州",
"city_en": "guangzhou",
"date_y": "2013年2月27日",
"date": "",
"week": "星期三",
"fchh": "11",
"cityid": "101280101",
<!-- 从今天开始到第六天的每天的天气情况,这里的温度是摄氏温度 -->
"temp1": "25℃~19℃",
"temp2": "24℃~19℃",
"temp3": "25℃~13℃",
"temp4": "22℃~11℃",
"temp5": "16℃~9℃",
"temp6": "20℃~11℃",
<!-- 从今天开始到第六天的每天的天气情况,这里的温度是华氏温度 -->
"tempF1": "77℉~66.2℉",
"tempF2": "75.2℉~66.2℉",
"tempF3": "77℉~55.4℉",
"tempF4": "71.6℉~51.8℉",
"tempF5": "60.8℉~48.2℉",
"tempF6": "68℉~51.8℉",
<!-- 天气描述 -->
"weather1": "阴",
"weather2": "阴",
"weather3": "阴转小雨",
"weather4": "小雨",
"weather5": "阴转晴",
"weather6": "晴",
<!-- 天气描述图片序号 -->
"img1": "2",
"img2": "99",
"img3": "2",
"img4": "99",
"img5": "2",
"img6": "7",
"img7": "7",
"img8": "99",
"img9": "2",
"img10": "0",
"img11": "0",
"img12": "99",
"img_single": "2",
<!-- 图片名称 -->
"img_title1": "阴",
"img_title2": "阴",
"img_title3": "阴",
"img_title4": "阴",
"img_title5": "阴",
"img_title6": "小雨",
"img_title7": "小雨",
"img_title8": "小雨",
"img_title9": "阴",
"img_title10": "晴",
"img_title11": "晴",
"img_title12": "晴",
"img_title_single": "阴",
<!-- 风速描述 -->
"wind1": "微风",
"wind2": "微风",
"wind3": "微风转北风4-5级",
"wind4": "北风4-5级转3-4级",
"wind5": "微风",
"wind6": "微风",
<!-- 风速级别描述 -->
"fx1": "微风",
"fx2": "微风",
"fl1": "小于3级",
"fl2": "小于3级",
"fl3": "小于3级转4-5级",
"fl4": "4-5级转3-4级",
"fl5": "小于3级",
"fl6": "小于3级",
<!-- 今天穿衣指数 -->
"index": "舒适",
"index_d": "建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。",
<!-- 48小时穿衣指数 -->
"index48": "舒适",
"index48_d": "建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。",
<!-- 紫外线及48小时紫外线 -->
"index_uv": "最弱",
"index48_uv": "最弱",
<!-- 洗车 -->
"index_xc": "较适宜",
<!-- 旅游 -->
"index_tr": "适宜",
<!-- 舒适指数 -->
"index_co": "舒适",
"st1": "26",
"st2": "18",
"st3": "25",
"st4": "18",
"st5": "26",
"st6": "9",
<!-- 晨练 -->
"index_cl": "较适宜",
<!-- 晾晒 -->
"index_ls": "不太适宜",
<!-- 过敏 -->
"index_ag": "极不易发"
}
}
返回的是json格式的数据,至少返回的数据是什么意思,我也已注明。
在根目录下建立一个weather_code.php文件,里面主要是存储各城市的城市名和对应的城市代码,是一个数组,下面只显示部分数据:
<!--?php $weather_code = array( '北京' =--> 101010100,
'重庆' => 101040100,
'上海' => 101020100,
'天津' => 101030100,
'澳门' => 101330101,
'香港' => 101320101,
'合肥' => 101220101,
'蚌埠' => 101220201,
'芜湖' => 101220301,
'淮南' => 101220401,
'马鞍山' => 101220501,
'安庆' => 101220601,
'宿州' => 101220701
);
在index.php文件里,新建一个获取天气信息的方法,如下:
/**
* getWeather
* @param $keyword
* @return unknown
*/
function getWeather($keyword) {
include 'weather_code.php';
$code=$weather_code[$keyword];
$url="http://m.weather.com.cn/data/".$code.".html";
$file=file_get_contents($url);
$obj=json_decode($file);
$weatherinfo = $obj -> weatherinfo;
$city = $weatherinfo -> city;
$temp1=$weatherinfo->temp1;
$temp2=$weatherinfo->temp2;
$temp3=$weatherinfo->temp3;
$img1=$weatherinfo->img1;
$img2=$weatherinfo->img3;
$img3=$weatherinfo->img5;
$weather1=$weatherinfo->weather1;
$weather2=$weatherinfo->weather2;
$weather3=$weatherinfo->weather3;
$wind1=$weatherinfo->wind1;
$wind2=$weatherinfo->wind2;
$wind3=$weatherinfo->wind3;
$index=$weatherinfo->index;
$index_d=$weatherinfo->index_d;
$date_y=$weatherinfo->date_y;
$week=$weatherinfo->week;
$array = array(
array("title"=>$city." ".$week." ".$temp1." ".$weather1,"des"=>"testdes","pic"=>"http://api.itcreating.com/weather/image.jpg"),
array("title"=>$index_d,"des"=>"testdes"),
array("title"=>date("Y年m月d日")." ".$temp1." ".$weather1." ".$wind1,"des"=>"testdes","pic"=>"http://api.itcreating.com/weather/images/".$img1.".png"),
array("title"=>date("Y年m月d日",strtotime("+1 day"))." ".$temp2." ".$weather2." ".$wind2,"des"=>"testdes","pic"=>"http://api.itcreating.com/weather/images/".$img2.".png"),
array("title"=>date("Y年m月d日",strtotime("+2 day"))." ".$temp3." ".$weather3." ".$wind3,"des"=>"testdes","pic"=>"http://api.itcreating.com/weather/images/".$img3.".png"),
);
return $array;
}
这方法很简单,通过传入城市名,然后获取该城市的城市代码,接着通过中国气象网api发送请求,再将中国气象网返回的数据通过PHP的JSON解析函数json_decode将JSON格式的数据解析为PHP的关联数组,最后将我们需要的信息取出来再封装成数组。
注释掉$wechatObj->responseMsg();
在$wechatObj->responseMsg()下面加入$wechatObj->responseImgMsg();并新建一个responseImgMsg方法,如下:
public function responseImgMsg()
{
//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);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
$textHaderTpl = "
<![CDATA[%s]]>
<![CDATA[%s]]>
%s
<![CDATA[news]]>
%d
";
$textContentTpl = "
<![CDATA[%s]]>
<![CDATA[%s]]>
<![CDATA[%s]]>
<![CDATA[%s]]>
";
$textFooterTpl = "
1
";
if(!empty( $keyword ))
{
$msgType = "news";
// 判断是否首次关注
if ( $keyword == "Hello2BizUser" ) {
}else {
$array = getWeather($keyword);
$resultHaderStr = sprintf($textHaderTpl, $fromUsername, $toUsername, $time, count($array));
foreach ($array as $key => $value) {
$resultContentStr .= sprintf($textContentTpl, $value['title'], $value['des'], $value['pic'], $value['url']);
}
$resultFooterStr = sprintf($textFooterTpl);
echo $resultStr = $resultHaderStr,$resultContentStr,$resultFooterStr;
}
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
要返回图文消息的,就要使用数组这种方式将将消息输出。
源码已在github上托管,可以上去下载,地址:https://github.com/hxxy2003/Weather-weixin
微信公众平台消息接口开发(2)
消息推送,也就是用户向公众账号发送的消息的类型,目前支持的有文本、图片、地理位置、链接、事件消息等五种,公众账号的回复消息有三种,文本、音乐、图文。
我开发两个公众平台的应用,一个是天气宝宝,一个是翻译宝宝,其中天气宝宝返回的是图文信息、翻译宝宝返回的是文字信息,接下来将以这两个应用为例讲解公众平台应用的开发。
翻译宝宝使用的是有道翻译的api,但是有道翻译的api是有使用限制的,每个小时不超过1000次,对于大部分人来说,这已经够了,申请的地址:http://fanyi.youdao.com/openapi?path=data-mode ,申请完后就有API Key了。
下面是翻译宝宝第一版本的源码:
<!--?php /** * wechat php test */ //
define your token define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj--->responseMsg();
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);
$fromUsername = $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 = $keyword;
// 判断是否首次关注
if ( $keyword == "Hello2BizUser" ) {
$contentStr = "欢迎关注翻译宝宝,请输入你要翻译的单词或句子!";
}else {
$contentStr =YouDaoTranslate($keyword);
}
$resultStr = sprintf($textTpl, $fromUsername, $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;
}
}
}
/**
*
* http://fanyi.youdao.com/openapi.do?keyfrom=&key=&type=data&doctype=json&version=1.1&q=翻译
{
"errorCode":0
"query":"翻译",
"translation":["translation"], // 有道翻译
"basic":{ // 有道词典-基本词典
"phonetic":"fān yì",
"explains":[
"translate",
"interpret"
]
},
"web":[ // 有道词典-网络释义
{
"key":"翻译",
"value":["translator","translation","translate","Interpreter"]
},
{...}
]
}
*/
function YouDaoTranslate($keyword) {
$url="http://fanyi.youdao.com/openapi.do?keyfrom=*****&key=*******&type=data&doctype=json&version=1.1&q=".urlencode($keyword);
//初始化一个cURL对象
$curl=curl_init();
//设置要抓取的URL
curl_setopt($curl,CURLOPT_URL,$url);
//设置cURL参数,要求结果保存到字符串中还是输出到屏幕上
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
//运行cURL,请求网页
$output=curl_exec($curl);
//解析返回的结果,设置true是在php中将其转为数组
$youdaoResult=json_decode($output,true);
$errorcode=$youdaoResult['errorCode'];
foreach ($explains as $value){
$translation=$translation."\n".$value;
}
return $youdaoResult['translation'][0];
}
?>
微信公众平台消息接口开发(1)
现在微信很热,微信公众平台的应用也很热,其实微信公众平台消息接口开发并不难,只要有接口调用就OK了。
要开发微信公众平台上的应用,得准备什么呢?
至少要有一个公众账号、服务器、域名这三样东西。
可以使用一个QQ账号,到http://mp.weixin.qq.com/ 申请一个公众账号,当然现在还要上传身份证的图片,天朝特色,大家懂的。
申请好公众账号之后,登录公众账号,点击菜单上的高级功能,然后选择开启开发模式 ,如下:
点击进入可以看到如下:
点击成为开发者,进去设置域名和token,这两个非常重要的。如下:
也可以查看开发文档:http://mp.weixin.qq.com/wiki/index.php?title=%E9%A6%96%E9%A1%B5 ,开发文档是必须要看的。
打开开发文档,下面有个php的示例,将其下载,上传到你接口配置信息的URL下,并修改如下:
<?php /** * wechat php test */ //define your token define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); $wechatObj->valid();
修改“weixin” 成你在配置的时候填写的TOKEN即可,然后再去接口配置那里点击修改,但是什么都不修改,点击提交便可看到成功的提示。
$wechatObj->valid();这句是非常重要的,检测TOKEN是否有效。
$wechatObj->valid();这句是非常重要的,检测TOKEN是否有效。
这时注释掉$wechatObj->valid();
另外添加一句:
$wechatObj->responseMsg();
所有的代码如下:
<?php /** * wechat php test */ //define your token define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); //$wechatObj->valid(); $wechatObj->responseMsg(); 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); $fromUsername = $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, $fromUsername, $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; } } } ?>
有你的微信关注这个公众账号的微信,然后你随便发什么文字过去,它都会回你“Welcome to wechat world!”,哈哈,因为这里已经定义死了。
这里再讲下一个很重要的知识点,就是通讯机制,分为以下几个过程:
1.用户给公众账号发送消息;
2.微信后台接收到消息;
3.微信后台将接收的消息发送到我们前面配置的域名那,也就是我们的服务器端;
4.我们的服务器端接收微信后台发过来的消息,并进行处理,再将处理后的数据发送给微信后台;
5.微信后台接收我们的服务器端发送过去的数据,并将其返回给用户。
这里再讲下一个很重要的知识点,就是通讯机制,分为以下几个过程:
1.用户给公众账号发送消息;
2.微信后台接收到消息;
3.微信后台将接收的消息发送到我们前面配置的域名那,也就是我们的服务器端;
4.我们的服务器端接收微信后台发过来的消息,并进行处理,再将处理后的数据发送给微信后台;
5.微信后台接收我们的服务器端发送过去的数据,并将其返回给用户。
微信公众平台消息接口开发(1)-官方的Demo有问题
本系列教程以微信公众平台应用妈妈助手(账号mmhelper:发送食物名称或拼音首字母查询孕妇、坐月子、宝宝能不能吃哪些食物。发送自己的位置查询附近的母婴类商家,以及促销、团购等信息。发送与宝宝的合照测试与宝宝的脸部相似度)为例,讲解微信接口开发过程。欢迎大家关注该账号,二维码见底部图。
使用前提条件:拥有一个公网上的HTTP服务器主机空间,具有创建目录、上传文件等权限。推荐新浪的SAE。http://sae.sina.com.cn/
首先请注册微信公众平台的账号,注册地址:http://mp.weixin.qq.com/
本教程主要讲解接口的开发流程。
官方的文档非常简洁:http://mp.weixin.qq.com/cgi-bin/indexpage?t=wxm-callbackapi-doc&lang=zh_CN
事例代码也跑不通。我研究了一番,终于搞定。方法如下:
一、写好接口程序
在你的服务器上上传好一个接口程序文件,如http://www.yourdomain.com/weixin.php 内容如下:
<?php
define("TOKEN", "weixin");//自己定义的token 就是个通信的私钥
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
//$wechatObj->responseMsg();
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $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 = '你好啊,屌丝';
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo '咋不说哈呢';
}
}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;
}
}
}
?>
二、配置微信公众平台回复接口
设置回复接口,填好URL和Token(url填上面的http://www.yourdomain.com/weixin.php,token必须跟上面程序里面定义的Token一致)
三、验证接口
用自己的个人微信关注下你的公众账号,给这个账号发一条消息过去,收到原样的消息返回,即验证成功了。
四、开始自定义回复
注释掉$wechatObj->valid(); 这行,同时去掉//$wechatObj->responseMsg();这行的注释。
你可以修改responseMsg函数里面的代码,根据用户的消息类型('text','image','location')和消息内容来回复用户不同的内容。
消息接口就可以使用了,发个消息试试看吧?
微信公众平台消息接口开发(2)-封装weixin.class.php
一、封装weixin.class.php
由于微信公众平台的通信使用的是特定格式的XML数据,每次接受和回复都要去做一大堆的数据处理。
我们就考虑在这个基础上做一次封装,weixin.class.php,代码如下:
<?php
class Weixin
{
public $token = '';//token
public $debug = false;//是否debug的状态标示,方便我们在调试的时候记录一些中间数据
public $setFlag = false;
public $msgtype = 'text'; //('text','image','location')
public $msg = array();
public function __construct($token,$debug)
{
$this->token = $token;
$this->debug = $debug;
} //获得用户发过来的消息(消息内容和消息类型 )
public function getMsg()
{
$postStr =
$GLOBALS["HTTP_RAW_POST_DATA"];
if ($this->debug) {
$this->write_log($postStr);
}
if (!empty($postStr)) {
$this->msg =
(array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$this->msgtype =
strtolower($this->msg['MsgType']);
}
} //回复文本消息
public function makeText($text='')
{
$CreateTime = time();
$FuncFlag = $this->setFlag ? 1 : 0;
$textTpl = "<xml>
<ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName>
<FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName>
<CreateTime>{$CreateTime}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>%s</FuncFlag>
</xml>";
return
sprintf($textTpl,$text,$FuncFlag);
} //根据数组参数回复图文消息
public function makeNews($newsData=array())
{
$CreateTime = time();
$FuncFlag = $this->setFlag ? 1 : 0;
$newTplHeader = "<xml>
<ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName>
<FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName>
<CreateTime>{$CreateTime}</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[%s]]></Content>
<ArticleCount>%s</ArticleCount><Articles>";
$newTplItem = "<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>";
$newTplFoot = "</Articles>
<FuncFlag>%s</FuncFlag>
</xml>";
$Content = '';
$itemsCount =
count($newsData['items']);
$itemsCount = $itemsCount < 10 ?
$itemsCount : 10;//微信公众平台图文回复的消息一次最多10条
if ($itemsCount) {
foreach ($newsData['items'] as $key
=> $item) {
if ($key<=9) {
$Content .=
sprintf($newTplItem,$item['title'],$item['description'],$item['picurl'],$item['url']);
}
}
}
$header =
sprintf($newTplHeader,$newsData['content'],$itemsCount);
$footer =
sprintf($newTplFoot,$FuncFlag);
return $header . $Content . $footer;
}
public function reply($data)
{
if ($this->debug) {
$this->write_log($data);
}
echo $data;
}
public function valid()
{
if ($this->checkSignature()) {
if(
$_SERVER['REQUEST_METHOD']=='GET' )
{
echo $_GET['echostr'];
exit;
}
}else{
write_log('认证失败');
exit;
}
}
private function checkSignature()
{
$signature =
$_GET["signature"];
$timestamp =
$_GET["timestamp"];
$nonce = $_GET["nonce"];
$tmpArr = array($this->token,
$timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
} private function
write_log($log){ //这里是你记录调试信息的地方 请自行完善 以便中间调试 }
}
?>
二、调用weixin.class.php
把你的微信公众平台主接口文件(如前面定义的http://www.yourdomain.com/weixin.php)中,修改代码为:
include_once('weixin.class.php');//引用刚定义的微信消息处理类define("TOKEN",
"mmhelper");define('DEBUG', true);
$weixin = new
Weixin(TOKEN,DEBUG);//实例化
$weixin->getMsg();
$type =
$weixin->msgtype;//消息类型
$username =
$weixin->msg['FromUserName'];//哪个用户给你发的消息,这个$username是微信加密之后的,但是每个用户都是一一对应的
if
($type==='text') {
if
($weixin->msg['Content']=='Hello2BizUser') {//微信用户第一次关注你的账号的时候,你的公众账号就会受到一条内容为'Hello2BizUser'的消息
$reply = $weixin->makeText('欢迎你关注妈妈助手哦,屌丝');
}else{//这里就是用户输入了文本信息
$keyword =
$weixin->msg['Content']; //用户的文本消息内容
include_once("chaxun.php");//文本消息 调用查询程序
$chaxun= new
chaxun(DEBUG,$keyword,$username);
$results['items']
=$chaxun->search();//查询的代码
$reply = $weixin->makeNews($results);
}
}elseif
($type==='location') {
//用户发送的是位置信息 稍后的文章中会处理
}elseif
($type==='image') {
//用户发送的是图片 稍后的文章中会处理
}elseif
($type==='voice') {
//用户发送的是声音 稍后的文章中会处理
}
$weixin->reply($reply);
三、查询代码
还需要将数据库里面的查询结果格式化为特定的形式
public function
search(){
$record=array(); //定义返回结果的数组
$list =
$this->search($this->keyword);//普通的根据关键词查询数据库的操作 代码就不用分享了
if(is_array($list)&&!empty($list)){
foreach($list as $msg){
$record[]=array(//以下代码,将数据库中查询返回的数组格式化为微信返回消息能接收的数组形式,即title、description、picurl、url 详见微信官方的文档描述
'title' =>$msg['title'],
'description'
=>$msg['discription'],
'picurl' =>
$msg['pic_url'],
'url' =>$msg['url']
); } } return
$record;}
订阅:
博文 (Atom)