首页 > 热点 > 微信 > 正文

在SAE搭建微信公众账号服务

2020-03-22 17:11:44
字体:
来源:转载
供稿:网友
  • 让我们回到2014年11月,从公司请假回成都,在天府软件园B区旁边的小区里,那个10多平米的出租屋里,闲来无事,我想找个事情做一做,好让我这漂浮的心静下来。大约在半年前就申请了微信的一个公众账号,一直闲置着,终于决定再次着手搭建一个微信公众账号。SAE(Sina App Engine)是国内最早开始提供云服务的平台之一,而且几乎是免费的。所以希望能够通过SAE平台快速的搭建好一个微信公众账号,花了小半天就搭好了一个简易的微信公众平台。今天,就利用SAE搭建微信公众平台的过程和大家一起分享。

    一、注册微信公众账号

    首先注册微信公众账号:http://mp.weixin.qq.com,点击注册,通过很简单的几步就能快速注册好公众账号,需要注意的是这里是需要注册一个新的微信号,而不是通过已有的私人微信号绑定。可能需要注册一个专用的邮箱。注册过程很简单,不赘述。

    二、注册新浪SAE服务

    注册SAE,访问http://sae.sina.com.cn,SAE整个的文档都比较完整,很好上手。注册完成后会送500云豆,合人民币5元。再申请实名认证,送云豆2000。对于一个刚上手的开发者来说完全够了。等应用开发好后,还可以申请开发者认证。每月有固定额度的云豆赠送,基本就不用花钱了。另外还有教育机构认证,公益组织认证等。同样十分简单,不赘述。

    三、开启微信开发模式

    登录公众平台后,点击高级功能。首先要关闭编辑模式,才能进入开发模式。我们需要一个网址作为接口,Token呢,就是相当于我们和微信之间约定的“密码”,以验证是微信平台的访问。

    网址接入

    公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数:

    signature 微信加密签名 timestamp 时间戳 nonce 随机数 echostr 随机字符串
    参数 描述

    开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败。signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数:

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

    那么很明确我们接下来需要做的事情了:为微信提供一个接口。

    四、在SAE创建应用

    填好二级域名和应用名称等,选择好语言。这里我们使用PHP开发选择web应用。创建好应用之后,在代码管理中创建一个新的版本。而后我们可以选择编辑代码。能够实现在线编辑,根据个人喜好,可以通过SVN在本地开发然后CI到SAE服务,我个人就是这样做的。

    在SAE创建好应用后,需要到微信公众账号开发者中心将应用信息进行授权配置!

    假设我创建的应用名称为personal_app,则svn的地址为http://svn.sinaapp.com/personal_app,用户名和密码分别为SAE安全邮箱和安全密码。

    五、干货
    <?phpdefine('TOKEN', 'xxxxxxxx');$wechatObj = new wechatCallbackapiTest();if (isset($_GET['echostr'])) {    $wechatObj->valid();}else{    $wechatObj->responseMsg();}html' target='_blank'>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()    {}}?>
    responseMsg函数详细如下:
     1 function responseMsg() 2 { 3     $postStr = $GLOBALS['HTTP_RAW_POST_DATA']; 4  5     if (!empty($postStr)) { 6         $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 7         $fromUsername = $postObj->FromUserName; 8         $toUsername = $postObj->ToUserName; 9         $keyword = trim($postObj->Content);10         $time = time();11         $textTpl = '<xml>12                     <ToUserName><![CDATA[%s]]></ToUserName>13                     <FromUserName><![CDATA[%s]]></FromUserName>14                     <CreateTime>%s</CreateTime>15                     <MsgType><![CDATA[%s]]></MsgType>16                     <Content><![CDATA[%s]]></Content>17                     <FuncFlag>0</FuncFlag>18                     </xml>';19         if ($keyword == 'date' || $keyword == '时间') {20             $msgType = 'text';21             $contentStr = '现在时间是:'.date('Y-m-d H:i:s', time());22             $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);23             echo $resultStr; 24         } elseif (preg_match('/^0?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/', $keyword)){25             $msgType = 'text';26             $phone_res = $this->mobilephone($keyword);27             $contentStr = '号码归属地查询结果:'28                     .''.$keyword29                     .'归属地:'.$phone_res->retData->province30                     .'运营商:'.$phone_res->retData->carrier;31 32             $contentStr = $contentStr33                     .'-------------------Provided by API store.';34 35             $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);36             echo $resultStr;37         } else {38             $msgType = 'text';39             $contentStr = '感谢您关注【XXXXXXXXXX】'.''.'微信号:XXXXXX'.''40                     .'目前平台功能如下:'41                     .''.'1. 当前时间,如输入:时间/date'42                     .''.'2. 手机号归属地查询,如输入13800138000'43                     .''.'更多内容,敬请期待...';44             $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);45             echo $resultStr;46         }47     }else{48         echo '';49         exit;50     }51 }

    其中mobilephone函数用来完成手机号码归属地查询功能。这是经过精简的一部分代码,目前公众账号已经实现了大大小小6个功能,后续还会继续改进!

    感谢大家的阅读!

    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表