Thinkphp利用微信多客服消息推送取货二维码消息
首先看微信官方的说法:
当用户主动发消息给公众号的时候(包括发送信息、点击自定义菜单、订阅事件、扫描二维码事件、支付成功事件、用户维权),
微信将会把消息数据推送给开发者,开发者在一段时间内(目前修改为48小时)可以调用客服消息接口,通过POST一个JSON数据
包来发送消息给普通用户,在48小时内不限制发送次数。
根据上面消息可以找到发消息的突破口【发送信息、点击自定义菜单、订阅事件、扫描二维码事件、支付成功事件、用户维权】这些事件
可以给公众号48小时的权限无限给触发的了以上事件的关注用户发送包括:文字,图片,新闻,视频,音乐,卡券消息。下面开始做开发:
【本次功能是给给用户推送购买成功后的取货二维码】
1、首先清楚再用户支付购买了餐点的,微信通知的notify_url方法处理完支付状态后在推送多客服消息,因为此时用户触发了【支付事件】
所以此时接口可用。调用send_qrcode_msg()方法发送二维码。
2、import("@.ORG.QRCode.qrlib");引入二维码生成类
生成指定内容的二维码图片png(此二维码包含取餐处理地址)
3、最推送图片前置处理,先来看微信官方的要求
发送图片消息数据包格式:
{
"touser":"OPENID",
"msgtype":"image",
"image":
{
"media_id":"MEDIA_ID"
}
}
很显然此时需要显示图片的是MEDIA_ID而不是图片链接,或者是html代码去显示二维码,换个思路在推送图片之前先拿到此时取餐二维码图片
放置在本地项目中那么来看官方文档上传图片素材接口,其中有临时素材这个比较合理
/***********
http请求方式: POST/FORM,需使用https
https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
调用示例(使用curl命令,用FORM表单方式上传一个多媒体文件):
curl -F media=@test.jpg "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"
***********/
在第二步上传二维码的时候一定记得图片在本地项目中存储,然后根据二维码路径上传临时素材,拿到MEDIA_ID,此时离成功已经不远了。
最后一步就是按照多客服的图片参数包格式组装数据,curl给微信ok大功告成!
<?php
class KfMsg{ public function send_qrcode_msg($access_token,$dataArr,$orderid){//发送订单二维码处理 $Msg_url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$access_token;//客服发消息 $id = D('XXX')->where(array('orderid'=>$orderid))->order('time asc')->getField('id');
$jump_url = "http://xxx/id/" . $id; import("@.ORG.QRCode.qrlib");//二维码
$qrcode_img = date('Ymd',time()).'_'.$id.'.png';
$png_temp_dir = './uploads/qrcode/';
$filename = $png_temp_dir.$qrcode_img;
if (!is_dir($png_temp_dir) && !mkdir($png_temp_dir, 0777, true)) { echo 3;$this->error('二维码保存目录不可写'); }
QRcode::png($jump_url, $filename, 'M', 4, 2); /* 上传临时二维码素材 */
$file_info=array(
'filename'=>$png_temp_dir, //图片相对于网站根目录的路径
'content-type'=>'image/png', //文件类型
); $sc_url="https://api.weixin.qq.com/cgi-bin/media/upload?access_token=".$access_token."&type=image";//临时素材保存3天
$real_path="{$_SERVER['DOCUMENT_ROOT']}/uploads/qrcode/{$qrcode_img}"; $data= array("media"=>"@{$real_path}",'form-data'=>$file_info); $media_id = $this->add_material($sc_url, $data); $Qrcode = '{"touser":"'.$dataArr["wecha_id"].'","msgtype":"image","image":{"media_id":"'.$media_id.'"}}'; $this->postCurl($Msg_url,$Qrcode); }
/* 上传临时素材 */
public function add_material($url,$data){
$ch1 = curl_init ();
$timeout = 5;
curl_setopt ( $ch1, CURLOPT_URL, $url );
curl_setopt ( $ch1, CURLOPT_POST, 1 );
curl_setopt ( $ch1, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch1, CURLOPT_CONNECTTIMEOUT, $timeout );
curl_setopt ( $ch1, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt ( $ch1, CURLOPT_SSL_VERIFYHOST, false );
curl_setopt ( $ch1, CURLOPT_POSTFIELDS, $data );
$result = curl_exec ( $ch1 );
curl_close ( $ch1 );
if(curl_errno()==0){
$result=json_decode($result,true);
return $result['media_id'];
}else {
return false;
}
}
} ?>
Thinkphp利用微信多客服消息推送取货二维码消息的更多相关文章
- php 微信客服信息推送失败 微信重复推送客服消息 40001 45047
/*** * 微信客服发送信息 * 微信客服信息推送失败 微信重复推送客服消息 40001 45047 * 递归提交到微信 直到提交成功 * @param $openid * @param int $ ...
- java实现微信支付宝等多个支付平台合一的二维码支付(maven+spring springmvc mybatis框架)
首先申明,本人实现微信支付宝等支付平台合多为一的二维码支付,并且实现有效时间内支付有效,本人采用的框架是spring springmvc mybatis 框架,maven管理.其实如果支付,不需要my ...
- 微信蓝牙设备开发教程之获取设备deviceid和二维码(3)
文章转载地址 http://www.vxzsk.com/87.html 设备授权 调用 设备授权新接口 ,获取deviceid和二维码,然后利用获取到的deviceid更新设备属性(如mac地址, ...
- 微信开发之——Php批量生成带参数的二维码
带参数的二维码对于渠道营销推广来说是很有用的,可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送,可喜的是微信开通了这个接口,那下面就来研究一下吧. 具体接口说明请参见,微信公众平 ...
- 解决Mac版微信小程序开发工具打开后无法显示二维码
问题描述: 正常情况下,打开微信小程序开发工具后,首页提示扫描二维码进行登陆,但是如果不显示二维码,当然无法登陆. 解决方案: 无法显示二维码肯定是程序运行哪里出错了,我们直接点击桌面图标是无法排查错 ...
- 微信小程序H5预览页面框架(二维码不隐藏)
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- H5分享到微信好友朋友圈QQ好友QQ空间微博二维码
这是分享按钮: <button onclick="call()">通用分享</button> <button onclick="call(' ...
- 利用websocket实现微信二维码码扫码支付
由于业务需要引入微信扫码支付,故利用websocket来实现消息推送技术. 实现大致流程:首先客户端点击微信支付按钮,触发微信支付接口,同时微信支付响应成功参数后,连接websocket客户端,此刻利 ...
- Android P正式版即将到来:后台应用保活、消息推送的真正噩梦
1.前言 对于广大Android开发者来说,Android O(即Android 8.0)还没玩热,Andriod P(即Andriod 9.0)又要来了. 下图上谷歌官方公布的Android P ...
随机推荐
- hadoop结构出现后format变态
14/07/10 18:50:47 FATAL conf.Configuration: error parsing conf file: com.sun.org ...
- mysql数据库的物理文件结构
mysql两种常用存储引擎myisam和innodb myisam不支持事务:innodb支持事务,当前作为插件来安装 myisam的数据库的物理文件结构为: .frm文件:与表相关的元数据信息都存放 ...
- Sublime 学习记录(一) Sublime 的快捷键
Ctrl + Shift + P : 打开命令面板 Ctrl + P : 搜索项目中的文件 Ctrl + W : 关闭当前打开的文件 Ctrl + G : 跳转到第几行 Ctrl + Shift + ...
- UVA 714 Copying Books
题意: 要抄N本书,编号为1,2,3...N, 每本书有1<=x<=10000000页, 把这些书分配给K个抄写员,要求分配给某个抄写员的那些书的编号必须是连续的.每个抄写员的速度是相同的 ...
- Android简单登录系统
很长时间没有写博客了,最近一直在写android for gis方面的项目.不过这篇博客就不写gis方面的了,今天刚刚做的一个简单的android登录系统.数据库是android自带的sqlite,s ...
- IIS应用程序池自动回收问题的有效解决办法
问题:Timer不能持续执行,如果长时间没有访问,就会被IIs自动回收.造成一些定时作业无法完成. 解决方式1:改用windows服务或是winform方式 解决方式2:在Application_En ...
- SQL Server 死锁检查
示例代码 select spid, blocked, status, hostname, program_name, hostprocess, cmd from sysprocesses -- kil ...
- Oracle Semaphore Management in UNIX Administration
Oracle UNIX/Linux Tips by Burleson Consulting Semaphores and Oracle 11g 信号量和数据库 Semaphores are data ...
- Oracle User Management FAQ翻译及学习笔记
转载 最近了解到AME 的东西,很迫切,先转载一篇 [@more@] Oracle User Management FAQ翻译及学习笔记 写在前面 本文主要是翻译的英文版的Oracle User Ma ...
- mysql学习(十)多表查询
多表查询时,要给表名起别名,给字段名其别名(当两个表含有重复字段时) select p.name, c.name, pid from products p, cats c;//得到的结果为笛卡尔乘积 ...