小程序發送客服消息,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--

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章