前期准备工作

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

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

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

    public function test(){
$nonce = $_GET['nonce'];
$token = '*******';
$timestamp = $_GET['timestamp'];
$echostr = $_GET['echostr'];
$signature = $_GET['signature'];
//形成数组,然后按字典序排序
$array = array();
$array = array($nonce, $timestamp, $token);
sort($array);
//拼接成字符串,sha1加密 ,然后与signature进行校验
$str = sha1( implode( $array ) );
echo $echostr;
exit;
}
$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>";

$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 = "******回复内容";
}
$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格式的字符串

$res = $this->http("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token,"POST",$data2);
    public function http($url, $method, $postfields = null, $headers = array(), $debug = false)
{
$ci = curl_init();
/* Curl settings */
curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ci, CURLOPT_TIMEOUT, 30);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, true); switch ($method) {
case 'POST':
curl_setopt($ci, CURLOPT_POST, true);
if (!empty($postfields)) {
curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
$this->postdata = $postfields;
}
break;
}
curl_setopt($ci, CURLOPT_URL, $url);
curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ci, CURLINFO_HEADER_OUT, true); $response = curl_exec($ci);
$http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE); if ($debug) {
echo "=====post data======\r\n";
var_dump($postfields); echo '=====info=====' . "\r\n";
print_r(curl_getinfo($ci)); echo '=====$response=====' . "\r\n";
print_r($response);
}
curl_close($ci);
// return array($http_code, $response);
return $response;
}

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

{
"button": [
{
"name": "***",
"sub_button": [
{
"type": "view",
"name": "***",
"url": "https://www.baidu.com/"
}
]
},
{
"name": "***",
"sub_button": [
{
"type": "miniprogram",
"name": "小程序",
"url": "****",
"appid": "",
"pagepath": ""
}
]
}
]
}

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

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

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

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

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

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

最全面 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. ssm——spring整理

    目录 1.概述 2.Spring工厂与IOC 2.1.为什么要有Spring框架 2.2.什么是IOC 2.Spring工厂对实例注入 2.1.使用标签进行注入 2.2.使用注解进行注入 2.2.3. ...

  2. [OpenCV实战]34 使用OpenCV进行图像修复

    目录 1 什么是图像修复 1.1 INPAINT_NS : Navier-Stokes based Inpainting 1.2 INPAINT_TELEA : Fast Marching Metho ...

  3. 一文教会你mock(Mockito和PowerMock双剑合璧)

    作者:京东物流 杨建民 1.什么是Mock Mock有模仿.伪造的含义.Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.mock工具使用 ...

  4. 聊聊Cookie、Session、Token 背后的故事

    摘要:Cookie.Session.Token 这三者是不同发展阶段的产物 本文分享自华为云社区<Cookie.Session.Token 背后的故事>,作者: 龙哥手记. 1. 网站交互 ...

  5. Java基础篇——常用类

    Objec类 Test t1 = new Test(); Test t2 = new Test(); //toString方法,对某个对象的字符串输出 //getClass方法,返回该对象的Class ...

  6. Zabbix与乐维监控对比分析(八)——其他功能篇

    前面我们详细介绍了Zabbix与乐维监控的架构与性能.Agent管理.自动发现.权限管理.对象管理.告警管理.可视化.图形图表及网络功能方面的对比分析,接下来我们将对二者其他功能进行对比分析. 本篇是 ...

  7. PWA-H5 Web App优化探索之路(Service Worker,Lighthouse)

    PWA是什么? Progressive Web App 渐进式web应用程序,简单来说,就是可以让你的WEB App,带来与原生App相媲美的用户体验.. 为什么要用PWA? 简单来说,是为了web应 ...

  8. 音频编辑服务UI SDK接入指导及常见问题

    华为 HMS Core 音频编辑服务(Audio Editor Kit)是华为帮助全球开发者快速构建各类应用音频能力的服务,汇聚了华为在音乐.语音等相关音频领域的先进技术.音频编辑服务为开发者们提供音 ...

  9. MATLAB实现随机森林(RF)回归与自变量影响程度分析

      本文介绍基于MATLAB,利用随机森林(RF)算法实现回归预测,以及自变量重要性排序的操作. 目录 1 分解代码 1.1 最优叶子节点数与树数确定 1.2 循环准备 1.3 数据划分 1.4 随机 ...

  10. Nacos服务注册原理分析

    在分布式服务中,原来的单体服务会被拆分成一个个微服务,服务注册实例到注册中心,服务消费者通过注册中心获取实例列表,直接请求调用服务. 服务是如何注册到注册中心,服务如果挂了,服务是如何检测?带着这些问 ...