微信开发基础①搭建开发环境

最近一个月都在写Android NDK开发之旅 , 从C语言基础JNI再到NDK , 一路写下来 , 都是在写C代码 , 有些枯燥乏味 , 故新开一个系列微信开发系列 。

前言

微信是一个非常好的产品 , 几亿人用的产品 , 依托于微信的产品更加多 , 如多如牛毛的微信公众号 , 有各类公众号应用 , O2O 、外卖、企业官网 等等 。微信开发主要由后端与前端组合开发, 本系列使用到的技术栈是,html5 + css + javascript + php 。

微信开发模式

做微信开发的时候 , 需要一个公众号帐号 , 个人的话 , 目前只能申请订阅号 ,需要实名认证 。

基本配置

注册完微信公众平台帐号,在微信公众平台左下角 , 找到开发,进行基本配置

base config

配置服务器环境
点击修改配置

config server

在修改配置页面 ,可以看到接入指南

接入指南

进入接入指南


Paste_Image.png

下载PHP示例代码

示例代码

修改代码

配置Token

修改完之后 , 上传到服务器。

微信公众平台,服务器配置

服务器配置

配置完成 , 点击启用

启用服务器配置

启动成功之后 , 这样我们的微信配置服务器就完成了 。

修改服务器端代码

将.php文件中的验证代码注释掉 , 调用responseMsg()方法

//define your token
define("TOKEN", "zenoWecaht");
$wechatObj = new wechatCallbackapiTest();
//$wechatObj->valid();

$wechatObj->responseMsg();

微信消息响应机制

Paste_Image.png

响应代码分析

responseMsg()这个方法名称就可以看出 , 这个是响应消息的一个方法 , 将微信服务器传递过来的消息进行解析 , 并进行处理 , 然后按照一定的格式返回 。

public function responseMsg()
    {
        //get post data, May be due to the different environments
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

        //extract post data
        if (!empty($postStr)){
                /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
                   the best way is to check the validity of xml by yourself */
                libxml_disable_entity_loader(true);
                $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(!empty( $keyword ))
                {
                    $msgType = "text";
                    $contentStr = "Welcome to wechat world!";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    echo $resultStr;
                }else{
                    echo "Input something...";
                }

        }else {
            echo "";
            exit;
        }
    }

从上述代码可以看出 , $keyword这个变量就是微信服务器传给我们用户输入的内容的值了 。我们可以将他进行一些改造 。

public function responseMsg()
    {
        //get post data, May be due to the different environments
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

        //extract post data
        if (!empty($postStr)){
                /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
                   the best way is to check the validity of xml by yourself */
                libxml_disable_entity_loader(true);
                $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(!empty( $keyword ))
                {

                    if($keyword == "zeno"){
                        $contentStr = "简单的微信开发";
                    }else{
                        $contentStr = "sorry ! 未能识别您的指令";
                    }
                    $msgType = "text";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    echo $resultStr;
                }else{
                    echo "Input something...";
                }

        }else {
            echo "";
            exit;
        }
    }

我们自定义了一个指令消息 , 当用户在聊天界面输入zeno就会返回简单的微信开发 , 我们通过简单的字符指令进行判断 , 然后返回响应的结果 。

响应代码分析

得到微信传递过来的消息对象,解析xml格式。

libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

得到消息解析的内容。

                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);

构建响应消息的模版,$textTpl是微信消息响应的消息格式 , 按照这个模版 , 然后将

                $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(!empty( $keyword ))
                {

                    if($keyword == "zeno"){
                        $contentStr = "简单的微信开发";
                    }else{
                        $contentStr = "sorry ! 未能识别您的指令";
                    }
                    $msgType = "text";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    echo $resultStr;
                }else{
                    echo "Input something...";
                }

结语

微信开发结合了服务器端开发前端开发 , 微信开发本身比较简单 , 就是微信提供的一些接口的调用 , 复杂之处在于 , 在微信外部 , 也就是我们服务器上搭建的web系统 , 和一般的web应用开发没什么区别 。 微信开发系列 , 属于闲暇之作 , 不定期更新 。

参考

微信开发文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,769评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,815评论 25 709
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,893评论 6 13
  • 我相信 爱的本质一如 生命的单纯与温柔 我相信 所有的 光与影的反射和相投 我相信 满树的花朵 只源于冰雪中的一粒...
    采兰格格阅读 1,625评论 1 0
  • 《老去的民工兄弟》 文/搬砖哥 当清晨第一缕阳光照在大地上 所有的思想走向了泥泞的中心 谁说岁月无情 谁就是罪人 ...
    一枚搬砖哥阅读 3,130评论 22 32