微信验证及自动回复

上传到服务器,微信验证(wx_sample.php)

说明

第一次验证,调用valid方法,之后就可以切换成responseMsg方法进行自动回复了

判断事件类型:text为发送文本事件,event为触发事件

<?php
//定义你的验证token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
//$wechatObj->valid();
$wechatObj->responseMsg();

class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    private function checkSignature()
    {
        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;
        }
    }

    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if (!empty($postStr)){
            $postObj = simplexml_load_string($postStr, ‘SimpleXMLElement‘, LIBXML_NOCDATA);
            $MsgType = trim($postObj->MsgType);
            //判断是发送文本事件还是触发事件
            switch ($MsgType)
            {
                case "text":
                    $resultStr = $this->receiveText($postObj);
                    break;
                case "event":
                    $resultStr = $this->receiveEvent($postObj);
                    break;
                default:
                    $resultStr = "";
                    break;
            }
            echo $resultStr;
        }else {
            echo "";
            exit;
        }
    }

    private function receiveText($object)
    {
        $funcFlag = 0;
        $key=$object->Content;
        if($key==‘房客‘){
            $contentStr[] = array("Title" =>"房客指南",
            "Description" =>"查看恋家房客指南",
            "PicUrl" =>"http://www.test.com/img/1.jpg",
            "Url" =>"http://www.test.com/tg.php");
            $resultStr = $this->transmitNews($object, $contentStr);
        }else{
            $key=intval($key);
            if($key){
                $contentStr[] = array("Title" =>‘推送框标题‘,
                "Description" =>‘推送框说明‘,
                "PicUrl" =>‘http://www.test.com/img/‘.$key.‘.jpg‘,//显示图片
                "Url" =>"http://www.test.com/room/$key");//点击后跳转页面
                $resultStr = $this->transmitNews($object, $contentStr);
            }else{
                //返回文本
                $contentStr = "请输入正确内容(数字)";
                $resultStr = $this->transmitText($object, $contentStr, $funcFlag);
            }
        }
        return $resultStr;
    }

    private function receiveEvent($object)
    {
        $contentStr = "";
        switch ($object->Event)
        {
        //关注微信事件
            case "subscribe":
                $contentStr = "欢迎关注恋家网";
        //取消关注事件
            case "unsubscribe":
                break;
        //点击事件
            case "CLICK":
                switch ($object->EventKey)
                {
                    //如果点击按钮接收关键词为mtr
                    case "mtr":
                        $contentStr[] = array("Title" =>"神秘房客报名",
                        "Description" =>"恋家神秘房客报名享大礼",
                        "PicUrl" =>"http://www.test.com/img/mtr.jpg",
                        "Url" =>"http://www.test.com/mtr.php");
                        break;
                    //如果点击按钮接收关键词为lg
                    case "lg":
                        $contentStr[] = array("Title" =>"房东指南",
                        "Description" =>"查看恋家房东指南",
                        "PicUrl" =>"http://www.test.com/img/lg.jpg",
                        "Url" =>"http://www.test.com/lg.php");
                        break;
                    //如果点击按钮接收关键词为tg
                    case "tg":
                        $contentStr[] = array("Title" =>"房客指南",
                        "Description" =>"查看恋家房客指南",
                        "PicUrl" =>"http://www.test.com/img/tg.jpg",
                        "Url" =>"http://www.test.com/tg.php");
                        break;
                    //其他点击事件
                    default:
                        $contentStr[] = array("Title" =>"默认菜单回复",
                        "Description" =>"您正在使用的是恋家网的自定义菜单测试接口",
                        "PicUrl" =>"http://www.test.com/img/default.jpg",
                        "Url" =>"http://www.test.com/img/default.php");
                        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;
    }

}
?>
时间: 2024-10-20 22:16:57

微信验证及自动回复的相关文章

微信平台ASPX高级定制开发(一):如何使用C#建立响应微信接入和自动回复的代码

微信平台不解释了,如果不了解的百度一下下,如果不会用微信,请自宫,光盘重启电脑,打开CMD输入Format C:.网上有很多针对企业级的高级定制ASPX开发,写得草草了事,很多男人干事都草草了事,这可不行,您不懂小伙伴们的心情.初学者总是希望无码,即不要太多代码就能运行起来的示例,本人保证贴出来的代码全是可运行的,代码虽然有点干瘪,但给你想象和改造的空间很大,感觉对于微信平台是真正的互联网技术改造传统行业,为什么? 找度大娘(我的QQ26959368问我,别发邮件收不到!). 本代码实现了接入微

微信公众号自动回复_Java

先声明一下,这是一个maven工程pom文件需要的依赖: 1 <dependency> 2 <groupId>dom4j</groupId> 3 <artifactId>dom4j</artifactId> 4 <version>1.6</version> 5 </dependency> 6 <dependency> 7 <groupId>commons-io</groupId&g

微信验证

public class WXverifyController : Controller { public ActionResult WXverify() { Load(); return View(); } const string Token = "Aa123456";//你的token protected void Load() { string postStr = ""; if (Request.HttpMethod.ToLower() == "p

【笔记——微信】微信公众号开发之微信验证

以上是整个流程 所需配置包括: 1.在微信公共号设置页面填写自己服务器的地址,具体到接收请求的地址. 2.在接受请求的地址进行验证. 具体实现:(Tomcat 作为服务器,jsp技术实现) 微信会要求对填写的地址进行验证,很简单,他会发送一个get请求到填写的地址,获取他,并按照官方说明进行返回,这一步骤也是为了自己的服务器安全,可以区别改请求是否来自微信官方服务器. 1 protected void doGet(HttpServletRequest req, HttpServletRespon

微信验证以及登录流程

前言: 现在大多数网站项目都支持微信登录,付款,以及支付宝登录付款,这种方式也是能够让用户很快速便捷的注册本网站的账号,进行登录,以及后续的操作.相信小伙伴们看完之后,会对怎么与微信或者支付宝服务器打交道有很深的理解,就当做是一个敲门砖吧.那么本篇主要针对微信的验证登录来打开通往微信服务器的大门,下一篇会主要讲解一下支付宝付款验证对接. 本篇为原创,转载请标出处:http://www.cnblogs.com/gudu1/p/8087130.html 下面我会使用大量的代码,代码中添加完整的注释来

微信公众号开发(一)微信验证开发者服务器接口

微信验证开发者服务器接口 微信验证开发者服务器接口 如图所示,开发者可填写自己服务器的验证token的接口地址,以及自定义的token(博主申请的测试号,使用natapp来进行内网穿透) 目的:帮助微信服务器和开发者服务器互相识别,以防恶意攻击 流程图如下(不知道博客园怎么显示md流程图,有知道的仁兄告知):(取自微信公众平台技术文档) st=>start: 开启服务 ipop1=>inputoutput: 接收到数据[不确定是谁发来的] op1=>operation: 尝试提取出sig

微信公众号自动回复加超链接最新可用实现方案

你在管理微信号时是否会有自动回复或者在关键字触发自动回复加一个超链接的需求呢?例如下图像王者荣耀这样: 很多有开发经验的朋友都知道微信管理平台会类似富文本编辑器,第一想到的解决方案会是在编辑框中加<a href='网址' >显示文字</a>. 没错,实现的方式的确如此,可是此方法在几个月前就被微信官方给屏蔽了,加了超链接代码,出来还是普通文字,这个时候运营者便开始急眼了,难道真的无法实现该需求了么? 如果真的没有解决方案,我也不会在此分享这个方案了.稍安勿躁,接着往下看! 亲试可用

微信公众平台 自动回复消息

含有4个类 Wechat 消息处理Encrypt 消息加解密Encodexml xml处理WeixinEvent 返回数据处理 1 namespace app\common\logic\Wechat; 2 3 /** 4 * Class Weixin 获取服务器发送的消息并返回消息 5 * 6 * 包含 Encrypt AES加解密类 7 * 包含 Encodexml xml格式化类 8 */ 9 10 class Wechat 11 { 12 // 消息加解密类 13 protected $e

微信关注后自动回复,根据关键字回复

package me.chunyu.apps.weixin.controller; import java.io.IOException; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servl