场景: 微信小程序一键群发模板消息(针对所有使用过小程序的用户),发送消息提醒用户,进入指定页面。
实现步骤:
利用form表单的按钮收集用户的formId存入数据库(如果当前没有formId,就直接存,如果有formId,就拼接之前的formId-用逗号分割区分),发送模板消息的时候从数据库取出formId 字段,然后截取第一个formId(它是一次性的,不可重复使用)去发送,使用完删除该条formId,再存入数据库。
实现代码
index.wxml
<form bindsubmit="formSubmit" report-submit="true">
<view catchtap="send_mm">群发服务通知</view>
<button formType="submit" bindtap="submitTo">发送</button>
</form>
index.js
//提交formId保存到数据库
formSubmit(e) {
let data = {
openid: wx.getStorageSync("openid"),
formId: e.detail.formId
};
util.request('http://localhost/saveFormid.php', 'post', data, '', (res) => {
console.log(res)
});
},
//群发
send_mm(){
var that = this;
util.request('http://localhost/send_mm.php', 'post', '', '', function (res) {
res = res.data;
if (res.code == 0) {
wx.showToast({
title: '发送成功!',
})
} else {
wx.showToast({
title: '发送失败',
icon: 'none',
duration: 2000
})
}
})
},
php. 接口1 saveFormid.php (formId保存到数据库 )
<?php
header("Content-Type:text/html;charset=utf8");
header("Access-Control-Allow-Origin: *"); //解决跨域
header('Access-Control-Allow-Methods:POST');// 响应类型
header('Access-Control-Allow-Headers:*'); // 响应头设置
$link=mysql_connect("localhost","root","root");
mysql_select_db("chat", $link); //选择数据库
mysql_query("SET NAMES utf8");//解决中文乱码问题
$openid = $_POST['openid'];
$formId = $_POST['formId'];
$q = "SELECT * FROM user"; //SQL查询语句 SELECT * FROM 表名
$rs = mysql_query($q); //获取数据集
if(!$rs){die("数据库没有数据!");}
//循环读取数据并存入数组对象
$dlogs;$i=1;
while($row=mysql_fetch_array($rs))
{
$result = @mysql_query($strsql);
if($row["openid"]==$openid){
if($row["formId"]!=""){
$ab =$row["formId"].','.$formId;
}else{
$ab =$formId;
}
//修改数据库字段
mysql_query("UPDATE user SET formId = '$ab'
WHERE openid = '$openid'");
echo $ab;
}
}
?>
接口2:send_mm.php 群发模板消息 (发送服务通知然后删除废弃的formId)
<?php
header("Content-Type:text/html;charset=utf8");
header("Access-Control-Allow-Origin: *"); //解决跨域
header('Access-Control-Allow-Methods:POST');// 响应类型
header('Access-Control-Allow-Headers:*'); // 响应头设置
$link=mysql_connect("localhost","root","root");
mysql_select_db("chat", $link); //选择数据库
mysql_query("SET NAMES utf8");//解决中文乱码问题
$appid='wx7eda2944d33f85e4';//填你的appid
$appsecret='ebbbac89078e013d6afcd9d7e94dc66c';//填你的appsecret
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
$access_token = file_get_contents($url);
$access_token = json_decode($access_token,true)['access_token'];
$keyword=array(
"keyword1"=>array(
"value"=>'消息提醒',
"color"=>"#4a4a4a"
),
"keyword2"=>array(
"value"=>'您有接收到新消息,点击查看详情',
"color"=>"#9b9b9b"
)
);
$q = "SELECT * FROM user"; //SQL查询语句 SELECT * FROM 表名
$rs = mysql_query($q); //获取数据集
if(!$rs){die("数据库没有数据!");}
//循环读取数据并存入数组对象
$dlogs;$i=0;$str_f;
while($row=mysql_fetch_array($rs))
{
if($row['formId']!=''&&$row['formId']!='1'){
$str_formId =$row['formId'];
$arr_formId =explode(',', $str_formId);
$openid =$row['openid'];
if(strpos($str_formId,",")){
$str_f =array_shift($arr_formId);
$str_formId =implode(",", $arr_formId);
mysql_query("UPDATE user SET formId = '$str_formId' WHERE openid = '$openid'");
}else{
$formId_no ='';
$str_f =$row['formId'];
mysql_query("UPDATE user SET formId = '$formId_no' WHERE openid = '$openid'");
}
//参数说明见文章结尾
$arr = array('touser'=>$row['openid'],'page'=>'pages/index/index','template_id'=>'nJmtuHQTmkvWXxTZERwAHhsUlWXWmKcJmJIDMWNhn2I','form_id'=>$str_f,'data'=>$keyword);
$_data=curl_file_post_contents('https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token='.$access_token,json_encode($arr));
echo urldecode(json_encode($_data));
if($_data['errcode']==0){
echo 1;
}
}
}
//POST请求
function curl_file_post_contents($durl, $post_data){
// header传送格式
$headers = array();
//初始化
$curl = curl_init();
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, $durl);
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, false);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
//设置post方式提交
curl_setopt($curl, CURLOPT_POST, true);
// 设置post请求参数
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
// 添加头信息
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
// CURLINFO_HEADER_OUT选项可以拿到请求头信息
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
// 不验证SSL
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
//执行命令
$data = curl_exec($curl);
// 打印请求头信息
// echo curl_getinfo($curl, CURLINFO_HEADER_OUT);
//关闭URL请求
curl_close($curl);
//显示获得的数据
return $data;
}
?>
发送模板消息参数说明:
请求参数
属性 | 类型 | 默认值 | 必填 | 说明 |
access_token | string | | 是 | |
touser | string | | 是 | 接收者(用户)的 openid |
template_id | string | | 是 | 所需下发的模板消息的id |
page | string | | 否 | 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。 |
form_id | string | | 是 | |
data | Object | | 否 | 模板内容,不填则下发空模板。具体格式请参考示例。 |
emphasis_keyword | string | | 否 | 模板需要放大的关键词,不填则默认无放大 |