发模板消息( 自己项目 )

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();
        });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值