微信公众号开发-服务器配置、关注后收到欢迎消息

公众号注册

微信公众号开发首先需要注册一个公众号,公众号分为订阅号、服务号和企业号。订阅号是最基础的公众账号,用于开发的话API接口会受到一些限制;公众号的开发大都是基于服务号进行的,服务号的开通和认证需要填写一些企业名称和营业执照注册号;企业号主要为公司内部通讯。由于不具备服务号和企业号的注册条件,暂且注册一个订阅号开始基础研究。

配置服务器

登录公众号,开启开发者模式后,就需要配置自己的服务器了。要配置自己的服务器首先得先有一台服务器,服务器我最开始申请的是百度BAE,发现对于上传下载代码不太会用。又申请了腾讯云,申请的是Ubuntu16.04的服务器,这下子熟悉了,需要什么环境自己可以自由配置。但是照着网上好多博客的配置,发现在微信公众平台上服务器的配置提交是能通过的,但是一直不能与关注者(用户)进行互动,比如用户关注了不能回复欢迎消息。服务器配置如下
这里写图片描述
这里我域名直接用的IP地址,我怀疑不能直接用IP地址作为域名,腾讯云注册时也没分配域名,没找到配置域名的地方。
我又注册了个新浪云,新浪云给分配域名了,服务器配置如下:
这里写图片描述
这次提交成功了,用户关注后能回复欢迎消息了。当然服务器配置要想提交成功,得提前在自己的web服务器上建立用于验证的文件,我建立的是微信提供的wx_sample.php

<?php
/**
  * wechat php test
  */

//define your token
define("TOKEN", "******");//与服务器配置时的token需一致
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();

class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    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)){

                $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;
        }
    }

    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;
        }
    }
}

?>

自己搭建的服务器与微信公众平台服务器验证成功后,接下来就可以实现自己想实现的功能了。在这里实现的是用户关注后,回复欢迎消息,用户回复任何不为空的消息,回复“谢谢您的回复!”

修改wx_sample.php为以下内容

<?php
/**
  * wechat php test
  */

//define your token
define("TOKEN", "******");//与服务器配置时的token需一致
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
    $wechatObj->responseMsg();
}else{
    $wechatObj->valid();
}
class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    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)){
                //解析数据
                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                //发送消息方ID
                $fromUsername = $postObj->FromUserName;
                //接收消息方ID
                $toUsername = $postObj->ToUserName;
                //消息类型
                $form_MsgType = $postObj->MsgType;
                $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>";    
                $newsTpl = "<xml>  
                           <ToUserName><![CDATA[%s]]></ToUserName>  
                           <FromUserName><![CDATA[%s]]></FromUserName>  
                           <CreateTime>%s</CreateTime>  
                           <MsgType><![CDATA[%s]]></MsgType>  
                           <ArticleCount>%s</ArticleCount>  
                           <Articles>  
                           <item>  
                           <Title><![CDATA[%s]]></Title>   
                           <Description><![CDATA[%s]]></Description>  
                           <PicUrl><![CDATA[%s]]></PicUrl>  
                           <Url><![CDATA[%s]]></Url>  
                           </item>  
                           </Articles>  
                           <FuncFlag>1</FuncFlag>  
                           </xml> ";  
                $musicTpl = "<xml>  
                             <ToUserName><![CDATA[%s]]></ToUserName>  
                             <FromUserName><![CDATA[%s]]></FromUserName>  
                             <CreateTime>%s</CreateTime>  
                             <MsgType><![CDATA[%s]]></MsgType>  
                             <Music>  
                             <Title><![CDATA[%s]]></Title>  
                             <Description><![CDATA[%s]]></Description>  
                             <MusicUrl><![CDATA[%s]]></MusicUrl>  
                             <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>  
                             </Music>  
                             <FuncFlag>0</FuncFlag>  
                             </xml>";  
                    //事件消息
                  if($form_MsgType=="event")
                  {
                    //获取事件类型
                    $form_Event = $postObj->Event;
                    //订阅事件
                    if($form_Event=="subscribe")
                    {
                      //回复欢迎文字消息
                      $msgType = "text";
                      $contentStr = "感谢您关注Super King的微信公众号[玫瑰]";
                      $resultStr = sprintf($textTpl, $fromUsername, $toUsername, time(), $msgType, $contentStr);
                      echo $resultStr;
                      exit;
                    }    
                  }
          //如果用户发送内容不为空,回复“谢谢您的回复!”    
                 if(!empty( $keyword ))
                {
                    $msgType = "text";
                    $contentStr = "谢谢您的回复!";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    echo $resultStr;
                }else{
                    echo "Input something...";
                }

        }else {
            echo "";
            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;
        }
    }
}

?>

用个人微信扫描公众号二维码,关注后进行测试
这里写图片描述

猜你喜欢

转载自blog.csdn.net/king_jie0210/article/details/72598511