php三方网站使用微信公众号推送文章

时间:2023-03-09 19:39:05
php三方网站使用微信公众号推送文章

//获取accesstoken 的方法
public function index(){
$appId = 'wxd0e50fe967dccccc';
$appSecret = 'd7f6be12ce41b60ss0f45054';//虚拟的,不要用
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appId."&secret=".$appSecret;
$ch = curl_init();//初始化curl
curl_setopt($ch, CURLOPT_URL,$url); //要访问的地址
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//跳过证书验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
$data = json_decode(curl_exec($ch));
if(curl_errno($ch)){
var_dump(curl_error($ch)); //若错误打印错误信息
}
var_dump($data); //打印信息 curl_close($ch);//关闭curl
}

获取accesstoken 的第二种方法,将accesstoken存在text文件中每隔2小时刷新一次

<?php
class TokenUtil {
//获取access_token并保存到token.txt文件中
public static function build_access_token(){
$ch = curl_init(); //初始化一个CURL对象
curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx2e9f8435ebdb2856&secret=288db114f02b2b5cdc249ca75a4bf1cc");//设置你所需要抓取的URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置curl参数,要求结果是否输出到屏幕上,为true的时候是不返回到网页中,假设上面的0换成1的话,那么接下来的$data就需要echo一下。
$data = json_decode(curl_exec($ch));
if($data->access_token){
$token_file = fopen("token.txt","w") or die("Unable to open file!");//打开token.txt文件,没有会新建
fwrite($token_file,$data->access_token);//重写tken.txt全部内容
fclose($token_file);//关闭文件流
}else{
echo $data->errmsg;
}
curl_close($ch);
} //设置定时器,每两小时执行一次build_access_token()函数获取一次access_token
public static function set_interval(){
ignore_user_abort();//关闭浏览器仍然执行
set_time_limit(0);//让程序一直执行下去
$interval = 7200;//每隔一定时间运行
do{
build_access_token();
sleep($interval);//等待时间,进行下一次操作。
}while(true);
} //读取token
public static function read_token(){
$token_file = fopen("token.txt", "r") or die("Unable to open file!");
$rs = fgets($token_file);
fclose($token_file);
return $rs;
}
}
?>

当然ACCESS_TOKEN是会过期的
自己需要整合这个api自动获取
我们学习过程中做测试可以直接获取粘贴上去。
当然调用这个接口需要配置IP白名单
如果获取过程中出现一串英文,里面有IP地址,就说明你还没配置IP白名单
你需要进入公众号后台安全中心-IP白名单-粘贴提示的IP地址即可

如果你要给指定的openID群发模板消息
例如你公司做教育培训服务的
有3个学生报了你们公司的某课程培训班
你需要在上课前15分钟主动向每个学生的微信推送模板消息通知上课
那么这三个学生需要关注你的服务号
你还要获取到这三个学生的openID
然后存入数组中,遍历数组发送即可。

获取openID的方法
1、配置回调域名
进入公众号,接口权限,找到网页服务,网页获取用户基本信息

php三方网站使用微信公众号推送文章

进去修改你的域名即可

php三方网站使用微信公众号推送文章

新建oauth.php

<?php
//获取微信access_token
function getaccess_token(){
$code = $_GET['code'];
$appid = '自己的appid';
$appsecret = '自己的appsecret';
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&secret={$appsecret}&code={$code}&grant_type=authorization_code";
$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);
curl_close($ch);
echo $data;
}
getaccess_token();

配置用户要访问的网页
https://open.weixin.qq.com/co...

REDIRECT_URI是回调链接
就是上面的oauth.php的地址
例如你的域名是
www.baidu.com
你把oauth.php上传到根目录
那么URL转码的回调链接就是
http://www.baidu.com/oauth.php

回调链接需要URL转码
给大家提供一个转码工具

php三方网站使用微信公众号推送文章

http://tool.oschina.net/encod...

最终的回调链接是
http%3A%2F%2Fwww.baidu.com%2Foauth.php

例如的你APPID是:wx66666666666666
整个用户要访问的网页就是
https://open.weixin.qq.com/co...://www.baidu.com/oauth.php&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

用户访问的网页也需要URL转码
最终的网址是:
https%3A%2F%2Fopen.weixin.qq.com%2Fconnect%2Foauth2%2Fauthorize%3Fappid%3Dwx66666666666666%26redirect_uri%3Dhttp%3A%2F%2Fwww.baidu.com%2Foauth.php%26response_type%3Dcode%26scope%3DSCOPE%26state%3DSTATE%23wechat_redirect

然后用微信访问上面的最终的网址,就会返回一串JSON数据,里面有openid
要想获得3个学生的openid那么就要这三个学生点进去,获取发给你

下面就是模板消息推送给指定的openid的代码
我就以这三个学生的openid为例

<?php
$ACCESS_TOKEN = "替换你的ACCESS_TOKEN";//ACCESS_TOKEN
//openid数组
$touser = [
'ouD7BuHpIKRXPIz7pdrwI9IwDRCU',
'ouD7BuI36wSUZgteyiydmDrldQLU',
'ouD7BuLejq7R4Vbuyh41bH778cg0'];
//模板消息请求URL
$url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" . $ACCESS_TOKEN; //遍历发送微信消息
foreach ($touser as $value) {
$data = getDataArray($value);
$json_data = json_encode($data);//转化成json数组让微信可以接收
$res = https_request($url, urldecode($json_data));//请求开始
$res = json_decode($res, true);
if ($res['errcode'] == 0 && $res['errcode'] == "ok") {
echo "发送成功!<br/>";
}
} //获取发送数据数组
function getDataArray($value)
{
$data = array(
'touser' => $value, //要发送给用户的openid
'template_id' => "mfopDNUlvoBGGsPLB-d_nrfL8Je92xnTq5vk5ZBxL-w",//改成自己的模板id,在微信后台模板消息里查看
'url' => "http://mp.weixin.qq.com/s/8UWPqHVa8PReWZp-No0ebA", //自己网站链接url
'data' => array(
'first' => array(
'value' => "亲爱的同学,您有考试提醒,请查阅。",
'color' => "#000"
),
'keyword1' => array(
'value' => "2017下半年教师资格证面试",
'color' => "#f00"
),
'keyword2' => array(
'value' => "2018-1-6",
'color' => "#173177"
),
'keyword3' => array(
'value' => "请看您的准考证",
'color' => "#3d3d3d"
),
'keyword4' => array(
'value' => "教师资格证试讲",
'color' => "#3d3d3d"
),
'keyword5' => array(
'value' => "答辩,选题,结构化",
'color' => "#3d3d3d"
),
'remark' => array(
'value' => "\n现在是打印准考证时间,请您在考试前打印准考证,戳进来可以查看详情>>>",
'color' => "#3d3d3d"
),
)
);
return $data;
} //curl请求函数,微信都是通过该函数请求
function https_request($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;
} ?>

新建test.php
拷贝代码
修改你的
ACCESS_TOKEN
修改你的学生的3个openid
修改你的模板ID
模板ID是什么?
就是你要推送的那个卡片的模板
例如支付成功模板,上课通知模板,发货模板....

php三方网站使用微信公众号推送文章