因项目需要做推送服务。小程序推送太多限制。因此,改为服务号通知。

首先,公众号回调地址在另外的服务器上,获取不到。所以采用的思路是,获取全部用户的openid,存入数据库。(之后做定时,获取新增用户。)

项目主要涉及 消息回复。

当用户回复消息时,进入数据库获取unionid,再取公众号的openid,取到之后再进行推送。

实现步骤:

1.将小程序与公众号绑定(绑定后才可获取unionid),官方文档:小程序与公众号绑定获取unionid

2.通过微信公众号的AppId和AppSecret
获取微信公众号的access_token(7200秒有效)               这边需要自己做缓存
地址:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

//获取公众号access_token 2个小时过期public function getAccessToken(){$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=111&secret=111';$data = $this->httpRequest($url);$access_token = $data['access_token'];//存入缓存$mc = &load_cache('redis');$mc->save('access_token', $access_token, 7200);return $access_token;}

3.通过刚才获取到的access_token去获取所有用户的openId   官方文档:获取公众号用户列表
地址:https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID

(NEXT_OPENID为超出10000个取10001继续请求,这个会在每次请求后返回的json字符串中有)

4.将所有的openId全部放在一个新的数组中,然后for循环,循环次数为openId的数组的长度,循环请求每个用户的基本信息

地址:https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

(第一次,获取全部用户的openid。这边比较耗时,8000个用户,我花了2.5个小时。获取后删除代码,重写为定时代码)

5.定时获取新增用户

 //获取公众号全部用户的openidpublic function getPublicUserOpenid(){ini_set('max_execution_time','200');$mc = &load_cache('redis');$access_token =$mc->get('access_token');if (empty($access_token)){$access_token = $this->getAccessToken();}$url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=$access_token&next_openid=";$data = $this->httpRequest($url);//token失效if ($data['errcode']==40001){$this->getAccessToken();$this->getPublicUserOpenid();}$openidList = $data['data']['openid'];//返回的数据是无序的,只能做数组对比,取出差集,再保存到数据库。$result = $this->AppPublicUserModel->select('','','','','openid');foreach ($result as $item){$List[]=$item['openid'];}//取差集foreach ($openidList as $key => $item) {if (in_array($item, $List, true)) {unset($openidList[$key]);}}foreach ($openidList as $key=>$v){$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=$access_token&openid=$v&lang=zh_CN";$userData = $this->httpRequest($url);//两种情况1已关注和0未关注if ($userData['subscribe']==1){$saveData=['openid'=>$userData['openid'],'nickname'=>$userData['nickname'],'unionid'=>$userData['unionid'],'headimg'=>$userData['headimgurl'],];//保存$this->AppPublicUserModel->add($saveData);}}return $this->success('','同步成功');}

6.推送服务号消息。官方文档:公众号发送模版消息

//公众号消息推送public function pushMessages($fid,$name,$msg){//取openid$fData = $this->AppUserModel->get(array('id'=>$fid));$unionId = $fData['unionid'];$openid = $this->AppPublicUserModel->get(array('unionid'=>$unionId))['openid'];$mc = &load_cache('redis');$access_token =$mc->get('access_token');if (empty($access_token)){$access_token = $this->getAccessToken();}$url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$access_token ;$data = ['touser'=>$openid,'template_id'=>'ZK7ZfM3r02Iyv-xe4UoaBPt9FmjJ4jzC9k-cASM3M84','url' => '','miniprogram' => array('appid'=>'111','pagepath'=>'/pages/message'),'data' => array('first' => array('value' => '你有一条新的消息'),'keyword1' => array('value' => $name),'keyword2' => array('value' => date('Y-m-d H:i:s',time())),'keyword3' => array('value' => $msg),//'remark' => array('value' => '这是备注'),)];$result = $this->httpPostJson($url, urldecode(json_encode($data)));$returnData = json_decode($result[1],1);if ($returnData['errcode']==0){return $this->success('','发送模板消息成功');}else{return $this->fail($returnData['errcode'],'发送模板消息失败');}}

备注:以上内容参考以下地址,侵删

https://blog.csdn.net/qq_39687901/article/details/85243514

https://www.jianshu.com/p/5a388a5afac7

小程序用户操作后通过公众号(服务号)推送通知相关推荐

  1. php实现微信小程序推送,实现微信小程序模板消息不受限制、无限主动推送

    需求背景 基于微信的通知渠道,微信小程序为开发者提供了可以高效触达用户的模板消息能力,在用户本人与小程序页面有交互行为后触发,通过微信聊天列表中的服务通知可快捷进入查看消息,点击查看详情还能跳转到下发 ...

  2. android 程序运行不了,当应用程序在后台运行或不运行时,Android – 推送通知工作不正确...

    我使用Firebase Cloud Messaging发送推送通知. 这是我的FirebaseMessageService: public class FireBaseMessageService e ...

  3. 【微信小程序】1、SpringBoot整合WxJava开启消息推送

    接入微信小程序消息推送服务,可以3种方式选择其一: 1.开发者服务器接收消息推送 2.云函数接收消息推送 3.微信云托管服务接收消息推送 开发者服务器接收消息推送,开发者需要按照如下步骤完成: 1.填 ...

  4. 微信小程序java后端开发记录(三):模板消息推送

    ·模板消息推送 1.1推送参数dto: 按照文档逐层次封装请求参数. 这些参数 /*** @author hanyy* @Description: 微信小程序模板消息推送参数* @date 2019/ ...

  5. 关注微信公众号并接收服务端推送通知

    这是一篇写在公司内网confluence上的文章,今天打开博客发现好久没有更新了,偷个懒直接来个搬运. 1.应用场景 终端用户关注客户微信公众号后,在公众号上可以接收到服务端发来的关联设备的报警信息 ...

  6. 小程序内支付后,可以强制关注公众号吗

    使用微信支付已经成为我们日常消费时的习惯,给我们的生活带来很大的便利.现在大家出门都不怕忘带钱包,只要带上手机,电子钱包就如影相随. 尽管微信支付十分方便,但它有个功能却给商家带来便利的同时,却给用户 ...

  7. 小程序公测后,你可以关注这些

    微信小程序从对外发布两百个内测名额阶段 到现在公测阶段,网上关于小程序的资料文章更是一篇又一篇,包括爱范儿,虎嗅,36氪,知乎等等.对于正在创业及计划创业的人来说,无非是又一片蓝海. 80.90后的互 ...

  8. 用户在小程序操作后通过公众号(服务号)推送通知

    一.前言 用户在小程序进行了一个操作,操作结果不是立马返回的可能需要隔一段时间才能有处理结果,那么这时候需要让用户知道操作的结果,应该怎么办呢?总的来说有两种解决方案.一种是通过小程序模板消息,推送服 ...

  9. 小程序公众号共服务器,公众号和小程序用户互通,无需unionid解决方案

    目录前话 Hi~ o(_ ̄▽ ̄_)ブ, 我偷偷回来了,你还在吗? 最近在搞公众号和小程序的开发,需要进行公众号和小程序的用户互通.网上搜.问人,都说需要公众平台绑定公众号和小程序,拿到unionId才 ...

最新文章

  1. Python逻辑运算符:if and
  2. go语言渐入佳境[9]-doubleloop
  3. c# 中重载WndProc,实现重写“最小化”自定义功能的方法
  4. MD5计算,一个扩展类,哪里都能用
  5. deep learning入门学习
  6. 智慧交通day01-算法库03:cv.dnn
  7. win7下mysql读写分离_Windows环境下Mysql 5.7读写分离简单记录
  8. ChaiNext:市场短期内延续区间震荡
  9. Spring3开发实战 之 第四章:对JDBC和ORM的支持
  10. 我与阿里巴巴集团副总裁、阿里云智能数据库事业部总负责人在阿里云官网同框啦
  11. win10右键卡顿原因_win10右键新建卡顿怎么办
  12. iOS输入框搜索节流输入框输入拼音的问题 (防抖)
  13. 动态网页 —— 案例: 爬取qq邮箱
  14. python下载音乐代码_基于Python实现下载网易音乐代码实例
  15. 社交网络分析的 R 基础:(三)向量、矩阵与列表
  16. php简单的功能模块,php中mysql模块部分功能的简单封装
  17. go 服务接入短信验证码功能(对接阿里云平台)
  18. 微信公众号开发教程[018]-数据统计
  19. 抢拍网——项目开发感受
  20. S4/HANA批次管理——创建批次确定类以及对应特征

热门文章

  1. 拜托,别再问我数据库性能优化了!
  2. maven Cannot resolve
  3. 吐槽吐槽 苹果x手机4g信号网络问题
  4. 事务 | Spring Cloud 分布式事务管理(二)2pc/3pc
  5. win10 误删账户仍出现此账户登录但密码错误
  6. PL/SQL Developer常用命令快捷设置
  7. 数据分析技能点-双变量的相关分析
  8. arduino(10):adruino PLC工业控制之瞎想,不是那个专业的纯属YY的。
  9. LFTP连接FTPS
  10. java 读取pdf各级标题_Java那些事之pdf读取