场景: 微信小程序一键群发模板消息(针对所有使用过小程序的用户),发送消息提醒用户,进入指定页面。

实现步骤:

利用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

 


表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id

data

Object

 


模板内容,不填则下发空模板。具体格式请参考示例。

emphasis_keyword

string

 


模板需要放大的关键词,不填则默认无放大