前期准备工作

https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html   微信文档

公众号后台,“基本配置”-“服务器配置”,填写服务器地址,注意,填写的方法要经过验证,

test方法只是测试,具体的要看你自己的方法,其中$token就是后台填写的“令牌”,验证通过后,所有在公众号发送的信息,都会转发到所填的链接上,注意:开启服务器配置后,公众号的自定义菜单会失效,公众号的自定义菜单会消失

  1. public function test(){
  2. $nonce = $_GET['nonce'];
  3. $token = '*******';
  4. $timestamp = $_GET['timestamp'];
  5. $echostr = $_GET['echostr'];
  6. $signature = $_GET['signature'];
  7. //形成数组,然后按字典序排序
  8. $array = array();
  9. $array = array($nonce, $timestamp, $token);
  10. sort($array);
  11. //拼接成字符串,sha1加密 ,然后与signature进行校验
  12. $str = sha1( implode( $array ) );
  13. echo $echostr;
  14. exit;
  15. }
  1. $file_in = file_get_contents("php://input"); //接收post数据
    //用SimpleXML解析POST过来的XML数据
    $postObj = simplexml_load_string($file_in,'SimpleXMLElement',LIBXML_NOCDATA);
    $fromUsername = $postObj->FromUserName; //获取发送方帐号(OpenID)
    $toUsername = $postObj->ToUserName; //获取接收方账号
    $keyword = trim($postObj->Content); //获取消息内容
    $masType = $postObj->MsgType;//获取消息类型,可以作分类判断。本例默认是文本消息,不做判断
    $time = time(); //获取当前时间戳

    //---------- 返 回 数 据 ---------- //
    //返回消息模板
    $textTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[%s]]></MsgType>
    <Content><![CDATA[%s]]></Content>
    </xml>";

  1. $msgType = "text"; //消息类型
    if($masType != 'text'){
    $contentStr = "回复内容*****";
    }else if(trim($keyword) == ''){
    $contentStr = "发送不能为空";
    }else if(is_numeric($keyword)){
    if(!is_numeric($keyword)||strpos($keyword,".")!==false){
    $contentStr = "编号不正确,请查询后再进行投票";
    $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
    echo $resultStr;
    return;
    }
    $data1['toupiao_time'] = date("Y-m-d");

    $message = M('message_cun');

    $b = $message->where("member_id = '%s' and ip = '%s' and toupiao_time = '%s'",$keyword,$fromUsername,$data1['toupiao_time'])->count();
    if($b > 0 ){
    $contentStr = "您已对该项投票,请明天再来!";
    $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
    echo $resultStr;
    return;
    }
    $a = $message->where("ip = '%s' and toupiao_time = '%s'",$fromUsername,$data1['toupiao_time'])->count();
    if ($a >= 10) {
    $contentStr = "您已投满10票,请明天再来!";
    $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
    echo $resultStr;
    return;
    }else{
    $data['member_id'] = $keyword;
    $data['ip'] =(string) $fromUsername;
    $data['userName'] = (string) $toUsername;
    $data['toupiao_time'] = date("Y-m-d");
    $res = $message->data($data)->add();
    if($res){
    $contentStr = "投票成功";
    $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
    echo $resultStr;
    }
    }
    }else{
    $contentStr = "******回复内容";
    }
  1. $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
    echo $resultStr;

可以看到,在接受到信息后,获取编号,往记录表中插入一条数据,有两个表,记录表(记录插入的所有票数),投票表(记录要投票的主体,票数),重点:建立一个触发器,在记录表插入时,根据 编号,使投票表中编号对应的票数+1

member_id 就是从微信获取的编号,member_cun就是投票表,code就是投票表中的编号,这样是就实现了微信回复编号,进行投票。

自定义菜单:

开启服务器配置后,之前自定义的菜单就没了,就需要我们通过接口自定义了。

https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html  微信文档,

在创建之前,我们可以查询一下 http请求方式: GET(请使用https协议)https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=ACCESS_TOKEN,查询出当前公众号的菜单,创建的时候就不用挨个想之前创建的是啥了,

创建时要注意格式,其他的没有什么特别注意的点,注意发送的json格式一定要对,post请求,可以使用调试工具调试你自己的json格式,

下面是一个可以进行 post请求的方法,

调用如下,其中 $data2 就是json格式的字符串

  1. $res = $this->http("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token,"POST",$data2);
  1. public function http($url, $method, $postfields = null, $headers = array(), $debug = false)
  2. {
  3. $ci = curl_init();
  4. /* Curl settings */
  5. curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
  6. curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 30);
  7. curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE);
  8. curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, FALSE);
  9. curl_setopt($ci, CURLOPT_TIMEOUT, 30);
  10. curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
  11.  
  12. switch ($method) {
  13. case 'POST':
  14. curl_setopt($ci, CURLOPT_POST, true);
  15. if (!empty($postfields)) {
  16. curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
  17. $this->postdata = $postfields;
  18. }
  19. break;
  20. }
  21. curl_setopt($ci, CURLOPT_URL, $url);
  22. curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
  23. curl_setopt($ci, CURLINFO_HEADER_OUT, true);
  24.  
  25. $response = curl_exec($ci);
  26. $http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
  27.  
  28. if ($debug) {
  29. echo "=====post data======\r\n";
  30. var_dump($postfields);
  31.  
  32. echo '=====info=====' . "\r\n";
  33. print_r(curl_getinfo($ci));
  34.  
  35. echo '=====$response=====' . "\r\n";
  36. print_r($response);
  37. }
  38. curl_close($ci);
  39. // return array($http_code, $response);
  40. return $response;
  41. }

附上一个json格式,各个参数的意思可以在微信文档中查看,可以放链接,小程序

  1. {
  2. "button": [
  3. {
  4. "name": "***",
  5. "sub_button": [
  6. {
  7. "type": "view",
  8. "name": "***",
  9. "url": "https://www.baidu.com/"
  10. }
  11. ]
  12. },
  13. {
  14. "name": "***",
  15. "sub_button": [
  16. {
  17. "type": "miniprogram",
  18. "name": "小程序",
  19. "url": "****",
  20. "appid": "",
  21. "pagepath": ""
  22. }
  23. ]
  24. }
  25. ]
  26. }

其中接口中需要的access_token,需要你通过微信的appid和开发者密码来获取,注意一个过期时间,一天可以访问2000次,access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效,好的做法是建立一个表存token,

判断最后一次获取的时间和当前时间的差,超过多长时间重新获取存库

需要注意的是,ip白名单要添加上,只有添加的ip才可以获取token,还有“公众号设置”-“功能设置”,授权域名要添加,添加的方法都有提示,下载一个txt文档到网站根目录,然后验证就可以了,一遍不行多试几遍,

如果真的因为失误token次数超了,影响业务, 可以在微信后台清空请求次数,再次请求,token一定要存库,不能每次用到都请求新的,不然很容易就超过限制。

  1. $access_time = M("weixin_cun")->order("id desc")->getField("time");
  2. $time = time() - strtotime($access_time);
  3. if($time>2000){
  4. $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->app_id."&secret=".$this->app_secret;
  5. $content = file_get_contents($url);
  6. $result = json_decode($content);
  7. $data['access_token'] = $result->access_token;
  8. if(!empty($data['access_token'])){
  9. $weixin = M("weixin_cun")->data($data)->add();
  10. }else{
  11.  
  12. }
  13. }

至此,实现微信公众号回复编号进行投票,自定义菜单功能  完成。

最全面 think php 实现微信公众号回复编号进行投票,自定义菜单功能的更多相关文章

  1. 微信公众号第三方平台生成自定义菜单提示 获取"access_token失败"

    在微信公众号第三方平台要生成自定义菜单时,程序反应很慢,最终提示"获取access_token失败"(之前程序无改动,使用时间已久),查了大半天,找不出原因. 排除.在微信公众号平 ...

  2. 微信JS-SDK]微信公众号JS开发之卡券领取功能详解

    js sdk: http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.952-.E6 ...

  3. 利用python 实现微信公众号群发图片与文本消息功能

    在微信公众号开发中,使用api都要附加access_token内容.因此,首先需要获取access_token.如下: #获取微信access_token def get_token(): paylo ...

  4. JAVA微信公众号网页开发——生成自定义微信菜单(携带参数)

    官网接口地址:https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.ht ...

  5. NET微信公众号开发-5.0微信支付(待测试)

    开发前准备. 1.0微信支付官方开发者文档 2.0官方demo下载 我们用c#所以选择.net版本 不过这个官方的demo根本跑步起来 3.0官方demo运行起来解决方案 4.0微信支付官方.net版 ...

  6. .NET微信公众号开发-1.0初始微信公众号

    一.前言 微信公众号是开发者或商家在微信公众平台上申请的应用账号,该帐号与QQ账号互通,通过公众号,商家可在微信平台上实现和特定群体的文字.图片.语音.视频的全方位沟通.互动 .形成了一 种主流的线上 ...

  7. .NET微信公众号开发-2.0创建自定义菜单

    一.前言 开发之前,我们需要阅读官方的接口说明文档,不得不吐槽一下,微信的这个官方文档真的很烂,但是,为了开发我们需要的功能,我们也不得不去看这些文档. 接口文档地址:http://mp.weixin ...

  8. .NET微信公众号开发-3.0查询自定义菜单

    一.前言 前面我们已经创建好了我们的自定义菜单.那么我们现在要如何查询我们自定义的菜单.原理都是一样的,而且都是相当简单,只是接口地址文档换掉了. 2.0开始编码 同样我们首先创建好我的查询页面,在这 ...

  9. .NET微信公众号开发-4.0公众号消息处理

    一.前言 微信公众平台的消息处理还是比较完善的,有最基本的文本消息,到图文消息,到图片消息,语音消息,视频消息,音乐消息其基本原理都是一样的,只不过所post的xml数据有所差别,在处理消息之前,我们 ...

  10. .NET微信公众号开发-5.0微信支付

    一.前言 在开始做这个功能之前,我们要做的第一件事情就是思考,如何做这个微信支付,从哪里开始,从哪里入手,官方的sdk说明什么的,有没有什么官方的demo,还有就是老板给我的一些资料齐全不,那些要申请 ...

随机推荐

  1. 万字长文详解 YOLOv1-v5 系列模型

    一,YOLOv1 Abstract 1. Introduction 2. Unified Detectron 2.1. Network Design 2.2 Training 2.4. Inferen ...

  2. Windows关闭网络防火墙教程

    Win10操作系统 1. 打开控制面板,点击"系统和安全" 2. 点击"Windows Defender 防火墙" 3. 点击"启用或关闭Window ...

  3. eclipse打不开maven项目中的pom.xml

    1.问题描述 在eclipse中我双击打开maven项目中的pom.xml报错. 2.产生原因 正如报错中描述的那样"Failed to create the part's controls ...

  4. Flutter异常监控 - 贰 | 框架Catcher原理分析

    前言 在给 Flutter 应用做异常监控的时候,一开始我是拒绝滴,如果不考虑 Flutter Engine 和 native 侧的监控,用我另一篇文章中不得不知道的 Flutter 异常捕获知识点 ...

  5. [常用工具] C++环境下Qt的安装

    文章目录 1 Qt(C++)版本的选择 2 Qt 安装 2.1 Qt 6.3.1的安装 2.2 Qt 5.14.2的安装 3 Qt 其他版本安装 1 Qt(C++)版本的选择 Qt(C++)是一个跨平 ...

  6. day04-Vue01

    Vue01 1.Vue是什么? Vue(读音/vju:/,类似于view)是一个前端框架,依据构建用户界面 Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或者项目整合 支持和其他类库结合使 ...

  7. Java基础篇——JVM初步

    1.JVM的位置 2.JVM体系结构 3.类加载器 虚拟机加载器(java) 启动类(根)加载器(C++) 扩展类加载器(java)↑ 应用程序加载器(java)↑ 4.双亲委派机制 类加载器收到类加 ...

  8. 学习记录C

    学了这么久,终于开始实训项目了....... 奥里给 !!! 压力好大,好喜欢什么也不想的时候 记录学习的代码 分享一下 /* system函数:( #include<stdlib.h> ...

  9. UOJ60.【UR #5】怎样提高智商

    简要题意 谜题集中有 \(n\) 个谜题,第 \(i\) 个谜题形如: \(i.\) 编号小于 \(i\) 的题目中你选择了几个 \(h_i\)? A. \(a_i\) B. \(b_i\) C. \ ...

  10. 均有商业公司支持!2023再看数据湖 hudi iceberg delta2 社区发展现状!

    开源数据湖三剑客 Apache hudi.Apache iceberg .Databricks delta 近年来大动作不断. 2021年8月,Apache Iceberg 的创始人 Ryan Blu ...