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 ...
随机推荐
- ROS Node/Topic/Message/Service的一些问题
1.Node http://blog.exbot.net/archives/1412 (摘自老王说ros) node干的什么活?callback queue里的活.这个callback queue里的 ...
- Power Strings(kmp妙解)
Power Strings Time Limit : 6000/3000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Tota ...
- android 实现自己定义状态栏通知(Status Notification)
在android项目的开发中,有时为了实现和用户更好的交互,在通知栏这一小小的旮旯里,我们通常须要将内容丰富起来,这个时候我们就须要去实现自己定义的通知栏,比如以下360或者网易的样式: 首先我们要了 ...
- nodejs实现本地上传图片并预览功能(express4.0+)
Express为:4.13.1 multyparty: 4.1.2 代码主要实现本地图片上传到nodejs服务器的文件下,通过取图片路径进行图片预览 写在前面:计划实现图片上传预览功能,但是本地图片 ...
- 成本卷积报错:CSTPSCEX.explode_sc_cost_flags():40:ORA-01476: 除数为 0
成本卷积请求:供应链成本累计 - 打印报表 运行后报一下错误: MSG-00000: Rollup ID = 236403MSG-00000: Before CSTPSCEX.supply_chain ...
- Python基础之 urllib模块urlopen()与urlretrieve()的使用方法详解。
Python urllib模块urlopen()与urlretrieve()的使用方法详解 1.urlopen()方法urllib.urlopen(url[, data[, proxies]]) ...
- BZOJ 3503: [Cqoi2014]和谐矩阵( 高斯消元 )
偶数个相邻, 以n*m个点为变量, 建立异或方程组然后高斯消元... O((n*m)^3)复杂度看起来好像有点大...但是压一下位的话就是O((n*m)^3 / 64), 常数小, 实际也跑得很快. ...
- php简单对象与数组的转换
function arrayToObject($e){ if( gettype($e)!='array' ) return; foreach($e as $k=>$v){ ...
- jquery easyui filebox 上传附件 + asp.net后台
form必须加这个属性enctype="multipart/form-data",否则后台获取不到文件 <script> function uploadFiles() ...
- Android_CodeWiki_03
1.发送不重复的通知(Notification) public static void sendNotification(Context context, String title, String m ...