微信公众号开发(3)---历史上的今天小实例

功能是在关注意创3D打印测试这个订阅号之后,输入月日,比如0204(代表2月4日),会收到很多天历史上的这一天发生的大事件。

代码部署环境是用了新浪sae,thinkphp框架基础上实现功能。

控制器中:

<?PHP
namespace Home\Controller;
use Think\Controller;

class IndexController extends Controller {
    //token验证,微信服务器发送post请求过来
    public function index(){
      $timestamp = $_GET["timestamp"];//a时间戳
      $nonce = $_GET["nonce"];//随机数
      $token = "weixin";//token
      $signature = $_GET["signature"];//加密签名
      $echoStr = $_GET["echostr"];;//随机字符串
      //1)将token、timestamp、nonce三个参数进行字典序排序
      $tmpArr = array($token, $timestamp, $nonce);
      sort($tmpArr, SORT_STRING);
     //2)将三个参数字符串拼接成一个字符串进行sha1加密
     $tmpStr = implode( $tmpArr );
     $tmpStr = sha1( $tmpStr );
     //3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
    if( ($tmpStr == $signature) && $echoStr ){
         echo  $echoStr;//第一次接入
         exit;
       }else{
           $this->responseMsg();//第二、三、、、、、、次接入,除了第一次接入,以后的接入不会传送$echoStr
       }
    }
    public function responseMsg(){
       //获取到微信推送过来的数据
       $postArr = $GLOBALS["HTTP_RAW_POST_DATA"];
       
       //处理消息
        $postObj = simplexml_load_string($postArr);//转成了对象
        //用户关注后,微信推送过来一个包含用户信息的xml数据包,我们接收后并回复
        //判断消息类型
        if(strtolower($postObj->MsgType) == "event"){
            //判断事件类型,是订阅(subscribe),还是退订(unsubscribe)
            if(strtolower($postObj->Event) == "subscribe"){
                //$content = "旅行者,欢迎你--用户的openid:".$postObj->FromUserName."--开发者微信号:".$postObj->ToUserName."--消息类型:".$postObj->MsgType."--事件类型:".$postObj->Event;
                $content = "欢迎你,旅行者,快过来,告诉你个秘密,你输入月日我就可以帮你查到历史上的大事件,比如0101";
                $wxSdkModel = new \Home\Model\IndexModel();
                $wxSdkModel -> reponseSubscribe($postObj,$content); 
            }
        }

//调取历史上的今天接口,返回信息
        if(strtolower($postObj->MsgType) == "text"){
            $time = $postObj->Content;
            $yue = substr($time,0,2);
            $ri = substr($time,-2);
            //历史上的今天接口
            $path = "http://api.avatardata.cn/HistoryToday/LookUp?key=4fa3a138823747b48366757422b61977&yue=".$yue."&ri=".$ri."&type=1&page=1&rows=50";
            //初始化
            $ch = curl_init();
            //设置参数
            curl_setopt($ch,CURLOPT_URL,$path);
            curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);//将curl_exec()获取的信息以文件流的形式返回,而不是直接输出
            //调接口
            $res = curl_exec($ch);
            //关闭
            curl_close($ch);
            if(curl_errno($ch)){
                echo curl_error($ch);
            }
            $arr = json_decode($res,true);//不加true是对象,加true是数组
            $content = "一共查到".$arr[‘total‘]."条数据\n";
            $arrnews = $arr[‘result‘];
            foreach($arrnews as $k => $v){
                $content.= $v[‘year‘]."年的这一天".$v[‘title‘]."\n";
            }
            $wxSdkModel = new \Home\Model\IndexModel();
            $wxSdkModel -> reponseText($postObj,$content);   
            }
    }

其中实例化的$wxSdkModel代表model类IndexModel.class.php

代码如下:

<?php
namespace Home\Model;
use Think\Model;

class IndexModel{

//用户发送文本消息,接收到后回复文本消息
    public function reponseText($postObj,$content){
         $toUserName = $postObj->FromUserName;
         $fromUserName = $postObj->ToUserName;//开发者微信号(原始ID)
         $crateTime = time();
         $msgType = "text";
         $template="
                <xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[%s]]></MsgType>
                <Content><![CDATA[%s]]></Content>
                </xml>";
                $info = sprintf($template,$toUserName,$fromUserName,$crateTime,$msgType,$content);
                echo $info; 
    }

}

其实这个model类就是一个集成的sdk,一些通用的方法都放在这里,不用每次都写一遍,比如回复文本消息,回复图文消息,回复图片消息,这里贴出的只是回复文本消息

的方法。

时间: 2024-10-11 07:11:05

微信公众号开发(3)---历史上的今天小实例的相关文章

C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)

原文:C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件) 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C#微信公众号开发系列教程四(接收普通消息) C#微信公众号开发系列教程五(接收事件推送与消息排重) C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件) 第四,第五章已经讲了怎么处理用户发送的消息,本章就来讲讲怎么响应用户的

微信公众号开发上传图文素材带有卡片小程序报错:errcode=45166,errmsg = invalid content hint

微信公众号开发自从支持允许在群发图文中插入小程序,方便了小程序的运营及推广.最近在三方服务开发中,要支持图文素材插入小程序遇到了一个很是棘手的问题.官方给出的插入小程序的示例支持文字.图片.卡片.如下面api文档介绍: 按照示例插入文字小程序和图片小程序都没问题,但是插入卡片小程序却是一直报错errcode=45166,errmsg = invalid content hint.检查了好长时间,才发现卡片小程序的示例中data-progarm-imageurl参数写错了,应该是data-mini

微信公众号开发总结

最近公司用到了微信公众平台,所以研究了一下微信公众号的开发技术,总体来说比较简单,结合现有的平台核技术,实现起来非常方便. 首先先来了解一下微信公众平台. "微信,是一个生活方式" ,这是微信的自我评价,是不是觉得如果那天不在朋友圈里分享一下自己的最新状态, 并且收到几个赞和评价的话,会觉得空虚寂寞呢?它实实在在的改变了我们的生活方式. " 微信,也是一个生意方式 ",在微信成为我们日常必备之app的同时,它同样具备巨大的的商业 或许不应该称为潜力,因为有很多人已经

微信公众号开发80端口映射之搭建ngrok服务器

说明 了解本文之前,最好先看前篇:<<微信公众号开发80端口映射解决方案>>.最近公司要搞微信公众号开发,需要解决80端口映射的问题,为了稳定可靠,只好自己搭建ngrok服务端.ngrok 是一个使用go语言编写的反向代理软件,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道,实现内网穿透.ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放. 环境和条件 服务器Centos6.8_x64+windows10_x64 一台有公网ip的服务器 域名解析到服务

C#微信公众号开发 -- (五)自定义菜单创建

公众号中,底部都是有自己定义的功能按钮,通过点击某个按钮来实现指定的业务逻辑操作. 下面就来说说这些按钮是怎样放到微信公众平台的,还是先来看看微信的官方解释: 请注意: 1.自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单. 2.一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替. 3.创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单, 如果菜单有更新,就会刷

.NET C#微信公众号开发远程断点调试(本地远程调试生产环境)

最近在做微信公众号开发,由于之前没有接触过,突然发现调试不方便,不方便进行断点跟踪调试.因为微信那边绑定的服务器地址必须是公网地址,但是还是想进行断点调试(毕竟这样太方便了) 因此上网搜了一下,发现好多是使用软件之类的进行请求转发从生产环境转发请求到开发环境上,发现有的太麻烦了. 突然想到Vs有一个附加到进程的远程调试.于是玩了一把.我们直接开始(服务器上就不要使用发布版本代码了,代码和本地开发一样,不然是不能调试的) 本篇是以开发环境的Visual Studio2013旗舰版以及生产环境里阿里

利用OpenShift托管Node.js Web服务进行微信公众号开发

最近写了一个微信的翻译机器人.用户只要关注该微信号,发送英文的消息,就能收到中文翻译的回复.后台是用Node.js写的,托管在OpenShift的Paas平台上.翻译过程实际上是调用微软的Bing translation API做的,代码中用到了alexu84的bing-translate和JacksonTian的wechat这两个npm模块.下面把做的过程详细说一下. 1. 微信公众号开发 首先是要到https://mp.weixin.qq.com 申请一个公众号,并申请成为开发者.目前个人只

nodejs + BAE 搭建微信公众号开发平台

闲来无事创建了一个微信公众账号,名曰“深圳生活小助手”, 关注的人不多,平时发一些深圳新闻,趣事啥的,为了丰富公众号的内容,准备添加一些便民查询功能,例如天气预报.快递查询等等. 于是就有了本文的内容. 深圳的读者扫描关注支持下啊... 闲话不多说,本文主要介绍的就是如何基于nodejs和百度云搭建微信公众号开发平台,下一节介绍如何基于该平台实现了一个简单的天气预报查询功能的小例子. 1. 使用Express搭建本地站点 Express 是一个简洁.灵活的 node.js Web 应用开发框架,

微信公众号开发及时获取当前用户Openid及注意事项

目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 (四)微信公众号开发之网页授权获取用户基本信息 (五)微信公众号开发之网页中及时获取当前用户Openid及注意事项 前言 这篇主要是承接上篇的网页授权获取用户基本信息的后文,也是对第一种静默授权之后,用户点击公众号内链接时,如何再次取得当前用户的OpenId的大致讲解和一些注意事项. 看过上一篇的小伙伴都知道,我们在用户关注的时候就已经将该用户的基本信息存入数据库中,那么如果