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