1. 在控制器或者model里面调用model里下面这个方法

//到账提醒
   public function filmquantity($cardid,$mvnum){
        try {
            $mMsg=new MmsgModel();
            $ret=$mMsg->accountnotice($cardid,$mvnum);

if ($ret){//生成成功
                //调用后台发送通知
                GetData2(Constants::serverHTTP."admin/SendWxTplMsg?id=".$ret);
            }

response($ret, Constants::RESPONESE_SUCCESS, '');
        } catch (Exception $e) {
            response_catch($e);
        }

}

2. 这个方法调用了MmsgModel里的accountnotice方法(这一步在准备数据,然后调用了wxMsg公共方法,在functions.php)

//到账提醒
    public function accountnotice($cardid,$mvnum){
        $res=M('acard')->field('fdcNick')->where(['ID'=>$cardid])->select();
        if($res) {
            $data = [
                'key1' => '您好!您领取的的电影票已到账!',//标题
                'key2' => $res[0]['fdcNick'],//订单号
                'key3' => $mvnum . '张',//订单类型
                'key4' => date('Y-m-d H:i:s'),//订单说明
                'key5' => '请点击进入预约界面!当前电影票需预约后才可观看!',//备注
            ];
        }
        //模版消息确认url 需要全写 http://yc.wzjo2o.com

$url="http://yc.wzjo2o.com/index/goto?url=".urlencode('mine/gift?shopID=all');
         $ret =wxMsg(1102,$cardid,$data,$url);
         return $ret;

}

3. wxMsg公共方法先从数据库取出模板(这个是对应微信上的格式[写法在5]手动添加到数据库的), 然后把模板里面固定的字替换成刚刚上方准备的数据. 然后回到最外面的(model里的 filmquantity方法 )方法调用GetData2公共方法(写法在下方)去调用后台发送消息模板.

/*
 *  消息模板
 */
function wxMsg($type,$cardid,$keys,$url){
    $data=M('aformat')->where('id='.$type)->find();        //取出模板
    if($data){
        $format=$data['fdcFormat'];
        //标题&订单号&订单类型&订单说明&备注
        //电影票发放确认消息
        if($type==1101) {
            $format = str_replace('[标题]', $keys['key1'], $format);
            $format = str_replace('[订单号]', $keys['key2'], $format);
            $format = str_replace('[订单类型]', $keys['key3'], $format);
            $format = str_replace('[订单说明]', $keys['key4'], $format);
            $format = str_replace('[备注]', $keys['key5'], $format);
        }
        //标题&账户名&数量&时间&备注
        //电影票到账确认消息
        else if($type==1102) {
            $format = str_replace('[标题]', $keys['key1'], $format);
            $format = str_replace('[账户名]', $keys['key2'], $format);
            $format = str_replace('[数量]', $keys['key3'], $format);
            $format = str_replace('[时间]', $keys['key4'], $format);
            $format = str_replace('[备注]', $keys['key5'], $format);
        }
        else if($type==1103) {
            $format = str_replace('[标题]', $keys['key1'], $format);
            $format = str_replace('[消费项目]', $keys['key2'], $format);
            $format = str_replace('[消费时间]', $keys['key3'], $format);
            $format = str_replace('[备注]', $keys['key4'], $format);
        }
        else if($type==1104) {
            $format = str_replace('[标题]', $keys['key1'], $format);
            $format = str_replace('[活动]', $keys['key2'], $format);
            $format = str_replace('[奖品]', $keys['key3'], $format);
            $format = str_replace('[时间]', $keys['key4'], $format);
            $format = str_replace('[备注]', $keys['key5'], $format);
        }
        else if($type==1105) {
            $format = str_replace('[标题]', $keys['key1'], $format);
            $format = str_replace('[到账时间]', $keys['key2'], $format);
            $format = str_replace('[到账金额]', $keys['key3'], $format);
            $format = str_replace('[收益产品]', $keys['key4'], $format);
            $format = str_replace('[备注]', $keys['key5'], $format);
        }
        else if ($type==101) {
            $format = str_replace('[金额]', $keys['key1'], $format);
            $format = str_replace('[时间]', date('y-m-d H:i:s', time()), $format);
            // $format = str_replace('[佣金类型]', $keys['key2'], $format);
            $format = str_replace('[备注]', $keys['key2'], $format);
        }else if ($type==102){    // 邀请注册成功
            $format = str_replace('[会员昵称]', $keys['key1'], $format);
            $format = str_replace('[会员幸运号]', $keys['key2'], $format);
            $format = str_replace('[时间]', date('y-m-d H:i:s', time()), $format);
        }else if ($type==103){    //收益提醒
            $format = str_replace('[标题]', $keys['first'], $format);
            $format = str_replace('[收益类型]', $keys['key1'], $format);
            $format = str_replace('[收益时间]', date('y-m-d H:i:s', time()), $format);
        }else if ($type==104){    //拼团成功
            $format = str_replace('[标题]', $keys['key1'], $format);
            $format = str_replace('[名称]', $keys['key2'], $format);
            $format = str_replace('[价格]', $keys['key3'], $format);
            $format = str_replace('[人数]', $keys['key4'], $format);
            $format = str_replace('[备注]', $keys['key5'], $format);
        }else if ($type==105){    //订单状态变更
            $format = str_replace('[标题]', $keys['key1'], $format);
            $format = str_replace('[订单编号]', $keys['key2'], $format);
            $format = str_replace('[订单状态]', $keys['key3'], $format);
            $format = str_replace('[备注]', $keys['key4'], $format);
        }else if ($type==106){    //兑换券使用通知
            $format = str_replace('[优惠标题]', '优惠标题', $format);
            $format = str_replace('[名称]', $keys['key1'], $format);
            $format = str_replace('[编号]', $keys['key2'], $format);
            $format = str_replace('[数量]', '1张', $format);
            $format = str_replace('[备注]', $keys['key3'], $format);
        }else{
            throw new Exception('模版消息设置出错!', 0 );
        }

$ins=[
            'fdbWx'=>1,
            'fdlFormatID'=>$type,
            'fdcTplID'=>$data['fdcTplID'],
            'fdiType'=>$data['fdiType'],
            'fdcTitle'=>$data['fdcName'],
            'fdlCardID'=>$cardid,
            'fdtMsg'=>$format,
            'fdcUrl'=>$url,
            'created_at'=>date('Y-m-d H:i:s')
        ];
        $ret=M('mmsgdetail')->add($ins);
        return $ret;
    }else{
        throw new Exception('模版消息设置出错!', 0 );
    }

}

4. GetData2公共方法的写法

function GetData2($url){
    $ch = curl_init($url);// 初始化一个 cURL 对象

curl_setopt($ch, CURLOPT_RETURNTRANSFER,1) ;
    curl_setopt($ch, CURLOPT_TIMEOUT,1) ; //设置为1 异步执行
    curl_setopt ( $ch, CURLOPT_HEADER, 0);    //设置请求选项

curl_setopt($ch, CURLOPT_BINARYTRANSFER, true) ;//在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回
    $output = curl_exec($ch);//执行Curl会话获取相关回复
    curl_close($ch);//释放Curl 句柄, 关闭Cur会话
    if (empty($output)) { return ;}
    $result = json_decode($output,true);
    return $result;

}

5.GetData2(Constants::serverHTTP."admin/SendWxTplMsg?id=".$ret);         //通过GetData2这个方法可调用后台的admin控制器里SendWxTplMsg这个方法,

//调用api发送消息
    public function SendWxTplMsgAction()
    {
        $get=I('get.');
        $id=$get['id'];
        $msg=new AdminModel();

$interval=3;//秒钟 
        $ret=true;
        while($ret){
            $ret=$msg->SendWxTplMsg($id); 
            $id=null;                                                     //为了把以前没发的也发出去
            if ($ret==false) break;
            sleep($interval);
        };
        response($ret, Constants::ERROR_CODE, '列表数据');

}

6. 在这个model里面调用微信插件发送模板消息

public function SendWxTplMsg($id = "")
    {
        try {
            
            $where = [
                'fdbWx' => 1,
                'fdiSend' => 0,
            ];
            if ($id) {
                $where['ID'] = $id;
            }
            sleep(8);       //等待8秒,不然数据没建好
            $data = M('mmsgdetail')->where($where)->field(['ID', 'fdlCardID', 'fdtMsg', 'fdcTplID', 'fdcUrl'])->find();

if ($data) {
                M('mmsgdetail')->where(['ID' => $data['ID']])->save(['fdiSend' => 1]);
           $res = wechat()->tplMsg($data['fdlCardID'], json_decode($data['fdtMsg'], true), $data['fdcTplID'], $data['fdcUrl']);            //在这里调用微信插件发送模板消息
                if ($res['errmsg'] != 'ok') {
                    M('mmsgdetail')->where(['ID' => $data['ID']])->save(['fdiSend' => 2, 'updated_at' => date('Y-m-d H:i:s')]);
                }
                $this->MmsgtoBase($data['ID']);
                return true;
            }else{
                return false;
            }

} catch (Exception $e) {
            return true;
            //发送有问题
            M('mmsgdetail')->where(['ID' => $data['ID']])->save(['fdiSend' => 3, 'updated_at' => date('Y-m-d H:i:s')]);
        }

}

7. 必须在微信上找微信一个模板消息, 然后在后台对应他才有效 , 先登录公众号 -> 功能 ->模板消息 ->从模板库里面用搜索找 -> 找到合适后点添加 ->然后手动添加到下面这张表

建表:

Schema::create('aformat', function (Blueprint $table) {
        $table->BigInteger('ID',true,false)->unique('aformat_PK');
        $table->bigInteger('fdiType')->comment('类型')->default(0);
        $table->bigInteger('fdbWx')->comment('0:平台自身消息  1:微信消息模板')->default(0);
        $table->string('fdcName',100)->comment('微信模板消息名称(对应微信标题)')->nullable();
        $table->string('fdcVar',255)->comment('微信需要替换的内容')->nullable();
        $table->string('fdcFormat',255)->comment('替换模板')->nullable();
        $table->string('fdcTplID',255)->comment('微信消息模板ID')->nullable();
        $table->string('fdcWxNo',20)->comment('微信消息模板编号')->nullable();
        $table->string('fdcWxMsg',200)->comment('微信消息模板详细内容')->nullable();
        $table->timestamps();

});

Schema::create('mMsgDetail', function (Blueprint $table) {
            $table->BigInteger('ID',true,false)->unique('mMsgDetail_PK');
            $table->boolean('fdbWx')->comment('是否为微信消息')->default(false); 
            $table->string('fdcTplID',255)->comment('模版ID')->nullable(); 
            $table->integer('fdiType')->comment('消息类型')->default(0);
            $table->string('fdlCardID',255)->comment('用户,0、系统消息')->index('mMsgDetail_idx')->nullable(); 
            $table->string('fdcTitle',255)->comment('消息标题')->nullable(); 
            $table->mediumText('fdtMsg')->comment('系统消息')->nullable(); 
            $table->integer('fdiSend')->comment('消息类型0:未处理 1:发送成功 2:发送失败')->default(0);
            $table->boolean('fdbRead')->comment('是否已读')->default(false); 
            $table->bigInteger('fdlFormatID')->comment('推广设置ID')->default(0);  
            $table->bigInteger('fdlSrcID')->comment('srcid')->default(0); 
            $table->string('fdcUrl',255)->comment('连接url')->nullable(); 
            $table->timestamps();
        });

发模板消息( 自己项目 )相关推荐

  1. 微信小程序 发送模板消息的功能实现

    背景 - 小程序开发的过程中,绝大多数会满足微信支付 - 那么,作为友好交互的体现,自然就会考虑到支付后的消息通知咯 - 所以,我的小程序项目也要求完成这个效果,so.分享一下自己的实现步骤,以方便道 ...

  2. 公众号(服务号)模板消息(个人通知)开发方案

    公众号消息通知 微信公众号开发文档 公众号是以微信用户的一个联系人形式存在的,消息会话是公众号与用户交互的基础.目前公众号内主要有这样几类消息服务的类型,分别用于不同的场景. 1)群发消息:公众号可以 ...

  3. 微信小程序系列--之模板消息错误提示: errcode: 41028, errmsg: invalid form id hint:如何解决...

    本人从事互联网项目java开发五年,会java,,python,nodejs,前端,爬虫等技术,对发*项目,营销活动,微信业务(公共号,支付,小程序,第三开放平台)很精通.本人也正在努力去实现一套微信 ...

  4. 公众号 接收规则 消息_微信公众平台 发送模板消息(Java接口开发)

    前言:最近一直再弄微信扫码推送图文消息和模板消息发送,感觉学习到了不少东西.今天先总结一下微信公众平台模板消息的发送.因为这个自己弄了很久,开始很多地方不明白,所以今天好好总结一下. 微信公众平台技术 ...

  5. java 模板接口开发_微信公众平台 发送模板消息(Java接口开发)

    前言:最近一直再弄微信扫码推送图文消息和模板消息发送,感觉学习到了不少东西.今天先总结一下微信公众平台模板消息的发送.因为这个自己弄了很久,开始很多地方不明白,所以今天好好总结一下. 微信公众平台技术 ...

  6. 微信小程序模板消息群发解决思路

    基于微信的通知渠道,微信为开发者提供了可以高效触达用户的模板消息能力,以便实现服务的闭环并提供更佳的体验.(微信6.5.2及以上版本支持模板功能.低于该版本将无法收到模板消息.) 模板推送位置:服务通 ...

  7. 微信公众号开发 [04] 模板消息功能的开发

    1.模板消息的概况 模板消息的定位是用户触发后的通知消息,不允许在用户没做任何操作或未经用户同意接收的前提下,主动下发消息给用户.目前在特殊情况下允许主动下发的消息只有故障类和灾害警示警告类通知,除此 ...

  8. php怎么实现发送给指定用户,微信小程序 实现模板消息群发、发送给指定用户...

    1. 需求 最近在做一款拼课类小程序,大概需求就是分享课程页面给好友,好友参与达到一定数量后则拼课成功. 好友参与后会给分享者发送一条模板消息 参与人数满足后(拼课成功)会给分享者发送一条模板消息 管 ...

  9. asp群发微信公众号模板消息代码asp写的

    asp群发微信公众号模板消息代码asp写的,主要用于对已经入库的会员群发模板消息 <% '=群发模板信息=转载请保留作者信息:18611436777======== If Request(&qu ...

最新文章

  1. 用js 判断datagrid 中的 checkbox 是否被选中
  2. opencv-车牌区域提取
  3. Mybaits 运行原理流程图
  4. matlab小技巧与verilog小技巧
  5. Java单例设计模式(实现Java的一个类只有一个对象)
  6. 字节跳动花50亿买了个什么?
  7. pandas concat_pandas合并几百个csv只需要一分钟?(含代码,拿去即可用)
  8. string index out of range_Java 12 骚操作, String居然还能这样玩!
  9. 易优Eyoucms企业建站系统 1.4.2
  10. linux服务器和客户端配置,Linux基础教程:YUM服务端与客户端配置步骤
  11. TikTok 已经成为影响力营销的新战场
  12. Python | Path 让文件路径提取变得简单(含代码)
  13. 英语数字听力学习软件操作
  14. 游程编码run length code
  15. 卡尔曼滤波 KF | 扩展卡尔曼滤波 EKF (思路流程和计算公式)
  16. (个人笔记)英语语法之动词时态
  17. 数据结构——图的基本操作
  18. 第一章 行列式 第六节 行列式按行(列)展开
  19. 如何判断 Oracle RAC 中的 Master 主节点
  20. CS1.6 网络参数 设置

热门文章

  1. HDU-1172 猜数字
  2. matlab 支点纵波,ABAQUS粘弹性边界及地震荷载施加的简单实现(Matlab生成input文件)...
  3. Creo Simulat 4.0有限元分析视频教程 料材 结构 网格 装配 散热分析
  4. csgo开箱盲盒支付接口如何申请?
  5. practically
  6. 使用树莓派摄像头做一个监控小车
  7. 教你如何用一行代码获取免费的QQ气泡框
  8. 揭秘:宜信科技中心如何支持公司史上最大规模全员远程办公|下篇
  9. 40岁失业了,如何调整自己心态?
  10. Ubuntu相关简易操作汇总(待续)