热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

THINKPHP5微信模板消息(异步群发)推送跨坑记录。

上次写了一篇微信模版消息推送,但是不知道怎么异步推送。导致要等它推送完几百条才能关闭网页。然后请教了大神,和自己摸索,在此记录。1、推

上次写了一篇微信模版消息推送,但是不知道怎么异步推送。导致要等它推送完几百条才能关闭网页。

然后请教了大神,和自己摸索,在此记录。

1、推送页,推送到另一个文件处理微信推送,使用fsockopen。一次性推送,不保存数据库,有需要自己改。

$data = input('post.');//前台传过来的值,组装模版使用。$host = $_SERVER['HTTP_HOST'];//域名$path = '/admin/send/index';//异步推送到这个文件,在这个文件里面处理推送。$data = http_build_query($data);//$data = json_encode($data,JSON_UNESCAPED_UNICODE);$fp = fsockopen($host, 80, $error, $errstr, 1);$http = "POST $path HTTP/1.1\r\nHost: $host\r\nContent-type: application/x-www-form-urlencoded\r\nContent-Length: " . strlen($data) . "\r\nConnection:close\r\n\r\n$data\r\n\r\n";fwrite($fp, $http);//实现异步把下面注释掉,意思是不处理返回// $receive = '';// while (!feof($fp)) {// $receive .= fgets($fp, 128);// }// echo "
".$receive;//连接主动断开时,线上proxy层没有及时把请求发给上游fclose($fp);return json(['code' => 1, 'msg' => '推送完成!', 'url' => url('notive/send')]);

 2、异步处理页,实际上这里再一次使用fsockopen。

namespace app\admin\controller;
use think\facade\Request;
class Send
{public function index(){$data = input('post.');//这个是fscokopen推送过来的data。$value = db('wx_config')->where([ 'key' => 'SHOPWCHAT'])->value('value');$value = json_decode($value,true);$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$value['appid']."&secret=".$value['appsecret'];if (COOKIE('access_token')){$access_token=COOKIE('access_token');}else{$cOnt= json_decode($this->getToken($url));$access_token=$cont->access_token;setCOOKIE('access_token',$access_token,7200);}//获取access_token$all = $this->get_allopenid($access_token);//获取关注的用户,因为只能推送关注的用户。$openids = $all['data']['openid'];//关注用户的openIDforeach ($openids as $key => $value) {if (db('users')->where('openid',$value)->value('unsub') == '1'){unset($openids[$key]);}}$openids = array_values($openids);//这里是筛选没有退订的用户,并重新排序键值对。这些推送最好是可以退订的,不然用户举报可能会封号哦。我是根据用户回复“退订”关键词来标记的。这一步是有必要的。foreach ($openids as $key => $value) {$params = json_encode($this->json_tempalte($value,$data),JSON_UNESCAPED_UNICODE);$fp = fsockopen('api.weixin.qq.com', 80, $error, $errstr, 1);$http = "POST /cgi-bin/message/template/send?access_token={$access_token} HTTP/1.1\r\nHost: api.weixin.qq.com\r\nContent-type: application/x-www-form-urlencoded\r\nContent-Length: " . strlen($params) . "\r\nConnection:close\r\n\r\n$params\r\n\r\n";fwrite($fp, $http);fclose($fp);sleep(1);}//这里就是遍历推送到各个openID了、sleep(1)是为了防止推送过快出问题。return ture;}function getToken($url) {//这个方法是获取access_token$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko)");curl_setopt($ch, CURLOPT_ENCODING, "gzip");curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);$output = curl_exec($ch);curl_close($ch);return $output;}function get_allopenid($access_token,$next_openid = ''){//这个方法是获取所有关注的用户的$url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token={$access_token}&next_openid=".$next_openid;$ch = curl_init();curl_setopt($ch, CURLOPT_URL,$url);curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);$data = curl_exec($ch);$data = json_decode($data,true);if ($data["count"] == 10000){$newdata = $this->get_allopenid($access_token,$data["next_openid"]);$data["data"]["openid"] = array_merge_recursive($date["data"]["openid"], $newdata["data"]["openid"]);}return $data;}function json_tempalte($openid,$data,$template_id = 'DtlkLjhNf5p5P7kYorbm-6kop3zlSyct1wL70fuJ8ME'){//这里是组装模版消息的方法$template=array('touser'=>$openid,'template_id'=>$template_id,//这个是模版ID,获取方法自己看文档很详细。'url'=>$data['url'],'topcolor'=>"#7B68EE",'data'=>array('first'=>array('value'=>$data['first'],'color'=>"#000"),'keyword1'=>array('value'=>$data['keyword1'],'color'=>'#F70997'),'keyword2'=>array('value'=>$data['keyword2'],'color'=>'#248d24'),'keyword3'=>array('value'=>date("Y-m-d H:i:s"),'color'=>'#000'),'remark' =>array('value'=>$data['remark'],'color'=>'#1784e8'), ));return $template;}}

在网上找了很久都没有找到这样一个教程。


如果有啥问题可以留言,我还是挺活跃的。

 


推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
author-avatar
手机用户2502915601
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有