微信公众平台最佳实践开发第2章 获取服务器资源

作者:方倍工作室 来源:方倍工作室 时间:2014-05-11 21:59

使用微信公众平台开发模式需要拥有自己的服务器资源,用于存放自己开发的程序文件。本章将主要介绍如何申请免费的新浪SAE应用空间以及上传接口程序文件。如果自己拥有云主机或虚拟主机,那么使用自有的服务器也是不错的一个选择。
2.1 新浪SAE
Sina App Engine(以下简称SAE)是新浪研发中心于2009年8月开始内部开发,并在2009年11月3日正式推出第一个Alpha版本的国内首个公有云计算平台(http://sae.sina.com.cn),SAE是新浪云计算战略的核心组成部分。
SAE作为国内的公有云计算,从开发伊始借鉴吸纳Google、Amazon等国外公司的公有云计算的成功技术经验,并很快推出不同于他们的具有自身特色的云计算平台。SAE选择在国内流行最广的Web开发语言PHP作为首选的支持语言,Web开发者可以在Linux、Mac、Windows上通过SVN或者Web版在线代码编辑器进行开发、部署、调试,团队开发时还可以进行成员协作,不同的角色将对代码、项目拥有不同的权限;SAE提供了一系列分布式计算、存储服务供开发者使用,包括分布式文件存储、分布式数据库集群、分布式缓存、分布式定时服务等,这些服务将大大降低开发者的开发成本。同时SAE整体架构的高可靠性和新浪的品牌保证大大降低了开发者的运营风险。另外,作为典型的云计算,SAE采用“所付即所用,所付仅所用”的计费理念,通过日志和统计中心精确地计算每个应用的资源消耗(包括CPU、内存、磁盘等)。
总之,SAE就是简单高效的分布式Web服务开发、运行平台。
2.1.1 申请账号
SAE的注册地址为http://sae.sina.com.cn/?m=user&a=reg,在浏览器中输入该网址,将自动跳转到“SAE新浪云计算平台”在新浪微博的应用授权界面,如
图2-1所示。
如果你还没有新浪微博账号,需要注册一个,注册新浪微博账号的过程比较简单,本书就不再介绍了。在图2-1中填写新浪微博账号及密码之后,点击“登录”按钮,将跳转到授权确认页面,如图2-2所示。
点击“授权”按钮,将跳转到SAE的用户注册页面,如图2-3所示。
填写真实姓名、安全邮箱、安全密码、确认密码、绑定手机及验证码之后,点击“下一步”按钮,将跳转到手机号验证页面,如图2-4所示。

图2-1 SAE登录界面

图2-2 SAE新浪云计算平台授权确认页面

图2-3 SAE用户注册页面

图2-4 SAE手机认证页面
填写手机收到的短信验证码后,点击“验证手机”按钮,将提示注册成功。
至此,我们成功注册了SAE账号。
2.1.2 创建应用
使用注册成功的新浪微博账号登录SAE,登录后界面如图2-5所示。

图2-5 SAE登录页面
在最上方右侧的导航列表中,点击“我的应用”链接,再从下拉列表中选择“应用列表”链接,将跳转到“应用列表”页面,如图2-6所示。
点击页面中的“创建新应用”按钮,这时会弹出提示框,提示禁止放置违法违规内容,点击“继续创建”按钮,弹出创建应用页面,如图2-7所示。

图2-7 创建应用
在应用创建页面中,依次填写二级域名(AppID)、应用名称、验证码,开发语言选择PHP,应用类型选择web应用。如果AppID已经被其他人注册,会提示已经被占用,需要重新填入。填写完毕后,点击“创建应用”按钮,将弹出安全认证框,系统将要求输入安全密码,在正确输入安全密码之后,将提示创建成功,如图2-8所示。
应用创建成功之后,会自动跳转到应用列表中,在应用列表中可以看到刚才创建的应用。
2.1.3 创建版本
在应用列表中,点击刚才创建的应用cctv15,进入应用信息页面,如图2-9所示。

图2-9 应用信息
找到左侧目录下的“应用管理”,点击下面的“代码管理”链接,跳转到代码管理页面,如图2-10所示。

图2-10 代码管理
点击右侧的“这里创建一个版本”按钮,将弹出创建版本页面,如图2-11
所示。
版本号默认为1,可以不更改,直接点击“创建”按钮,如图2-12所示。
       
    图2-11 创建版本    图2-12 创建版本成功
至此,就成功创建了一个域名URL为 http://cctv15.sinaapp.com/的SAE应用了。这个URL将会在后面用到。
2.1.4 上传代码
将以下PHP代码保存到文件index.php。或者直接使用微信官方提供的文件。
<?php
/*
    方倍工作室 http://www.cnblogs.com/txw1958/
    CopyRight 2013 www.doucube.com  All Rights Reserved
*/

define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if (isset($_GET['echostr'])) {
    $wechatObj->valid();
}else{
    $wechatObj->responseMsg();
}

class wechatCallbackapiTest
{
    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;
        }
    }

    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($keyword == "?" || $keyword == "?")
            {
                $msgType = "text";
                $contentStr = date("Y-m-d H:i:s",time());
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                echo $resultStr;
            }
        }else{
            echo "";
            exit;
        }
    }
}
?>
请注意,必须使用专业的开发软件来保存操作,如Notepad++,不要使用Windows自带的记事本等,保存时需设置格式为“UTF-8无BOM格式”。图2-13是Notepad++的设置。
然后使用压缩软件WinRAR将其压缩成ZIP格式(见图2-14),注意不能用RAR格式,因为SAE不支持RAR格式的文件上传。

图2-14 压缩ZIP文件
这样就会生成一个index.zip的压缩文件。
再回到我们之前创建的SAE应用的代码管理界面中,点击“操作”按钮,在下拉列表中选择“上传代码包”,如图2-15所示。

图2-15 选择上传代码包
选择上传代码包后,将弹出“代码上传”页面,点击“上传文件”按钮,选择刚才压缩的index.zip文件,点击“上传”按钮,上传成功后的界面如图2-16所示。

图2-16 代码上传
再次回到代码管理界面中,点击“操作”按钮,在下拉列表中选择“编辑代码”,如图2-17所示。
在新的代码编辑页面中,可以看到index.php已经上传成功,双击该文件可以查看源代码,如图2-18所示。

图2-17 编辑代码

图2-18 查看源代码
至此,新浪云应用的创建完成,并且成功上传了微信公众平台的接口文件。
2.2 虚拟主机
如果你已经拥有虚拟主机或云主机,那么可以将其用作微信公众平台开发模式的服务器资源。如果没有,也可以考虑购买一个虚拟空间,万网、新网、西部数码等老牌网络服务提供商均提供主机空间服务。本书使用PHP语言和MySQL数据库作为程序运行环境,如果想运行本书的代码,购买空间的时候需要选择支持PHP和MySQL的空间。购买成功后,将得到FTP上传地址、账号及密码,
图2-19显示的是西部数码产品tw009购买后的FTP信息。
在这个虚拟空间中,FTP地址为txw1958.gotoftp3.com,而二级域名地址为txw1958.gotoip3.com,这个二级域名将会在我们启用微信公众平台的时候需要填写使用。
我们使用FileZilla客户端来上传我们的代码。FileZilla是一款免费开源的FTP客户端软件,分为客户端版本和服务器版本,具备所有的FTP软件功能。可控性、有条理的界面和管理多站点的简化方式使得FileZilla客户端版成为一个方便高效的FTP客户端工具。它可以从官方网站下载,下载地址为:
https://filezilla-project.org/download.php?type=client

图2-19 西部数码tw009产品
在FillZilla客户端的菜单栏中,选择“文件”,再选择“站点管理器”,调出站点管理器。在站点管理器中,点击左下方的“新站点”按钮,填写站点名称,在右侧的站点信息中,填写FTP相关信息,如图2-20所示。

图2-20 站点管理器
填写完成后,点击“连接”按钮,将自动登录到FTP的远程站点上,并且列出目录,如图2-21所示。

图2-21 远程站点目录
双击wwwroot进入该站点的根目录,在根目录中新建一个weixin目录,然后把我们获得的index.php文件上传到weixin目录中,如图2-22所示。

图2-22 上传目录成功
至此,我们在虚假主机上成功上传了微信公众平台的接口文件。