专栏首页一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数据包。

<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实现如下代码。

<?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

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

本文分享自微信公众号 - 一Li小麦(gh_c88159ec1309),作者:一li小麦

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 那些年初级前后端一起撕过的逼

    一个项目一开始总是出于还不错愿景,但做着做着,就越来越乱了。万丈高楼平地起,有些基础的问题解决好,后面改需求就不会那么痛苦了。

    一粒小麦
  • JavaScript设计模式之策略模式

    为达到一个目的做事情的方法有很多种,比如做工资表,需要计算码农,美工,需求三个人的工资。这时候如果是一个靠谱的人事,一定会有这样一个表:

    一粒小麦
  • vue全家桶之vuex

    状态管理可以简单理解为vue中的某些全局的data属性。 当组件状态增多时,整个应用和状态分散在每个组件和实例中。部分还会出现状态共享。这时最好的方案就是vue...

    一粒小麦
  • 字符集

    本文主要讲解字符集和字符编码的一些概念,通常我们所说的字符集其实指的包含了字符编码集+字符编码。但字符集有时候有时候又只是字符编码集的简称,具体...

    用户5475193
  • 《Redis设计与实现》读书笔记(十一) ——Redis数据库与键空间

    《Redis设计与实现》读书笔记(十一) ——Redis数据库与键空间 (原创内容,转载请注明来源,谢谢) 一、redis数据库 redis服务器将所有数据库都...

    用户1327360
  • 吉林大学考研复试题目(牛客网)

    ​ 一个二进制数,将其每一位取反,称之为这个数的反码。下面我们定义一个字符的反码。如果这是一个小写字符,则它和字符'a’的距离与它的反码和字符'z’的距离相同;...

    Kindear
  • 【PAT乙级】换个格式输出整数

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk
  • 云时代数据库的核心特点

    最近几年,随着云计算相关技术的发展,各种不同类型的云层出不穷,服务越来越多不同类型的企业业务,传统企业也渐渐开始探索上云的道路。在云上,作为业务最核心的数据库,...

    PingCAP
  • HyperSQL 链接参数中文件的路径

    HoneyMoose
  • 今天来认识下数据库

    这是我的第七篇原创文章 爬了数据,只能放在记事本上?小的数据还是可以的,但是当你遇到较多的数据,放在记事本上就不是很好了,这时就需要用到数据库来存储了,那我们今...

    sergiojune

扫码关注云+社区

领取腾讯云代金券