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

最近一个月都在写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应用开发没什么区别 。 微信开发系列 , 属于闲暇之作 , 不定期更新 。

参考

微信开发文档

欢迎加入Android开发技术交流QQ群:150923287,本群可免费获取Flutter、Gradle、RxJava、小程序、Hybrid、移动架构、NDK、React Native、性能优化等技术教程!

猜你喜欢

转载自blog.csdn.net/AndroidO2O/article/details/86005521