项目微信公众号开发,需要做用户消息推送,记录下来以便日后使用

1,接上一篇文章,可以查看如何获取用户openid

  PHP 微信公众号开发 - 获取用户信息

2,添加模板消息

3,查看模板详情

  根据模板详情设置对应推送消息

4,代码实现

 <?php
// 字符编码
header("Content-Type:text/html; charset=utf-8"); // 微信接口类
class WeChat{
private static $appid;
private static $appsecret; function __construct(){
self::$appid = ''; // 开发者ID(AppID)
self::$appsecret = ''; // 开发者密码(AppSecret)
} // 微信授权地址
public static function getAuthorizeUrl($url){
$url_link = urlencode($url);
return "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . self::$appid . "&redirect_uri={$url_link}&response_type=code&scope=snsapi_base&state=1#wechat_redirect";
} // 获取TOKEN
public static function getToken(){
$urla = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . self::$appid . "&secret=" . self::$appsecret;
$outputa = self::curlGet($urla);
$result = json_decode($outputa, true);
return $result['access_token'];
} /**
* getUserInfo 获取用户信息
* @param string $code 微信授权code
* @param string $weiwei_token Token
* @return array
*/
public static function getUserInfo($code, $weiwei_token){
$access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . self::$appid . "&secret=" . self::$appsecret . "&code={$code}&grant_type=authorization_code";
$access_token_json = self::curlGet($access_token_url);
$access_token_array = json_decode($access_token_json, true);
$openid = $access_token_array['openid'];
$new_access_token = $weiwei_token; //全局access token获得用户基本信息
$userinfo_url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={$new_access_token}&openid={$openid}";
$userinfo_json = self::curlGet($userinfo_url);
$userinfo_array = json_decode($userinfo_json, true);
return $userinfo_array;
} /**
* pushMessage 发送自定义的模板消息
* @param array $data 模板数据
$data = [
'openid' => '', 用户openid
'url' => '', 跳转链接
'template_id' => '', 模板id
'data' => [ // 消息模板数据
'first' => ['value' => urlencode('黄旭辉'),'color' => "#743A3A"],
'keyword1' => ['value' => urlencode('男'),'color'=>'blue'],
'keyword2' => ['value' => urlencode('1993-10-23'),'color' => 'blue'],
'remark' => ['value' => urlencode('我的模板'),'color' => '#743A3A']
]
];
* @param string $topcolor 模板内容字体颜色,不填默认为黑色
* @return array
*/
public static function pushMessage($data = [],$topcolor = '#0000'){
$template = [
'touser' => $data['openid'],
'template_id' => $data['template_id'],
'url' => $data['url'],
'topcolor' => $topcolor,
'data' => $data['data']
];
$json_template = json_encode($template);
$url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" . self::getToken();
$result = self::curlPost($url, urldecode($json_template));
$resultData = json_decode($result, true);
return $resultData;
} /**
* addLog 日志记录
* @param string $log_content 日志内容
*/
public static function addLog($log_content = ''){
$data = "";
$data .= "DATE: [ " . date('Y-m-d H:i:s') . " ]\r\n";
$data .= "INFO: " . $log_content . "\r\n\r\n";
file_put_contents('/wechat.log', $data, FILE_APPEND);
} /**
* 发送get请求
* @param string $url 链接
* @return bool|mixed
*/
private static function curlGet($url){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
if(curl_errno($curl)){
return 'ERROR ' . curl_error($curl);
}
curl_close($curl);
return $output;
} /**
* 发送post请求
* @param string $url 链接
* @param string $data 数据
* @return bool|mixed
*/
private static function curlPost($url, $data = null){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
if(!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
} /**
* get_page_url 获取完整URL
* @return url
*/
function get_page_url($type = 0){
$pageURL = 'http';
if($_SERVER["HTTPS"] == 'on'){
$pageURL .= 's';
}
$pageURL .= '://';
if($type == 0){
$pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
}else{
$pageURL .= $_SERVER["SERVER_NAME"];
}
return $pageURL;
} // 获取用户openid // 微信接口类
$WeChat = new WeChat();
if(empty($_GET['code']) || !isset($_GET['code'])){
// 通过授权获取code
$url = get_page_url();
$authorize_url = $WeChat->getAuthorizeUrl($url);
header("Location:{$authorize_url}"); // 重定向浏览器
exit();
}else{
// 获取微信用户信息
$code = $_GET['code'];
$weiwei_token = $WeChat->getToken(); // 获取微信token
$user_info = $WeChat->getUserInfo($code, $weiwei_token);
$openid = $user_info['openid'];
# 公众号消息推送
$WeChat::pushMessage([
'openid' => $openid, // 用户openid
'access_token' => $weiwei_token,
'template_id' => "ONZapeZi5OzxHym7IaZw7q4eJHEV4L6lzdQrEIWBs60", // 填写你自己的消息模板ID
'data' => [ // 模板消息内容,根据模板详情进行设置
'first' => ['value' => urlencode("尊敬的某某某先生,您好,您本期还款已成功扣收。"),'color' => "#743A3A"],
'keyword1' => ['value' => urlencode("2476.00元"),'color'=>'blue'],
'keyword2' => ['value' => urlencode("13期"),'color'=>'blue'],
'keyword3' => ['value' => urlencode("15636.56元"),'color' => 'green'],
'keyword4' => ['value' => urlencode("6789.23元"),'color' => 'green'],
'remark' => ['value' => urlencode("更多贷款详情,请点击页面进行实时查询。"),'color' => '#743A3A']
],
'url_link' => 'https://www.cnblogs.com/' // 消息跳转链接
]);
}

PHP 微信公众号开发 - 消息推送的更多相关文章

  1. Java对接微信公众号模板消息推送

    内容有点多,请耐心! 最近公司的有这个业务需求,又很凑巧让我来完成: 首先想要对接,先要一个公众号,再就是开发文档了:https://developers.weixin.qq.com/doc/offi ...

  2. .net微信公众号开发——消息与事件

    作者:王先荣    本文介绍如何处理微信公众号开发中的消息与事件,包括:(1)消息(事件)概况:(2)验证消息的真实性:(3)解析消息:(4)被动回复消息:(5)发送其他消息.    开源项目地址:h ...

  3. 微信硬件平台(八) 4 ESP8266通过微信公众号给用户推送消息

    https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=自己申请微信公众号的TOKEN 输出结果:  由于aRDUINO串 ...

  4. ASP.NET 微信公众平台模板消息推送功能完整开发

    最近公众平台的用户提出了新需求,他们希望当收到新的邮件或者日程的时候,公众平台能主动推送一条提醒给用户.看了看平台提供的接口,似乎只有[模板消息]能尽量满足这一需求,但不得不说微信提供的实例太少,而且 ...

  5. 微信公众号实现无限制推送模板消息!可向指定openID群发

    微信认证的服务号才有推送模板消息接口所以本文需要在认证服务号的情况下学习 以上就是模板消息,只有文字和跳转链接,没有封面图.在服务号的后台添加功能插件-模板消息即可. 模板消息,都是在后台选择一个群发 ...

  6. C#微信公众号开发系列教程五(接收事件推送与消息排重)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  7. 微信公众号开发C#系列-7、消息管理-接收事件推送

    1.概述 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后,是允许 ...

  8. 转:C#微信公众号开发之接收事件推送与消息排重的方法

    本文实例讲述了C#微信公众号开发之接收事件推送与消息排重的方法.分享给大家供大家参考.具体分析如下: 微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这 ...

  9. C#微信公众号开发系列教程三(消息体签名及加解密)

    http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...

随机推荐

  1. ambassador 学习六 Module说明

    模块允许给与特定的mapping 或者整体添加特定的行为,方便进行系统的控制. 当前的module 定义主要是系统级别的 当前系统主要的配置 --- apiVersion: ambassador/v0 ...

  2. 什么是HBASE(三) HBase的压缩和编码

    在存储层面节省空间的处理上,Hbase提供了两种方案,一个是基于key的编码,一个是基于数据块(data block)的压缩.前者用于将key重复部分进行简单处理达到节约空间的目的,后者则是对数据块进 ...

  3. Makefile中进行宏定义-***

    实际上是gcc命令支持-D宏定义,相当于C中的全局#define: gcc -D name gcc -D name=definition Makefile中可以定义变量(和宏很像),但是是给make解 ...

  4. springMVC等小知识点记录。。。持续更新

    1.springMVC 项目根路径访问页面配置 <!-- 表示当访问主页时自动转发到index控制器 --> <mvc:view-controller path="/&qu ...

  5. 1027代码审计平台 3 Java maven

    使用成熟的构建工具对maven工程进行分析 官网:SCAN/Analyzing+with+SonarQube+Scanner+for+Maven 1.如下图修改settings.xml文件 1.1查看 ...

  6. 阿里云VPS(win系统)装ROS教程

    以下方法是VPS下的WIN系统下安装ROS的方法,LINUX暂时没有 VPS系统装2003或2008 ,建议2008 启动快,安全,但以下内容是在2003上测试的, 2003系统,2003设置开机自动 ...

  7. Oracle 取某100天的每一天的日期

    SELECT TO_DATE('2016-01-01', 'yyyy-MM-dd') + ROWNUM - 1 as daylist,TO_DATE('2016-01-01', 'yyyy-MM-dd ...

  8. Introduction to Spring Data MongoDB

    Introduction to Spring Data MongoDB I just announced the new Spring 5 modules in REST With Spring: & ...

  9. linux下python3离线加载nltk_data,不用nltk.download()

    在不能上网的服务器上把nltk_data关联到python3,已经安装anaconda3所以不需要安装nltk,环境是linux 首先没有nltk_data在使用nltk会报错 LookupError ...

  10. [Delphi] 设置线程区域语言防止乱码

    uses  Windows; 在工程文件中添加一句代码,如下: Application.Initialize; //添加以下一句解决外文系统乱码问题 SetThreadLocale(DWORD(Wor ...