首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >微信开发--微信公众号 代码示例

微信开发--微信公众号 代码示例

作者头像
生南星
发布于 2019-07-22 06:37:08
发布于 2019-07-22 06:37:08
12.9K00
代码可运行
举报
文章被收录于专栏:生南星生南星
运行总次数:0
代码可运行

wechart.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
include_once "network.php";
function getSHA1($token, $timestamp, $nonce)
{
      $array = array($token, $timestamp, $nonce);
      sort($array, SORT_STRING);
      $str = implode($array);
      return array(sha1($str));
    }

    //消息验证
    function checkSign(){
        // 获取get请求来的四个参数和token
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $echostr = $_GET["echostr"];
        $token = "njb";
        
        $arr = getSHA1($token, $timestamp, $nonce);
        if($arr[0] == $signature){
            echo $echostr;
        }
    }

     // 判断当前操作是验证服务器还是处理消息
     if(isset($_GET["echostr"])){
        checkSign();
    }else {
        responseMessage();
    }

    // 处理消息的方法
    function responseMessage(){
        // 获取post过来的xml数据包
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if(empty($postStr)){
            exit;
        }

        // 直接将xml数据转换成对象
        $xmlObj = simplexml_load_string($postStr,"SimpleXMLElement",LIBXML_NOCDATA);
        // 将消息分成两类(普通消息和推送消息)
        if($xmlObj->MsgType == "event"){
            // 推送消息
            switch($xmlObj->EventKey){
                case "sendText":{
                    sendTextMsg($xmlObj,"啦啦啦");
                    break;
                }
                case "sendImg":{
                    sendImgMsg($xmlObj);
                    break;
                }
                case "sendVoice":{
                    sendVoiceMsg($xmlObj);
                    break;
                }
                case "sendVideo":{
                    sendVideoMsg($xmlObj);
                    break;
                }
                case "sendArticles":{
                    sendPicMsg($xmlObj);
                    break;
                }
                case "sendThumb":{
                    
                }
            }
        }else {
            // 普通消息
            switch($xmlObj->MsgType){
                case "text":{
                    tuLingRobot($xmlObj);
                    break;
                }
                case "image":{
                    sendCommonImage($xmlObj);
                    break;
                }
                case "location":{
                    sendWeather($xmlObj);
                    break;
                }
            }
        }
    }

    // 回复文本消息
    function sendTextMsg($obj, $content){
        $to = $obj->FromUserName;
        $from = $obj->ToUserName;
        $time = time();

        $msg = <<<MSG
        <xml>
        <ToUserName><![CDATA[{$to}]]></ToUserName>
        <FromUserName><![CDATA[{$from}]]></FromUserName>
        <CreateTime>{$time}</CreateTime>
        <MsgType><![CDATA[text]]></MsgType>
        <Content><![CDATA[{$content}]]></Content>
      </xml>
MSG;
        echo $msg;
    }

    // 回复图片消息
    function sendImgMsg($obj){
        $to = $obj->FromUserName;
        $from = $obj->ToUserName;
        $time = time();
        $msg = <<<MSG
        <xml>
          <ToUserName><![CDATA[{$to}]]></ToUserName>
          <FromUserName><![CDATA[{$from}]]></FromUserName>
          <CreateTime>{$time}</CreateTime>
          <MsgType><![CDATA[image]]></MsgType>
          <Image>
            <MediaId><![CDATA[uN11VPUDBxn2-aWJFbVe5LpM8iiwQdzfHv9W-zCVMMLq3Sq7fAYVZoGYwGCgUD0z]]></MediaId>
          </Image>
        </xml>

MSG;
        echo $msg;
    }

    // 回复视频消息
    function sendVideoMsg($obj){
        $to = $obj->FromUserName;
        $from = $obj->ToUserName;
        $time = time();
        $msg = <<<MSG
        <xml>
        <ToUserName><![CDATA[{$to}]]></ToUserName>
        <FromUserName><![CDATA[{$from}]]></FromUserName>
        <CreateTime>{$time}</CreateTime>
        <MsgType><![CDATA[video]]></MsgType>
        <Video>
            <MediaId><![CDATA[DCrPiHYglz8q4gd8vzBq9eXhUmF11FdlfWxSTeH-SVfdE-95Ki0s3iLIZU5YPm6n]]></MediaId>
            <Title><![CDATA[二叔翻跟斗]]></Title>
            <Description><![CDATA[沙雕沙雕]]></Description>
        </Video>
        </xml>
MSG;
        echo $msg;
    }

    //回复语音消息
    function sendVoiceMsg($obj){
        $to = $obj->FromUserName;
        $from = $obj->ToUserName;
        $time = time();
        $msg = <<<MSG
        <xml>
        <ToUserName><![CDATA[{$to}]]></ToUserName>
        <FromUserName><![CDATA[{$from}]]></FromUserName>
        <CreateTime>{$time}</CreateTime>
        <MsgType><![CDATA[voice]]></MsgType>
        <Voice>
            <MediaId><![CDATA[NHYvaxhScrBG3i3DB2lIs896ea49jm3aH1R1jOnUxpEhxTb-aXCk28IcBGyuQjcm]]></MediaId>
        </Voice>
        </xml>
MSG;
        echo $msg;
    }

    //回复图文消息
    function sendPicMsg($obj){
        $to = $obj->FromUserName;
        $from = $obj->ToUserName;
        $time = time();
        $msg = <<<MSG
        <xml>
        <ToUserName><![CDATA[{$to}]]></ToUserName>
        <FromUserName><![CDATA[{$from}]]></FromUserName>
        <CreateTime>{$time}</CreateTime>
        <MsgType><![CDATA[news]]></MsgType>
        <ArticleCount>2</ArticleCount>
        <Articles>
            <item>
            <Title><![CDATA[个性穿搭,酷爽今夏]]></Title>
            <Description><![CDATA[上班前穿什么不知道,看完这篇文章,一周的穿搭都有了! 星期一 星期一的早晨可以戴个眼镜出门,既可以遮挡周一赖床后的打肿脸,又能美美的造型下。]]></Description>
            <PicUrl><![CDATA[https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1558625352962&di=60b26754c82dbf2ccbfbd6776bd3dcba&imgtype=0&src=http%3A%2F%2Fvpic.video.qq.com%2F32343568%2Fu0349xuj7wf_ori_3.jpg]]></PicUrl>
            <Url><![CDATA[https://mp.weixin.qq.com/s/B0wEKM-bPfHrfAEDxO-fsw]]></Url>
            </item>
            <item>
            <Title><![CDATA[个性穿搭,酷爽今夏001]]></Title>
            <Description><![CDATA[上班前穿什么不知道,看完这篇文章,一周的穿搭都有了! 星期一 星期一的早晨可以戴个眼镜出门,既可以遮挡周一赖床后的打肿脸,又能美美的造型下。001]]></Description>
            <PicUrl><![CDATA[https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1558625313274&di=a919a3ea70018659c997079ccf60b26f&imgtype=0&src=http%3A%2F%2Fimg.alicdn.com%2Ftfscom%2Fi4%2F48941084%2FTB2XIW4amIb61BjSZFDXXa0yVXa_%2521%252148941084.jpg]]></PicUrl>
            <Url><![CDATA[https://mp.weixin.qq.com/s/zV79zuhOpmUrJYf3VkCmYA]]></Url>
            </item>
        </Articles>
        </xml>
MSG;
        echo $msg;
    }

    // 图灵机器人回复消息--文本
    function tuLingRobot($obj){
        // 获取用户输入的内容
        $content = $obj->Content;
        $url = "http://www.tuling123.com/openapi/api?key=b8309f5ca82849f5a9c5466195b08a6e&info={$content}";
        $jsonStr = httpGet($url);
        $objdata = json_decode($jsonStr);
        $text = $objdata->text;
        sendTextMsg($obj, $text);
    }

    // 图片
    function sendCommonImage($obj){
        $to = $obj->FromUserName;
        $from = $obj->ToUserName;
        $time = time();
        $mediaId = $obj->MediaId;

        $msg = <<<MSG
        <xml>
        <ToUserName><![CDATA[{$to}]]></ToUserName>
        <FromUserName><![CDATA[{$from}]]></FromUserName>
        <CreateTime>{$time}</CreateTime>
        <MsgType><![CDATA[image]]></MsgType>
        <Image>
          <MediaId><![CDATA[{$mediaId}]]></MediaId>
        </Image>
        </xml>
MSG;
        echo $msg;
    }

    // 回复位置天气状况
    function sendWeather($obj){
        // 获取经纬度
        // 维度
        $IX = $obj->Location_X;
        // 经度 
        $IY = $obj->Location_Y;

        $url = "https://api.seniverse.com/v3/weather/now.json?key=SOFLe1lnznLDeabGG&location={$IX}:{$IY}&language=zh-Hans&unit=c";

        $tq = httpGet($url);
        $objdata = json_decode($tq);
        $objw = "当前城市:".$objdata->results[0]->location->name." 天气:".$objdata->results[0]->now->text." 温度:".$objdata->results[0]->now->temperature."℃";
        sendTextMsg($obj, $objw);
    }
?>

accessToken.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- 
    每次需要token时,引入本地文件,并调用getAccessToken()获取token
    第一次调用时,数据库里没有数据,直接获取新的token,插入数据库并返回新的token
    以后在调用时,先判断数据库里的token是否过期,如果过期重新请求新的token,更新数据库并返回;未过期,直接返回
 -->
<?php
    include_once "network.php";
    // 获取新token
    function getNewAccessToken(){
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxf7cacd411668f918&secret=7cc101ad499b231a1e549529254d4e09";
        $jsonStr = httpGet($url);

        $obj = json_decode($jsonStr);

        return $obj->access_token;
    }

    function getAccessToken(){
        // 连接数据库
        $mysqli = new mysqli("pbqdrxxwizfr.mysql.sae.sina.com.cn","data_base1","ningbo1997","data_pool1","10556");
        if($mysqli->connect_error){
            exit("数据库连接失败!");
        }

        $mysqli->set_charset("utf8");

        $sql = "select * from access_token";

        $res = $mysqli->query($sql);

        $arr = mysqli_fetch_all($res,MYSQL_NUM);

        if(count($arr) == 0){
            // 第一次使用token,获取新的token并插入数据库,返回token
            $token = getNewAccessToken();
            // 获取时间戳 单位s
            $time = time();
            $insertStr = "insert into access_token (token,time) values ('{$token}','{$time}')";
            if(!$mysqli->query($insertStr)){
                exit('插入数据失败!');
            }
            return $token;
        }else {
            // 判断token是否过期
            $time = $arr[0][1];
            // 获取当前时间
            $now = time();
            if($now - $time > 7100){
                // 过期,重新请求新的token,更新数据库,返回token
                $token = getNewAccessToken();
                
                $updateStr = "update access_token set token='{$token}',time='{$now}'";

                if(!$mysqli->query($updateStr)){
                    exit('更新token失败!');
                }
                return $token;
            }else {
                // 未过期,直接返回token
                return $arr[0][0];
            }
        }
    }
?>

menu.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- 
    每次需要token时,引入本地文件,并调用getAccessToken()获取token
    第一次调用时,数据库里没有数据,直接获取新的token,插入数据库并返回新的token
    以后在调用时,先判断数据库里的token是否过期,如果过期重新请求新的token,更新数据库并返回;未过期,直接返回
 -->
<?php
    include_once "network.php";
    // 获取新token
    function getNewAccessToken(){
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxf7cacd411668f918&secret=7cc101ad499b231a1e549529254d4e09";
        $jsonStr = httpGet($url);

        $obj = json_decode($jsonStr);

        return $obj->access_token;
    }

    function getAccessToken(){
        // 连接数据库
        $mysqli = new mysqli("pbqdrxxwizfr.mysql.sae.sina.com.cn","data_base1","ningbo1997","data_pool1","10556");
        if($mysqli->connect_error){
            exit("数据库连接失败!");
        }

        $mysqli->set_charset("utf8");

        $sql = "select * from access_token";

        $res = $mysqli->query($sql);

        $arr = mysqli_fetch_all($res,MYSQL_NUM);

        if(count($arr) == 0){
            // 第一次使用token,获取新的token并插入数据库,返回token
            $token = getNewAccessToken();
            // 获取时间戳 单位s
            $time = time();
            $insertStr = "insert into access_token (token,time) values ('{$token}','{$time}')";
            if(!$mysqli->query($insertStr)){
                exit('插入数据失败!');
            }
            return $token;
        }else {
            // 判断token是否过期
            $time = $arr[0][1];
            // 获取当前时间
            $now = time();
            if($now - $time > 7100){
                // 过期,重新请求新的token,更新数据库,返回token
                $token = getNewAccessToken();
                
                $updateStr = "update access_token set token='{$token}',time='{$now}'";

                if(!$mysqli->query($updateStr)){
                    exit('更新token失败!');
                }
                return $token;
            }else {
                // 未过期,直接返回token
                return $arr[0][0];
            }
        }
    }
?>

network.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
//把网络请求封装成函数, 写到该文件中, 如果需要使用网络请求, 就导入该文件
//使用php来发送请求

//通过curl的方式发送请求(微信公众号推荐的方式)

function httpGet($url) {
  //A.初始化curl请求
  $curl = curl_init();
  //B.配置请求  
  //1.返回的数据以文件流的形式返回
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
  //2.超时时间
  curl_setopt($curl, CURLOPT_TIMEOUT, 500);
  //3.请求的url
  curl_setopt($curl, CURLOPT_URL, $url);
  //如果需要支持https请求
  //4.开启ssl验证
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, TRUE);
  //5.支持所有主机的https请求, 2代表所有
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
  //C.执行请求, 并获取响应数据
  $response = curl_exec($curl);
  //D.断开请求
  curl_close($curl);
  //E.返回数据
  return $response;
}

function httpPost($url, $data, $isJson = false) {
  //A.初始化curl请求
  $curl = curl_init();
  //B.配置请求  
  //1.返回的数据以文件流的形式返回
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
  //2.超时时间
  curl_setopt($curl, CURLOPT_TIMEOUT, 500);
  //3.请求的url
  curl_setopt($curl, CURLOPT_URL, $url);
  //4.请求的参数(application/x-www-form-urlencoded)
  curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  //如果参数类型不是application/x-www-form-urlencoded, 需要修改contentype
  if ($isJson) {
    curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-type:application/json"));
  }
  //如果需要支持https请求
  //5.开启ssl验证
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, TRUE);
  //6.支持所有主机的https请求, 2代表所有
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
  //C.执行请求, 并获取响应数据
  $response = curl_exec($curl);
  //D.断开请求
  curl_close($curl);
  //E.返回数据
  return $response;
}

?>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生南星 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​C++ STL源码剖析之unordered_xxx
前面学到了hashtable,而这节是hashtable的容器适配器:unordered_map。
公众号guangcity
2019/10/31
1.9K0
【视频+文字讲解】C++那些事之彻底搞懂STL HashTable
最近的繁星计划有一个task是阅读hashtable源码,看到一些朋友的提问,这里将总结一些面试常考点,以及看完hashtable你必须要掌握的几点内容。
公众号guangcity
2023/09/02
3180
【视频+文字讲解】C++那些事之彻底搞懂STL HashTable
C++:哈希表
在 C++ 中,unordered_set 和 unordered_map 是两种基于哈希表(Hash Table)的容器,它们是 C++11 标准模板库的一部分,提供了高效的元素存储和访问。
HZzzzzLu
2024/11/26
1820
C++:哈希表
【C++】unordered_map与unordered_set使用
https://legacy.cplusplus.com/reference/unordered_set/
用户11290673
2025/01/13
1390
C++11:基于std::unordered_map和共享锁构建线程安全的map
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/52072061
10km
2019/05/25
9.2K0
用哈希表封装myunordered_map/_set--C++
SGI-STL30版本源代码中没有unordered_map和unordered_set,SGI-STL30版本是C++11之前的STL版本,这两个容器是C++11之后才更新的。但是SGI-STL30实现了哈希表,只容器的名字是hash_map和hash_set,他是作为非标准的容器出现的,非标准是指非C++标准规定必须实现的,源代码在hash_map/hash_set/stl_hash_map/stl_hash_set/stl_hashtable.h中 hash_map和hash_set的实现结构框架核心部分截取出来如下:
小志biubiu
2025/02/27
740
用哈希表封装myunordered_map/_set--C++
现代C++教程:高速上手(四)-容器
std::array与std::vector不同的是,array对象的大小是固定的,如果容器大小是固定的,那么可以优先考虑使用std::array容器。
程序员小涛
2020/12/03
9270
【笔记】C++标准库: 体系结构与内核分析(上)
这篇是这段时间看的侯捷关于C++标准模板库的课程《C++标准库: 体系结构与内核分析》的笔记, 课程内容大家自己找吧. 这个课程质量很高, 除了介绍STL的基础操作外, 更进一步介绍了STL的工作原理并展示了部分源代码. 尽管这门课所介绍的都是较老版本的STL内容, 但是毕竟底层思想多年来也没有太大改变, 对今天仍有很大意义.
ZifengHuang
2021/12/18
1.3K0
【笔记】C++标准库: 体系结构与内核分析(上)
【C++】用哈希表封装myunordered_map和myunordered_set
SGI-STL30版本源代码中没有unordered_map和unordered_set,SGI-STL30版本是C++11之前的STL版本,这两个容器是C++11之后才更新的。但是SGI-STL30实现了哈希表,只容器的名字是hash_map和hash_set,他是作为⾮标准的容器出现的,⾮标准是指⾮C++标准规定必须实现的,源代码在hash_map/hash_set/stl_hash_map/stl_hash_set/stl_hashtable.h中hash_map和hash_set的实现结构框架核⼼部分截取出来如下:
用户11290673
2025/01/13
1310
【C++】用哈希表封装myunordered_map和myunordered_set
【哈希表封装实现】—— 我与C++的不解之缘(二十九)
源代码在hash_map/hash_set/stl_hash_map/stl_hash_map/stl_hash_set/stl_hashtable.h中
星辰与你
2025/04/03
1030
【哈希表封装实现】—— 我与C++的不解之缘(二十九)
C++ STL源码剖析之map、multimap、initializer_list
map/multimap 以rb_tree为底层结构,因此有元素自动排序特点,排序的依据是key。
公众号guangcity
2019/10/23
1.2K0
C++ STL源码剖析之map、multimap、initializer_list
《逆袭进大厂》第四弹之C++重头戏STL30问30答
这是《逆袭进大厂》系列的第四期,本期是 C++ 重头戏,也就是标准模板库 STL 的内容,本期是 24098 个字。
拓跋阿秀
2021/03/21
1.6K0
从零开始学C++之STL(一):STL六大组件简介
s1mba
2017/12/28
4.1K0
从零开始学C++之STL(一):STL六大组件简介
C++ STL-map与set的使用
序列式容器存储的元素在逻辑上呈现为线性序列。这些容器的共同特点是,它们允许通过位置(索引)来访问元素,且元素之间的相对位置是固定的,除非进行插入或删除操作。常见的序列式容器包括:
2025/01/27
1130
map 学习(下)——C++ 中的 hash_map, unordered_map
map 学习(下)——C++ 中的 hash_map, unordered_map 接上篇《map 学习(一)——C++中 map 的使用》。 一、hash_map 参考《C++ STL中哈希表 ha
剑影啸清寒
2018/01/02
13.7K1
C++(STL):36---关联式容器multiset、multimap源码剖析
一、multiset multiset的特性以及用法和set完全相同,唯一的差别在于它允许键值重复,因此它的插入操作采用的是底层RB-tree的insert_equal()而非insert_unique() multiset源码 //以下代码摘录于stl_multiset.h template <class _Key, class _Compare, class _Alloc> class multiset { // requirements: __STL_CLASS_REQUIRES(_Key,
用户3479834
2021/02/03
6560
读完两遍《STL源码剖析》后,我发现了一些辛秘
对于每一位学习 C++ 的小伙伴来说,STL 不可谓不重要,特别是那些为我们造好的底层轮子比如容器、算法等更是一件利器,比如在一些 OJ 平台,用 STL 下的算法刷题简直不要太爽,谁用谁知道。
拓跋阿秀
2021/04/26
3.5K0
读完两遍《STL源码剖析》后,我发现了一些辛秘
C++(STL):33---hash_set、hash_map、hash_multiset、hash_multimap源码剖析
这些关联容器底层都是使用hash table实现的. 一、hash_set 由于hash_set底层是以hash table实现的,因此hash_set只是简单的调用hash table的方法即可 与set的异同点: hash_set与set都是用来快速查找元素的 但是set会对元素自动排序,而hash_set没有 hash_set和set的使用方法相同 在介绍hash table的hash functions的时候说过,hash table有一些无法处理的类型(除非用户自己书写hash function
用户3479834
2021/02/03
2.2K0
C++(STL):33---hash_set、hash_map、hash_multiset、hash_multimap源码剖析
STL总结与常见面试题+资料
为了建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,以提升各自的独立性、弹性、交互操作性(相互合作性,interoperability),诞生了STL。
C语言与CPP编程
2020/12/02
6070
STL总结与常见面试题+资料
C++ 中文周刊 第126期
RSS https://github.com/wanghenshui/cppweeklynews/releases.atom
王很水
2024/07/30
1210
C++ 中文周刊 第126期
推荐阅读
相关推荐
​C++ STL源码剖析之unordered_xxx
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档