1. 程式人生 > >開通小程序的客服功能

開通小程序的客服功能

cap 發送數據 www. 流程 json 自定義 true service json字符串

開啟自定義的小程序的客服功能,需要兩步,一步是在自己的微信平臺開通消息推送的功能。第二步是完成自己的後臺。

第一步:開啟推送功能:

具體的在官方wiki裏有,可以點這裏。

有幾個坑需要註意一下,如果你的token驗證總是失敗:

1.建議你看一下自己server服務器的token與現在的token是否相同。

2.如果你發現自己的代碼絕對沒有問題,token也絕對沒有問題的話,而且還是報錯,那麽我建議檢查一下自己服務器的文件的權限問題了,如果你是tp框架,檢查一下啊自己的runtime是否給了777,如果你是給755的話可能還是不會起作用。

第二步:完成自己後臺的服務器

前提:你的服務器可以被微信訪問,有的公司運維會做控制,所以在這裏不要浪費太多時間。

流程:用戶出發某個事件後,向微信服務器發送數據包,如果你開啟消息推送服務(第一步),那麽微信服務器會進行數據的處理轉發,具體的格式是xml還是json取決於你在微信後臺的選擇,我這裏選擇的json,微信通過主動調用你的接口將數據包返回給你,如果你想向用戶響應某個信息,需要某個接口向微信服務器發送你的響應數據包,裏面包含客服的openid.具體的詳情看代碼。

<?php
header(‘Content-type:text‘);
define("TOKEN", "mytoken");

class Mini extends Controller{
    private $appid = ‘‘;
    
private $secret = ‘‘; public function check(){ //校驗服務器地址URL if (isset($_GET[‘echostr‘])) { $this->valid(); }else{ $this->responseMsg(); } } public function valid() { $echoStr = $_GET["echostr"]; if($this->checkSignature()){
header(‘content-type:text‘); echo $echoStr; exit; }else{ echo $echoStr.‘+++‘.TOKEN; exit; } } private function checkSignature() { $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } public function responseMsg() { $postStr = file_get_contents(‘php://input‘);//因為我的環境是php7 if (!empty($postStr) && is_string($postStr)){ $postArr = json_decode($postStr,true); if(!empty($postArr[‘MsgType‘]) && $postArr[‘MsgType‘] == ‘text‘){ //文本消息 $fromUsername = $postArr[‘FromUserName‘]; //發送者openid $toUserName = $postArr[‘ToUserName‘]; //小程序id $textTpl = array( "ToUserName"=>$fromUsername, "FromUserName"=>$toUserName, "CreateTime"=>time(), "MsgType"=>"transfer_customer_service", ); exit(json_encode($textTpl)); }elseif(!empty($postArr[‘MsgType‘]) && $postArr[‘MsgType‘] == ‘image‘){ //圖文消息 $fromUsername = $postArr[‘FromUserName‘]; //發送者openid $toUserName = $postArr[‘ToUserName‘]; //小程序id $textTpl = array( "ToUserName"=>$fromUsername, "FromUserName"=>$toUserName, "CreateTime"=>time(), "MsgType"=>"transfer_customer_service", ); exit(json_encode($textTpl)); }elseif($postArr[‘MsgType‘] == ‘event‘ && $postArr[‘Event‘]==‘user_enter_tempsession‘){ $fromUsername = $postArr[‘FromUserName‘];

          $data = array(
           "touser"=>$fromUsername,
           "msgtype"=>"link",
            "link"=>[
            "title"=>‘this is title‘,
            "description"=> "Is Really A Happy Day",
            "url":=>"URL",
            "thumb_url"=>"THUMB_URL"
            ]
           );

          $json = json_encode($data,JSON_UNESCAPED_UNICODE); 
                $access_token = $this->get_accessToken();
                $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$access_token;
                //將數據返給微信服務器進行轉發。
                $this->curl_post($url,$json);
                
            }else{
                exit(‘aaa‘);
            }
        }else{
            echo "";
            exit;
        }
    }
  
    public function get_accessToken(){
        if(cache(‘access_token‘)){
            return cache(‘access_token‘);
        }
        /* 不在有效期,重新發送請求,獲取access_token */
        else{
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appid}&secret={$this->secret}";
            $result = curl_get_https($url);
            $res = json_decode($result,true);   //json字符串轉數組
            if($res){
                cache(‘access_token‘,$res[‘access_token‘],7100);
                return cache(‘access_token‘);
            }else{
                return ‘api return error‘;
            }
        }
    }
    /**
     * @Author   callmelx
     * @DateTime 2018-10-06
     * @return   [type]     [description]
     */
    public function curl_post($url,$data=‘‘){
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_POST, 1); // 發送一個常規的Post請求
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        if (!empty($data)){
            curl_setopt($curl, CURLOPT_POSTFIELDS,$data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        //curl_setopt($curl, CURLOPT_HTTPHEADER, $headers );
        $output = curl_exec($curl);
        if (curl_errno($curl)) {
            echo ‘Errno‘.curl_error($curl);//捕抓異常
        }
        curl_close($curl);
        if($output == 0){
            echo ‘success‘;exit;
        }
    }
}

參考的博客是 php急先鋒的博客。

開通小程序的客服功能