zoukankan      html  css  js  c++  java
  • 微信用户订阅推送信息,关键字推送图片列表

    由于接下来要进行微信开发,所以今天做了一个小功能。

    前提:拥有个人订阅号,并成功绑定域名接口

    功能概述:用户订阅公众号的时候,像用户推送提示信息,然后用户输入关键词,提供相应功能,这里展示的是从数据库获取到的新闻列表。

    关键点是:对于以前在网页上打印出错误信息的模式,现在要改变成在服务器本地建立一个文件,用于调试

    完整代码如下

    <?php
    //
    // 关注/取消关注事件消息
    // 微信公众账号关注与取消关注事件消息
    //
    date_default_timezone_set('PRC');
    define("TOKEN", "zhouqi");

    $wechatObj = new wechatCallbackapiTest();
    if (!isset($_GET['echostr'])) {
    $wechatObj->responseMsg();
    }else{
    $wechatObj->valid();
    }

    class wechatCallbackapiTest
    {
    public function valid()
    {
    $echoStr = $_GET["echostr"];
    if($this->checkSignature()){
    echo $echoStr;
    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;
    }
    }

    public function responseMsg()
    {
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
    if (!empty($postStr)){
    //将微信返回的post数据包变成xml对象
    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
    $RX_TYPE = trim($postObj->MsgType);
    //获取公共号标识号
    $ToUserName = $postObj->ToUserName;
    //获取openid
    $FromUserName = $postObj->FromUserName;
    //获取用户输入的内容
    $Keyword = $postObj->Content;
    $CreateTime = time();

    switch ($RX_TYPE)
    {
    case "event":
    //订阅类型触发时间
    if ($postObj->Event == 'subscribe'){
    //文本消息模板
    $textTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[%s]]></Content>
    </xml>";

    $contentStr = "welcome,欢迎订阅周起的公众号. *功能菜单如下 1.输入 新闻 获取新闻列表";
    //将参数按照顺序填充到$textTpl占位符上
    $result = sprintf($textTpl,$FromUserName,$ToUserName,$CreateTime,$contentStr);
    //调试使用日志的形式,将调试信息放到本地文件上
    file_put_contents('wx.log',date("Y-m-d H:i:s")."订阅事件文本发送成功! ",8);
    }
    break;
    case "text":
    if ($Keyword == '新闻'){
    //列表图文消息模板
    $textHead = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[news]]></MsgType>
    <ArticleCount>%s</ArticleCount>
    <Articles>";
    $textBody = "<item>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
    <PicUrl><![CDATA[%s]]></PicUrl>
    <Url><![CDATA[%s]]></Url>
    </item>";
    $textFooter = "</Articles></xml> ";

    //连接数据库
    $connect = mysqli_connect('127.0.0.1','root','root','wx');
    if(!($connect)){
    //打印报错信息
    $connect = "数据库连接失败Error:".mysqli_connect_errno().":".mysqli_connect_error();
    file_put_contents('wx.log',date("Y-m-d H:i:s").$connect." ",8);
    }

    //微信规定最多返回10个列表信息
    $sql = "SELECT * FROM news ORDER BY id DESC LIMIT 0,10";
    $res = mysqli_query($connect,$sql);
    $count = mysqli_num_rows($res);
    //填充图片列表头部信息
    $result = sprintf($textHead,$FromUserName,$ToUserName,$CreateTime,$count);

    //填充图片列表主要信息
    while ($row = mysqli_fetch_assoc($res)){
    $result .= sprintf($textBody,$row['title'],$row['descript'],$row['pic'],$row['url']);
    }
    //填充图片列表尾部信息
    $result .= $textFooter;
    }
    break;
    default:
    file_put_contents('wx.log',date("Y-m-d H:i:s")." 事件触发失败! ",8);
    break;
    }
    //打印出结果等待微信服务器获取
    echo $result;
    }else {
    echo "";
    exit;
    }
    }
    }
    ?>
  • 相关阅读:
    构造回文的最小插入次数
    动态规划设计:最大子数组
    状态压缩:对动态规划进行降维打击
    团灭 LeetCode 股票买卖问题
    经典动态规划:戳气球
    贪心算法之区间调度问题
    微信分享 添加URL Schemes
    UITouch的用法
    HTTP协议详解
    经典SQL语句大全
  • 原文地址:https://www.cnblogs.com/zhouqi666/p/6784154.html
Copyright © 2011-2022 走看看