zoukankan      html  css  js  c++  java
  • 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;
                }
            }
    }
    
    ?>
    一个人静静坐在电脑面前写代码的感觉,那是什么感觉?那是武林高手闭关修炼的感觉。
  • 相关阅读:
    vue滑块拖拽校验
    vue和原生自动聚焦
    vue实现bar左右拖拽
    fastclick插件使用
    三大家族易忘点和案例
    移动端调试工具chrome+devtools
    restful 与 webapi 详解
    .NET Core 中依赖注入框架详解 Autofac
    .NET Core 对象( Transient、Scope、Singleton )生命周期详解 (对象创建以及释放)
    C# 通过DataSet 获取SQL 存储过程返回的多个结果集(tables)
  • 原文地址:https://www.cnblogs.com/bieanju/p/5806553.html
Copyright © 2011-2022 走看看