zoukankan      html  css  js  c++  java
  • 开通小程序的客服功能

    开启自定义的小程序的客服功能,需要两步,一步是在自己的微信平台开通消息推送的功能。第二步是完成自己的后台。

    第一步:开启推送功能:

    具体的在官方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急先锋的博客

  • 相关阅读:
    2.变量、数据类型、数据类型转换相关函数
    3.字符串、列表、元组、字典、集合的补充
    CentOS7安装mysql后无法启动服务,提示Unit not found
    (个人记录)Python2 与Python3的版本区别
    1.print()与input()
    JAVA:函数的定义、使用
    Java:包装类
    Java:访问权限
    Java程序流程控制:判断结构、选择结构、循环结构
    Java:运算符的问题
  • 原文地址:https://www.cnblogs.com/callmelx/p/9747220.html
Copyright © 2011-2022 走看看