首先看微信官方的说法:

当用户主动发消息给公众号的时候(包括发送信息、点击自定义菜单、订阅事件、扫描二维码事件、支付成功事件、用户维权),

微信将会把消息数据推送给开发者,开发者在一段时间内(目前修改为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利用微信多客服消息推送取货二维码消息的更多相关文章

  1. php 微信客服信息推送失败 微信重复推送客服消息 40001 45047

    /*** * 微信客服发送信息 * 微信客服信息推送失败 微信重复推送客服消息 40001 45047 * 递归提交到微信 直到提交成功 * @param $openid * @param int $ ...

  2. java实现微信支付宝等多个支付平台合一的二维码支付(maven+spring springmvc mybatis框架)

    首先申明,本人实现微信支付宝等支付平台合多为一的二维码支付,并且实现有效时间内支付有效,本人采用的框架是spring springmvc mybatis 框架,maven管理.其实如果支付,不需要my ...

  3. 微信蓝牙设备开发教程之获取设备deviceid和二维码(3)

    文章转载地址  http://www.vxzsk.com/87.html  设备授权 调用 设备授权新接口 ,获取deviceid和二维码,然后利用获取到的deviceid更新设备属性(如mac地址, ...

  4. 微信开发之——Php批量生成带参数的二维码

    带参数的二维码对于渠道营销推广来说是很有用的,可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送,可喜的是微信开通了这个接口,那下面就来研究一下吧. 具体接口说明请参见,微信公众平 ...

  5. 解决Mac版微信小程序开发工具打开后无法显示二维码

    问题描述: 正常情况下,打开微信小程序开发工具后,首页提示扫描二维码进行登陆,但是如果不显示二维码,当然无法登陆. 解决方案: 无法显示二维码肯定是程序运行哪里出错了,我们直接点击桌面图标是无法排查错 ...

  6. 微信小程序H5预览页面框架(二维码不隐藏)

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  7. H5分享到微信好友朋友圈QQ好友QQ空间微博二维码

    这是分享按钮: <button onclick="call()">通用分享</button> <button onclick="call(' ...

  8. 利用websocket实现微信二维码码扫码支付

    由于业务需要引入微信扫码支付,故利用websocket来实现消息推送技术. 实现大致流程:首先客户端点击微信支付按钮,触发微信支付接口,同时微信支付响应成功参数后,连接websocket客户端,此刻利 ...

  9. Android P正式版即将到来:后台应用保活、消息推送的真正噩梦

    1.前言 对于广大Android开发者来说,Android O(即Android 8.0)还没玩热,Andriod P(即Andriod 9.0)又要来了.   下图上谷歌官方公布的Android P ...

随机推荐

  1. Avoid The Lakes

    Avoid The Lakes Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) To ...

  2. 每日一dp(2)——龟兔赛跑(hdu 2059)

    比較经典的动态规划的题目了 一般动态规划的想法都是先推断是否有最优子结构,无后效性.接着从状态转移入手,尽量细分状态(即给定N得到N+1),完了再递推计算 难点:转移方程,其一般也难在怎样描写叙述一个 ...

  3. 向PHP语言进发

    在做了几个月的.NET技术之后,我决定转去做PHP开发!人家都说,一言通,多言通!努力吧!

  4. css3动画之animate

    CSS3 动画属性 下面的表格列出了 @keyframes 规则和所有动画属性: 语法:div{animation: 动画名称 一个周期播放时间 速度曲线 延迟时间 下个周期是否逆向} @keyfra ...

  5. SVG-1

    <rect>矩形 <circle>圆 <ellipse>椭圆 <line>直线 <polyline>折线 <polygon>标签 ...

  6. Android 常用 adb 命令总结

    Android 常用 adb 命令总结 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb 命令熟记于心, 将会为 Android 测试带来很大的方便,其中很多命 ...

  7. Spring学习之切入点表达式

    链接地址:http://jinnianshilongnian.iteye.com/blog/1415606

  8. 在HTML中使用JavaScript需要注意的问题

    1. 通过<script>元素的src属性可以包含来自外部域的js文件,这一点与<img>元素一样,但这让<script>元素倍显强大的同时又受争议,访问外部域js ...

  9. Google TensorFlow深度学习笔记

    Google Deep Learning Notes Google 深度学习笔记 由于谷歌机器学习教程更新太慢,所以一边学习Deep Learning教程,经常总结是个好习惯,笔记目录奉上. Gith ...

  10. MySQL----基本数据类型

    1.数值型: tinyint:1字节 smallint:2字节 mediumint:3字节 int:4字节 bigint:8字节 float:4字节 double:8字节 decimal(m,c):m ...