自定义微信公众号菜单一二级选项(二)

一首先手动创建php文件,然后在微信公众平台服务器配置指定执行这个文件,那么每次微信公众号发消息就会执行这个文件,我们

可以在这个文件中指定菜单点击事件和消息内容处理、设置自动回复规则等。具体见下面php:

<?php

/**
  * wechat php test
  */


//define your token
define("TOKEN", "oliveche_test");


require_once("../api.php");


require_once "lib/jssdk.php";


$GLOBALS["CurWeixinMch"] = 2; // Weixin Mch for JSAPI
require_once(dirname(__FILE__) . "/WxPayPubHelper/WxPay.pub.config.php");


$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
    $wechatObj->responseMsg();
$flage = false;
}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)){
                /* 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);
$RX_TYPE = trim($postObj->MsgType);


switch ($RX_TYPE)
{
case "text":
if($postObj->Content =='哈哈'){
$resultStr = $this->receiveText($postObj);
$flage = true;
}
break;
case "event":
$resultStr = $this->receiveEvent($postObj);
break;
default:
$resultStr = "";
break;
}
echo $resultStr;


                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);
                $time = date('c');

if(!empty( $keyword ) && !$flage)
                {
              $msgType = $RX_TYPE;
$wxuserId = queryOne("SELECT id from WeixinUser where openId = '{$fromUsername}'");
if($wxuserId == false){
$jssdk = new JSSDK($GLOBALS["WxPayConfig"]["APPID"], $GLOBALS["WxPayConfig"]["APPSECRET"], false);
$access_token = $jssdk->getAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={$access_token}&openid={$fromUsername}&lang=zh_CN";

$ret = file_get_contents($url);
$obj = json_decode($ret);
$sql = "INSERT INTO WeixinUser (openId, nickName, data, wxPicId) VALUES ('$obj->openid', '$obj->nickname', '$ret', '$obj->headimgurl')";
$wxuserId = execOne($sql,true);
}


$sql = "INSERT INTO WxMsg (wxUserId, fromUsername, toUsername, tm, msgType, keyword) VALUES ('$wxuserId','$fromUsername', '$toUsername', '$time', '$msgType', '$keyword')";
execOne($sql);
                }else{
                echo "Input something...";
                }


        }else {
        echo "";
        exit;
        }
    }


private function receiveText($object)
    {
        $funcFlag = 0;
        $contentStr = "你好聪明";
        $resultStr = $this->transmitText($object, $contentStr, $funcFlag);
        return $resultStr;
    }

private function checkSignature()
{
        // you must define TOKEN by yourself
        if (!defined("TOKEN")) {
            throw new Exception('TOKEN is not defined!');
        }
        
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
       
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
        // use SORT_STRING rule
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );

if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}


 private function receiveEvent($object)
    {
        $contentStr = "";
        switch ($object->Event)
        {
            case "subscribe":
                $contentStr = "欢迎关注展达";
            case "unsubscribe":
                break;
            case "CLICK":
                switch ($object->EventKey)
                {
                    case "hh":
                        $contentStr[] = array("Title" =>"公司简介", 
                        "Description" =>"展达提供移动互联网相关的产品及服务", 
                        "PicUrl" =>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", 
                        "Url" =>"weixin://addfriend/pondbaystudio");
                        break;
case "key_aboutUs":
                       $contentStr =  "联系我们 联系邮件:yanfengzhen@oliveche.com  联系电话: 闫小姐-18501781812 施先生-15800793345 联系QQ:819434914, 313620166";
                        break;
                    default:
                        $contentStr[] = array("Title" =>"征途是星辰大海", 
                        "Description" =>"我们为汽车行业内的客户,提供移动互联网的基础平台服务,帮助汽车4S店以及连锁维修店提供提高运营能力,促进销售的产品和服务。我们坚信技术是引领社会与行业进步的基石!", 
                        "PicUrl" =>"https://mmbiz.qlogo.cn/mmbiz_jpg/FFbjf6Gx2npWcvvNfUIqoD9bEic4tzPHZt5icdt1kFk0ILVkIFgwvSbVhJChM81wZCwOyxcMCBKT70w0cJKHeIzw/0?wx_fmt=jpeg", 
                        "Url" =>"http://mp.weixin.qq.com/s?__biz=MzIzNDE5MjA1Mg==&mid=2649550179&idx=1&sn=5ba842e75130bc8a525048164d05c8c8&chksm=f0e260b8c795e9aedc90d84ced0ccc3fb084b723662189af7eaa0c8a9ed8994b9712d0a28038&mpshare=1&scene=1&srcid=1013JSjF5BIExKh5SxpEw6jc&from=singlemessage&isappinstalled=0#wechat_redirect");
                        break;
                }
                break;
            default:
                break;      


        }
        if (is_array($contentStr)){
            $resultStr = $this->transmitNews($object, $contentStr);
        }else{
            $resultStr = $this->transmitText($object, $contentStr);
        }
        return $resultStr;
    }


    private function transmitText($object, $content, $funcFlag = 0)
    {
        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>%d</FuncFlag>
</xml>";
        $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $funcFlag);
        return $resultStr;
    }


    private function transmitNews($object, $arr_item, $funcFlag = 0)
    {
        //首条标题28字,其他标题39字
        if(!is_array($arr_item))
            return;


        $itemTpl = "    <item>
        <Title><![CDATA[%s]]></Title>
        <Description><![CDATA[%s]]></Description>
        <PicUrl><![CDATA[%s]]></PicUrl>
        <Url><![CDATA[%s]]></Url>
    </item>
";
        $item_str = "";
        foreach ($arr_item as $item)
            $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);


        $newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
<FuncFlag>%s</FuncFlag>
</xml>";


        $resultStr = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($arr_item), $funcFlag);
        return $resultStr;
    }
}


?>
### 回答1: Spring Boot 是一个用于快速构建基于 Java 的应用程序的开源框架。微信公众号是微信平台提供的一种服务,允许开发者在微信上创建自己的公众号,从而能够与用户进行交互、提供信息、进行营销等。 使用 Spring Boot 构建微信公众号意味着我们可以利用 Spring Boot 的优势快速开发和部署我们的公众号应用。Spring Boot 提供了丰富的特性和功能,例如自动配置、快速启动、内嵌 Servlet 容器等,使得我们能够以更高效的方式开发微信公众号应用程序。 在使用 Spring Boot 构建微信公众号时,我们可以利用微信公众平台提供的开发接口和 SDK,与微信服务器进行交互。该接口和 SDK 提供了丰富的功能,例如接收和回复消息、获取用户信息、上传素材、推送模板消息等。我们可以通过编写相应的代码,与微信服务器进行通信,并实现自定义的业务逻辑。 使用 Spring Boot 构建微信公众号还可以结合其他技术和框架,例如 Spring MVC、Spring Data JPA 等,来实现更复杂的功能。我们可以利用 Spring MVC 来处理微信服务器的请求,使用 Spring Data JPA 来操作数据库存储用户信息等。这些技术和框架的集成可以提高开发效率和代码质量。 总之,使用 Spring Boot 构建微信公众号能够帮助我们快速开发和部署应用,同时利用 Spring Boot 提供的特性和功能,使得开发过程更加高效和简化。 ### 回答2: Spring Boot是一个用于构建独立的、生产级的Spring应用程序的框架。它简化了Spring应用程序的配置和部署过程,并提供了许多默认配置,让开发者可以专注于业务逻辑的实现。 微信公众号是基于微信开放平台的一种应用,开发者可以通过微信公众号来与用户进行交互。使用微信公众号可以实现发送消息、接收消息、拉取用户信息等功能。通过集成Spring Boot框架,可以更加方便地开发和管理微信公众号应用。 使用Spring Boot开发微信公众号,可以通过Spring框架的依赖注入和控制反转等功能,更加灵活地管理公众号的业务逻辑和组件。开发者可以定义不同的Controller来处理用户的请求,并通过注解来实现自动装配和依赖管理。此外,Spring Boot还提供了许多自动配置的功能,使得开发者可以快速构建、测试和部署微信公众号应用。 Spring Boot还支持与微信公众平台的API进行交互,开发者可以通过SDK或自定义开发来实现微信公众号的各种功能。例如,可以使用SDK提供的API来发送消息、获取用户信息、创建菜单等。 总之,通过使用Spring Boot框架,开发者可以更加高效地开发和管理微信公众号应用,减少了繁琐的配置和部署过程,提高了开发效率和代码质量。 ### 回答3: Spring Boot 是一个基于 Spring 框架的开源项目,用于快速构建、运行和部署应用程序。微信公众号是基于微信平台的一种社交媒体营销工具,被广泛用于企业的宣传推广、客户互动等方面。那么,Spring Boot 如何与微信公众号结合呢? 首先,我们可以通过 Spring Boot 提供的 Web 应用程序开发框架,结合微信公众号的开发文档和接口,编写实现微信公众号功能的后端代码。通过使用 Spring Boot 的 MVC 架构,我们可以定义处理微信公众号各种请求的控制器,并利用 Spring 的依赖注入特性,调用微信公众号提供的接口实现相关功能。 其次,Spring Boot 提供了丰富的开箱即用的插件和组件,可以方便地集成第三方库和工具。我们可以利用 Spring Boot 的插件,快速集成微信公众号的 SDK 或 API,简化开发过程。同时,Spring Boot 还提供了很多自动配置选项,可以减少开发者的配置工作,提高开发效率。 另外,通过使用 Spring Boot 的自动化部署特性,我们可以将微信公众号的后端应用程序快速打包为可执行的 JAR 文件,并使用常用的部署或容器工具(如 Docker、Tomcat 等)进行部署和运行。这样,我们可以轻松地将微信公众号应用程序部署到云端,实现高可用性和扩展性。 总之,Spring Boot 提供了一个便捷、快速、可靠的开发框架,可以与微信公众号无缝结合,帮助开发者快速构建和部署功能丰富的微信公众号应用程序。无论是小型企业还是大型企业,利用 Spring Boot 可以极大地简化微信公众号的开发和运维工作,提升开发效率和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值