小程序发送客服消息,php后端接口

小程序API里面关于服务端发送消息有四种:

           1:发送客服消息:顾名思义就是小程序端触发这个方法就会跳到客服对话的页面

           2:发送模板消息:前端收集openid,后端出发统一给收集到的openid的用户发送模板消息

           3:发送统一服务消息:下篇文章介绍

           4:发送动态消息:没用到过不好妄自介绍

 

今天我们说发送客服消息:

接口文档链接:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/customer-message/customerServiceMessage.send.html

1:获取access_token

/**
     * 获取access_token
     */
    private function getAccessToken()
    {
        $appid = config("weChat.appId");
        $assert = config("weChat.assert");
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$assert}";
        $data = json_decode($this->httpCurl($url,"GET",[]),true);
        if($data['errcode'] == 0){
            Session::set('accessToken',$data['access_token']);
            Session::set('expiresIn',$data['expires_in']+7200);
            return json(['code'=>$data['errcode'],'data'=>[],'msg'=>$data['access_token']]);
        }else{
            return json(['code'=>$data['errcode'],'data'=>[],'msg'=>$data['errmsg']]);
        }
    }

因为access_token的过期时间是7200秒 我们要把access_token储存起来并定时刷新,我的方法是放到缓存里,加一层判断,如果缓存里有access_token并且没过期就取缓存,如果过期了就再进入这个方法获取access_token

/**
     * 验证access_token
     */
    public function getToken(){
        $accessToken = Session::get('accessToken');
        $expiresIn = Session::get('expiresIn');
        if(empty($accessToken) || $expiresIn<time()){
            $this->getAccessToken();
        }
        return json(['code'=>0,'data'=>[],'msg'=>$accessToken]);
    }

调用的curl函数我整理了一下  post和get请求都能调用

/**
     * curl
     */
    private function httpCurl($url,$type,$data=[]){
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url); 
        if($type == 'GET'){
            curl_setopt($curl, CURLOPT_HEADER, 1);        //设置头文件的信息作为数据流输出
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//设置获取的信息以文件流的形式返回,而不是直接输出
        }
        if($type == 'POST'){
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS,$data);
        }
        $res = curl_exec($curl);
        curl_close($curl);
        return $res;
    }

接下来请求地址(文档是post请求):

POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN

根据文档介绍的请求参数,我们整理一下这么写:

/**
     * 发送客服消息给用户
     */
    public function sendMsg()
    {
        $access_token = $this->getToken();
        $access_token = $access_token['access_token'];
        $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$access_token;
        $param = Request::param();
        $validata = Validate::make([
            'touser|用户的OpenID' => 'require|isAlphaNum',
            'msgtype|消息类型' => 'require|isAlpha',
        ]);
        if(!$validata->check($param)){
            return json(['code'=>10407,'data'=>[],'msg'=>$validata->getError()]);
        };
        if($param['msgtype'] == 'text'){//发送文本消息内容
            if(!Request::param('content')){
                return json(['code'=>10407,'data'=>[],'msg'=>'文本消息内容不能为空']);
            }
            $arr = [
                'touser' => $param['touser'],
                'msgtype' => 'text',
                'content' =>$param['content'],
            ];
            $data = json_encode($arr,JSON_UNESCAPED_UNICODE);
            $this->httpCurl($url,$data);
        }
        if($param['msgtype'] == 'image'){//发送图片消息
            if(!Request::param('image')){
                return json(['code'=>10407,'data'=>[],'msg'=>'图片消息不能为空']);
            }
            $validata = Validate::make([
                'media_id|媒体ID' => 'require|number',
            ]);
            if(!$validata->check($param)){
                return json(['code'=>10407,'data'=>[],'msg'=>$validata->getError()]);
            };
            $arr = [
                'touser' => $param['touser'],
                'msgtype' => 'image',
                'image' =>['media_id'=>$param['media_id']],
            ];
            $data = json_encode($arr,JSON_UNESCAPED_UNICODE);
            $this->httpCurl($url,$data);
        }
        if($param['msgtype'] == 'link'){//发送图文链接	
            if(!Request::param('link')){
                return json(['code'=>10407,'data'=>[],'msg'=>'图文链接不能为空']);
            }
            if(!Request::param('title') || !Request::param('description') || !Request::param('url') || !Request::param('thumb_url')){
                return json(['code'=>10407,'data'=>[],'msg'=>'缺少参数title或description或url或thumb_url']);
            }
            $arr = [
                'touser' => $param['touser'],
                'msgtype' => 'link',
                'link' =>['title'=>$param['title'],'description'=>$param['description'],'url'=>$param['url'],'thumb_url'=>$param['thumb_url']],
            ];
            $data = json_encode($arr,JSON_UNESCAPED_UNICODE);
            $this->httpCurl($url,$data);
        }
        if($param['msgtype'] == 'miniprogrampage'){//发送小程序卡片
            if(!Request::param('miniprogrampage')){
                return json(['code'=>10407,'data'=>[],'msg'=>'小程序卡片不能为空']);
            }
            if(!Request::param('title') || !Request::param('pagepath') || !Request::param('thumb_media_id')){
                return json(['code'=>10407,'data'=>[],'msg'=>'缺少参数title或pagepath或thumb_media_id']);
            }
            $arr = [
                'touser' => $param['touser'],
                'msgtype' => 'link',
                'miniprogrampage' =>['title'=>$param['title'],'pagepath'=>$param['pagepath'],'thumb_media_id'=>$param['thumb_media_id']],
            ];
            $data = json_encode($arr,JSON_UNESCAPED_UNICODE);
            $this->httpCurl($url,"POST",$data);
        }

 这里我为什么用if验证,因为require验证是能验证是否传入这个字段,如果传入的是空也能校验成功 所以我用了if判断

time--

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值