2 微信开发者中心

微信公众号开发者中心提供了使用代码开发微信微应用的功能,使用代码开发微应用需要用到服务器,以存放编写的代码,因此我们需要一个服务器。那么在微信那里设置服务器呢?在微信公众号管理界面,点击【基本配置】





将会看到基本配置信息,在【服务器配置】选项





启用并设置服务器后,用户发送给公众号的信息将被转发给此服务器,这样我们就可以通过代码灵活的实现各种微应用。

1 新浪SAE

首先,我们要去新浪云计算 申请一个空间,为什么使用SAE?因为可以免费申请啊。





点击【开发者由此进入】链接





使用微博账号登陆SAE云计算





进入新浪云控制台后,创建新应用(即服务器),填写二级域名、应用名称、运行环境。





点击【创建】,进入代码管理界面,选择SVN版本管理工具,为什么选择SVN?云空间收费,不考虑,GIT适合高级用户,SVN适合一般用户。





选择好SVN后,创建版本。版本的好处就是,当你完成一个具有基本功能的代码后(此版本号为M),交给老板。老板突发灵感说再添加一个功能,你鄙视他后还是老老实以M版本的基础创建一个N版本,然后就是无穷无尽的错误,代码被弄得乱七八糟。此时你该感激版本这个东西,让你有机会穿越回M版本。

总而言之,以每个阶段做作为一个版本,等回头看或者出问题的时候,可以查看或者从某个版本重新开始。





创建完版本后,将会看到应用的链接信息





点击【编辑代码】,进入SAE编辑器,默认情况下有【config.yaml】配置信息文件和【index.php】文件,

<?php //这是一个php文件
/*
    河源万绿软件工作室
    CopyRight 2016 All Rights Reserved
*/
//调用echo方法输出一条语句
echo  ‘<strong>Hello, SAE!</strong>‘;




在浏览器中我们可以输入: http://wlvsoft.applinzi.com/http://1.wlvsoft.applinzi.com/ 访问应用服务器,浏览器将会显示echo输出的语句。




2 服务器配置

申请成功服务器后,就可以在微信公众号管理界面进行服务器配置,点击【修改配置】链接。





填写基本配置信息:

  • URL:应用服务器链接
  • Token:任意字符,记住此值,应用服务器需要Token进行验证
  • EncodingAESkey:随机生成即可
  • 消息加解密方式:测试阶段选择【明文模式】




此时点击提交,将会提示token验证失败。





开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数:





开发者通过检验signature,对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则服务器配置生效,否则提示token验证失败。

下面是微信公众平台开发者文档提供的验证代码:

private function checkSignature()
{
    //获取微信服务器提交到应用服务器的参数
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];
    //获取token,与服务器配置中的一致
    $token = TOKEN;
    //将参数组装成数组
    $tmpArr = array($token, $timestamp, $nonce);
    //对参数进行排序
    sort($tmpArr, SORT_STRING);
    //将数组转换为字符串
    $tmpStr = implode( $tmpArr );
    //加密
    $tmpStr = sha1( $tmpStr );
    //加密后与$signature进行对比
    //如果相同,表示请求来自微信服务器
    if( $tmpStr == $signature ){
        return true;
    }else{
        return false;
    }
}

下面是修改后的index.php代码:

<?php
/*
    河源万绿软件工作室
    CopyRight 2016 All Rights Reserved
*/

//定义token,与服务器配置中的一致
define("TOKEN", "wlvsoft");

$wechatObj = new wechatCallbackapiTest();

//获取echostr,存在表示提交验证,否则为用户发送的一般消息
if (isset($_GET[‘echostr‘])) {
    //如果提交为验证,进行有效验证
    $wechatObj->valid();
}else{
    //如果是用户发送信息,返回空
    echo ‘‘;
    exit;
}

class wechatCallbackapiTest
{
    //有效验证
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        //调用验证方法
        if($this->checkSignature()){
            header(‘content-type:text‘);
            //如果验证成功,返回echoStr
            echo $echoStr;
            exit;
        }
    }

    //验证方法,如果来自微信服务器返回true
    private function checkSignature()
    {
        //获取微信服务器提交到应用服务器的参数
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        //获取token,与服务器配置中的一致
        $token = TOKEN;
        //将参数组装成数组
        $tmpArr = array($token, $timestamp, $nonce);
        //对参数进行排序
        sort($tmpArr, SORT_STRING);
        //将数组转换为字符串
        $tmpStr = implode( $tmpArr );
        //加密
        $tmpStr = sha1( $tmpStr );
        //加密后与$signature进行对比
        //如果相同,表示请求来自微信服务器
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
}

此时,再次提交,服务器配置成功。





点击【启动】,手工配置的自动回复和自定义菜单将失效,全部将由应用服务器代码进行管理。





打开手机微信查看公众号,发现菜单和自动回复功能已经不能使用了。





提示(注意:不建议如此,不知道后续有没有错误,在这里列出仅供娱乐测试)

按照微信验证原理,其实可以直接返回验证参数【echostr】,跳过token验证。将index.php改为:

<?php
/*
    河源万绿软件工作室
    CopyRight 2016 All Rights Reserved
*/
//设置返回类型
header(‘content-type:text‘);
//获取参数
$echoStr = $_GET["echostr"];
//跳过token验证,直接返回$echoStr
echo $echoStr;
exit;

3 应用服务器向用户发送消息

当我们在公众号中输入信息时,提示“该公众号暂时无法提供服务器,请稍后再试”。原因是我们在index.php中没有对用户的消息进行响应。

//获取echostr,存在表示提交验证,否则为用户发送的一般消息
if (isset($_GET[‘echostr‘])) {
    //如果提交为验证,进行有效验证
    $wechatObj->valid();
}else{
    //如果是用户发送信息,返回空
    echo ‘‘;
    exit;
}

如果是用户在公众号输入的信息,我们直接返回为空。但是,微信公众号要求发送的信息是有标准格式的。简单的文本消息如下:

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

参数作用如下:





因此,用户要接收到应用服务器返回的信息,应用服务器必须按照微信公众号文本消息格式要求返回。

我们可以使用方倍工作室提供的微信调试器 对我们发送的信息进行测试。





接收用户指公众号原始ID 可在公众号设置中查询。

当输入:你好 ;发送给应用服务器的信息如下:

<xml>
    <ToUserName><![CDATA[ ****** ]]></ToUserName>
    <FromUserName><![CDATA[ojpX_jig-gyi3_Q9fHXQ4rdHniQs]]></FromUserName>
    <CreateTime>1464855763</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[你好]]></Content>
    <MsgId>1234567890abcdef</MsgId>
</xml>

应用服务器可以获取提交的文本信息,进而获得公众号ID【ToUserName】、用户ID【FromUserName】和发送的文本信息【Content】。依据这些信息,应用服务器可以自动回复信息给用户。修改index.php:

<?php
/*
    河源万绿软件工作室
    CopyRight 2016 All Rights Reserved
*/

//定义token,与服务器配置中的一致
define("TOKEN", "wlvsoft");

$wechatObj = new wechatCallbackapiTest();

//获取echostr,存在表示提交验证,否则为用户发送的一般消息
if (isset($_GET[‘echostr‘])) {
    //如果提交为验证,进行有效验证
    $wechatObj->valid();
}else{
    //如果是用户发送信息,调用responseMsg方法
    $wechatObj->responseMsg();
}

class wechatCallbackapiTest
{
    //有效验证
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        //调用验证方法
        if($this->checkSignature()){
            header(‘content-type:text‘);
            //如果验证成功,返回echoStr
            echo $echoStr;
            exit;
        }
    }

    //验证方法,如果来自微信服务器返回true
    private function checkSignature()
    {
        //获取微信服务器提交到应用服务器的参数
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        //获取token,与服务器配置中的一致
        $token = TOKEN;
        //将参数组装成数组
        $tmpArr = array($token, $timestamp, $nonce);
        //对参数进行排序
        sort($tmpArr, SORT_STRING);
        //将数组转换为字符串
        $tmpStr = implode( $tmpArr );
        //加密
        $tmpStr = sha1( $tmpStr );
        //加密后与$signature进行对比
        //如果相同,表示请求来自微信服务器
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
    //返回文本消息
    public function responseMsg()
    {
        //获取用户提交的XML格式数据
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

        //如果用户提交的信息不为空
        if (!empty($postStr)){
            //将用户提交的XML转换为对象
            $postObj = simplexml_load_string($postStr,
             ‘SimpleXMLElement‘, LIBXML_NOCDATA);
            //获取用户提交的类型(文本、图文、音频、视频等)
            $RX_TYPE = trim($postObj->MsgType);
            //不同的类型返回的结果不同
            switch ($RX_TYPE)
            {
                //用户发送类型为文本
                case "text":
                    //公众号ID
                    $fromUsername = $postObj->FromUserName;
                    //用户ID
                    $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";
                    //返回的北荣
                    $contentStr = date("Y-m-d H:i:s",
                    time())."\n".‘欢迎关注河源万绿软件工作室!‘;
                    // sprintf() 函数把格式化的字符串写入一个变量中
                    // $toUsername位置和用户发送的互换
                    $resultStr = sprintf($textTpl, $fromUsername,
                    $toUsername, $time, $msgType, $contentStr);
                    break;
                //非文本信息,默认不处理
                default:
                    $resultStr = "";
                    break;
             }
            //应用服务器返回信息给用户
            echo $resultStr;
        }else{
            echo "";
            exit;
        }
    }
}

完成后,测试如下:




时间: 2024-10-14 03:22:43

2 微信开发者中心的相关文章

.net开发微信公众号(1)-启用开发者中心

开篇介绍 今天新开一个微信公众号开发经验分享的系列,主要是和大家分享在.net下开发微信公众号后台的一些经验,希望能给在.net下做微开发的小伙伴们一些参考.最近由于工作需要,开发了一个微信公众账号.我本人其实一直是做winform方向开发的,asp.net接触的也不多,现学现卖,有啥不足或不对的地方,希望大家发邮件告诉我,[email protected],一起学习,一起进步. 微信公众号其实火了很长一段时间了,应该是从2012开始火起来的.最近正好做一个这样的项目,在网上找资料的时候发现大家

详解微信开发者文档——2接入服务器至微信开发平台

写在前面的话:为了更灵活的与微信公众平台互动,需要将微信公众平台与自己的服务器进行对接,只有对接成功之后,才能够进行后面功能的实现. =========正文开始========== 详细讲解之前,对微信公众平台与自己服务器对接先有个感性的认识. 假设微信已经与我们自己的服务器完成对接,之后微信公众平台就能够将自己接收到的消息发送给我们的服务器,同样我们也可以给微信服务器发送消息.这里就涉及到了几个问题:1.微信应该给我们服务器的什么地址进行对接呢?2.如何验证这个地址确实是我们自己服务器的地址呢

微信开发者文档

接收事件推送 目录 1 关注/取消关注事件 2 扫描带参数二维码事件 3 上报地理位置事件 4 自定义菜单事件 5 点击菜单拉取消息时的事件推送 6 点击菜单跳转链接时的事件推送 关注/取消关注事件 用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL.方便开发者给用户下发欢迎消息或者做帐号的解绑. 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次 关于重试的消息排重,推荐使用FromUserName + CreateTime 排重. 假如服务器无法保证在

thinkphp3.2微信开发者模式 绑定url token 您的服务器没有正确相应token验证

当打开调试模式后就会出现此问题thinkphp3.2微信开发者模式 绑定url token 您的服务器没有正确相应token验证,布布扣,bubuko.com

微信开发者工具 当前系统代理不是安全代理,是否信任

微信开发者工具扫码提示 "当前系统代理不是安全代理,是否信任" 微信开发者工具,为了信息安全性,首先检查了系统代理. 这是因为某些代理软件, 将代理设置填入到了系统注册表中,将注册表中的代理相关参数删除,然后注销一下,重新登录系统,就可以解决了 解决方法: 按Crtl+R,输入regedit进注册表, [HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings] "ProxyEn

如何添加设备UDID到开发者中心

1. 登录开发者中心 2. 选择证书那一项 3. 选择Devices 4. 点选+按钮 5. 填上设备的UUID以及设备名字然后添加上 大功告成:) 附录: 如何获取UDID? 续费用户的特殊操作: 这个是会重置所有设备的哦:) 如何添加设备UDID到开发者中心

微信开发者工具

1.下载个微信开发者工具  并安装(参照图) 2.下载个ngrok  放到C盘根目录下(ngrok  在本人博客吧的文件下  请自行下载) 3.点击ngrok  里的ngrok.bat 4.复制小黑 窗口里的  Forwarding  后面的地址 5.复制的地址放到微信开发者工具地址栏里 ngrok.batngrok.bat   保留.com前面  后面的删掉 6.然后  直接输入在.com后面加上想要打开idea 里的html  文件路径即可   打开了 7.注意  ngrok 默认端口和  

微信开发者文档连接

1.微信开放平台 https://open.weixin.qq.com/cgi-bin/frame?t=resource/res_main_tmpl&lang=zh_CN&target=res/app_wx_login 2. 微信公众平台开发者文档 http://mp.weixin.qq.com/wiki/index.php?title=%E9%A6%96%E9%A1%B5 微信开发者文档连接

[iOS]修改开发者中心Bundle Identifier的一些配置

登录开发者中心https://developer.apple.com 然后找到你的Bundle Identifier. 这里暂时只讲开启推送的功能,如果需要别的直接勾选前面的选择框 然后拉到最下面点击Done