前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >公众号服务器搭建与交互原理

公众号服务器搭建与交互原理

作者头像
一粒小麦
发布2019-07-18 17:07:20
2K0
发布2019-07-18 17:07:20
举报
文章被收录于专栏:一Li小麦一Li小麦

3. 服务器搭建与交互原理

本教程采用的微信开发基于新浪云搭建环境。

3.1 服务器和微信配置

3.1.1 新浪云服务器

登陆后,点击创建应用。

创建版本,输入安全密码

自此已经成功创建 http://1.maizi.applinzi.com 这个应用。

3.1.2 微信公众平台

登录微信公众平台,基本配置-服务器配置,填写token,请求地址和和消息模式,在此选择明文模式。

并在ip白名单中填写服务器ip地址

3.2 交互原理

交互分为两种方式:get请求和消息发送。

微信发出GET请求通常包括4个常见字段。

参数

描述

signature

加密签名,包括token、timestamp和nonce

timestamp

时间戳

nonce

随机数

echostr

随机字符串

而微信发送消息,请求除了带上token、timestamp和nonce,还会带上一个xml数据包。

代码语言:javascript
复制
<xml>
    <ToUserName><![CDATA[账号]]></ToUserName>
    <FromUserName><![CDATA[用户名]]></FromUserName>
    <CreateTime>时间</CreateTime>
    <MsgType><![CDATA[数据类型]]></MsgType>
    <Content><![CDATA[%内容]></Content>
    <MsgId>消息id</MsgId>
</xml>

交互流程

  1. 服务端设置token常量。
  2. 判断GET请求中是否有 echottr字段变量。有则校验,没有则进入消息业务处理流程。
  • GET请求校验流程:
    • 对token/timestamp/nonce进行字典排序
    • 对排序完之后的字段拼接,sha1加密
    • 以加密结果对比signature,二者相等则通过校验
  • 消息流程
    • 消息解析为字符串,获取XML数据(接收方,发送方,内容等)。
    • 构造发回的xml数据包(注意原来的发送方变为接收方)
    • 通过片echo把构造好的数据发出去

3.3 配置与语句

根据上述思想,可以以php实现如下代码。

代码语言:javascript
复制
<?php
/*
    hello wechat
*/
header('Content-type:text');
define("TOKEN", "weixin"); //定义token
$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";
                $content = date("Y-m-d H:i:s",time());
                $result = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content);
                echo $result;
            }
        }else{
            echo "";
            exit;
        }
    }
}
?>

3.4 测试工具

接口调试:https://mp.weixin.qq.com/debug

可在此进行各种模拟事件操作。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一Li小麦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3. 服务器搭建与交互原理
    • 3.1 服务器和微信配置
      • 3.1.1 新浪云服务器
      • 3.1.2 微信公众平台
    • 3.2 交互原理
      • 3.3 配置与语句
        • 3.4 测试工具
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档