Explicação detalhada da função de operação de envio do servidor de mensagens do WeChat Mini Program

1. Introdução

A fim de enriquecer os recursos de serviço dos Miniprogramas e melhorar a qualidade do serviço, o WeChat fornece recursos de mensagens de atendimento ao cliente para os Miniprogramas, para que os usuários do Miniprograma possam se comunicar com os provedores de serviços do Miniprograma de forma conveniente e rápida.

2. Introdução da função

Os usuários podem usar a função de mensagem de atendimento ao cliente do Mini Programa para se comunicar com o pessoal de atendimento ao cliente do Mini Programa.

Existem duas entradas de sessão de mensagem de atendimento ao cliente:

1. No applet: o desenvolvedor adiciona um componente de botão de mensagem de atendimento ao cliente no applet e o usuário pode acessar a página da sessão de atendimento ao cliente no applet e enviar uma mensagem para o applet;

2. As mensagens de atendimento ao cliente do Miniprograma usadas serão agregadas e exibidas na caixa "Mensagem de atendimento ao cliente do miniprograma" da sessão WeChat. Os usuários podem visualizar mensagens históricas de atendimento ao cliente fora do Miniprograma e enviar mensagens para o Miniprograma.

Condições para envio de mensagens de atendimento ao cliente: o usuário do Mini Programa inicia uma sessão de atendimento no Mini Programa ou o usuário envia uma mensagem para o atendimento ao cliente do Mini Programa. Para o tempo de envio específico, período de validade e limite no número de mensagens, por favor consulte as Condições para Envio de Mensagens de Atendimento ao Cliente

Tipo de mensagem de atendimento ao cliente: atualmente oferece suporte a mensagens de texto, imagem e tipo de cartão de miniprograma.

Para atender ao máximo as necessidades dos desenvolvedores do Mini Program, os Mini Programs podem enviar mensagens de atendimento ao cliente das três maneiras a seguir: 1. Chame a API para enviar mensagens de atendimento ao cliente 2. Use as ferramentas de atendimento ao cliente na web; programa.

3. Descrição da condição de emissão

Quando o usuário interage com o atendimento ao cliente do Mini Programa com uma ação específica (consulte a descrição abaixo para a lista de ações específicas), o Mini Programa pode enviar uma mensagem de atendimento ao cliente ao usuário.

A lista de ações atualmente permitidas é a seguinte: Após diferentes ações serem acionadas, o número de mensagens permitidas para serem enviadas e o limite de tempo para enviá-las são diferentes. Quando o número de threads enviados atingir o limite superior, um código de erro será retornado.

ação do usuário

Limite no número de threads permitidos

Limite de tempo de lançamento

Usuário envia mensagem

5 peças

48 horas

O número de mensagens de atendimento que podem ser enviadas não é cumulativo. As ações do usuário acima acionarão a atualização do número de mensagens que podem ser enviadas e o prazo de entrega. O número de mensagens que podem ser enviadas será atualizado para o limite máximo do número atual de mensagens que podem ser enviadas. O limite também é atualizado com o tempo máximo válido.

4. Ligue para a interface de mensagens de atendimento ao cliente para enviar mensagens de atendimento ao cliente

Quando o usuário enviar uma mensagem para o atendimento ao cliente do Mini Programa, o servidor WeChat irá POSTAR o pacote de dados da mensagem (ou evento) (formato JSON ou XML) para a URL preenchida pelo desenvolvedor. Após receber a requisição, o desenvolvedor pode chamar a interface para resposta assíncrona.

Se o conjunto de permissões de mensagens de atendimento ao cliente do Mini Programa tiver sido autorizado para a plataforma de terceiros, todas as mensagens de atendimento ao cliente serão enviadas para o servidor da plataforma de terceiros e não serão mais enviadas para o servidor do desenvolvedor ou para a versão web da ferramenta de atendimento ao cliente

Preencha a configuração de push da mensagem

Faça login no applet, ative a função de envio de mensagem em "Configurações-Configurações de desenvolvimento-Envio de mensagem" e conclua a configuração das informações relevantes (incluindo endereço do servidor, Token e método de criptografia, etc.).

Depois de habilitar e definir a configuração do servidor, as mensagens enviadas pelos usuários e pushes de eventos exigidos pelos desenvolvedores serão encaminhados pelo WeChat para a URL do desenvolvedor.

chamada de interface

Miniprograma Documentação da API de mensagem de atendimento ao cliente

5. Apresentação do caso

Site relacionado:
Enviar mensagem de atendimento ao cliente: https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/kf-mgnt/kf-message/sendCustomMessage.html
Guia de funções de atendimento ao cliente: https://developers.weixin. qq. com/miniprogram/introduction/custom.htmlServer
-mini program customer service news: https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/#%E5%B0%8F%E7%A8%8B% E5 %BA%8F%E5%AE%A2%E6%9C%8D
Applet message sdk: Link: https://pan.baidu.com/s/1ekDtfwfnegRngKOOGzMK1g Código de extração: n1tr
A estrutura usa yii2 como um caso
<?php
/**
 * 微信消息回复
 */

namespace frontend\controllers;

use Yii;

/**
 * Class WxMsgController
 * @package frontend\controllers
 */
class WxMsgController extends BaseController
{
    /**
     * 入口
     * @throws \Exception
     */
    public function actionIndex()
    {
        //校验服务器地址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 . '+++' . Yii::$app->params['payment.wx']['token'];
            exit;
        }
    }

    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];

        $token = Yii::$app->params['wx']['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;
        }
    }

    /**
     * 接受消息和事件:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/customer-message/receive.html
     * 发送消息:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/customer-message/customerServiceMessage.send.html
     * @throws \Exception
     */
    public function responseMsg()
    {
        //小程序相关sdk
        $dir = Yii::getAlias('@common/lib/wx-applet-service-crypto-php');
        require_once $dir . '/wxBizMsgCrypt.php';

        //获取微信服务端发送请求
        $postStr = file_get_contents('php://input');
        $timeStamp = $_GET["timestamp"];
        $msgSignature = $_GET["msg_signature"];
        $nonce = $_GET["nonce"];

        //微信相关配置
        $config = Yii::$app->params['wx'];
        //小程序应用ID
        $appId = $config['app_id'];
        //小程序消息通知 消息加密密钥
        $encodingAesKey = $config['encodingAESKey'];
        //小程序消息通知token
        $token = $config['token'];

        try {
            $pc = new \WXBizMsgCrypt($token, $encodingAesKey, $appId);
            // 第三方收到公众号平台发送的消息
            $msg = '';
            //校验
            $errCode = $pc->decryptMsg($msgSignature, $timeStamp, $nonce, $postStr, $msg);

            if ($errCode != 0) {
                throw new \Exception('in errCode: ' . $errCode);
            }

            $postObj = simplexml_load_string($msg, 'SimpleXMLElement', LIBXML_NOCDATA);
            if (!empty($msg) && is_object($postObj)) {
                $fromUsername = (string)$postObj->FromUserName;
                $createTime = (string)$postObj->CreateTime;
                $msgType = (string)$postObj->MsgType;
                $event = (string)$postObj->Event;
                if (!empty($msgType) && $msgType == 'text') {   //发送文本消息
                    // 发送文案
                    $content = '扫码,加我,咨询';
                    $data = array(
                        "touser" => $fromUsername,
                        "msgtype" => "text",
                        "text" => array("content" => $content)
                    );

                    $json = json_encode($data, JSON_UNESCAPED_UNICODE);  //php5.4+
                    $this->requestAPI($json);
                } elseif (!empty($msgType) && $msgType == 'image') {   //发送图片消息
                    // 发送图片
                    $imgurl = '/images/service_code.png'; //二维码,相对路径,修改为自己的
                    $media_id = $this->getMediaId($imgurl);  // 输入想要回复的图片消息的media_id
                    $data = array(
                        "touser" => $fromUsername,
                        "msgtype" => "image",
                        "image" => array("media_id" => $media_id)
                    );
                    $param = json_encode($data, JSON_UNESCAPED_UNICODE);  //php5.4以上版本才可使用
                    $this->requestAPI($param);
                } elseif (!empty($msgType) && $msgType == 'link') {   //用户发送图文链接
                    //构建向微信客服发送的参数
                    $text = [
                        'url' => "www.xxx.com",
                        'thumb_url' => 'thumb_url',
                        'title' => "测试",
                        'description' => "测试des",
                    ];
                    // 发送图文链接
                    $data = array(
                        "touser" => $fromUsername,
                        "msgtype" => "link",
                        "text" => $text
                    );

                    $json = json_encode($data, JSON_UNESCAPED_UNICODE);  //php5.4+
                    $this->requestAPI($json);
                } elseif (!empty($msgType) && $msgType == 'miniprogrampage') { //用户发送小程序卡片
                    //逻辑代码
                } elseif ($msgType == 'event' && $event == 'user_enter_tempsession') { //用户发送小程序卡片
                    //解决接收用户消息重复发送:腾讯那边迟迟接不到回音,就会重复请求,这样就会重复发三次客服消息
                    $key = sprintf("service_msg:%s:%s", $fromUsername, $createTime);
                    //判断redis中key是否存在
                    $redisUser = Yii::$app->redis_user;
                    if ($redisUser->exists($key)) {
                        exit;
                    }
                    $redisUser->set($key, 1);
                    $redisUser->expire($key, 15);
                    //逻辑代码
                }
            } else {
                throw new \Exception('in  empty msgType: ' . $msg);
                exit;
            }
        } catch (\Exception $e) {
            // 发送error文案
            $content = $e->getMessage();
            $data = array(
                "touser" => $fromUsername,
                "msgtype" => "text",
                "text" => array("content" => $content)
            );

            $json = json_encode($data, JSON_UNESCAPED_UNICODE);  //php5.4+
            $this->requestAPI($json);
            throw $e;
        }
    }

    /**
     * @param $param
     */
    public function requestApi($param, $type = 'json')
    {
        $access_token = $this->get_accessToken();
        /*
         * POST发送https请求客服接口api
         */
        $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" . $access_token;

        if ($type == 'xml') {
            //以'xml'格式发送post的https请求
            $header[] = "Content-type: text/xml";
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_POST, 1);
            if (!empty($param)) {
                curl_setopt($curl, CURLOPT_POSTFIELDS, $param);
            }
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
            $output = curl_exec($curl);
            if (curl_errno($curl)) {
                echo 'Errno' . curl_error($curl);//捕抓异常
            }
            curl_close($curl);
            if ($output == 0) {
                echo 'success';
            }
        } else {
            //以'json'格式发送post的https请求
            $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($param)) {
                curl_setopt($curl, CURLOPT_POSTFIELDS, $param);
            }
            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';
            }
        }
    }

    /**
     * 获取上传图片的media_id
     * @param $imgurl
     * @return null
     */
    public function getMediaId($imgurl)
    {
        $mediaKey = 'media_key';
        $mediaId = Yii::$app->cache->get($mediaKey);
        if ($mediaId) {
            return $mediaId;
        }

        $token = $this->get_accessToken();
        $url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token={$token}&type=image";
        $ch1 = curl_init();
        $timeout = 10;
        $real_path = "{$_SERVER['DOCUMENT_ROOT']}$imgurl";//自动转成图片文件绝对路径,如果图片发送失败,检查PHP的$_SERVER['DOCUMENT_ROOT'的配置
        $data = array("media" => new \CURLFile("{$real_path}"));//php5.6(含)以上版本使用此方法
        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);
        // echo $result;
        curl_close($ch1);
        if ($result) {
            $result = json_decode($result, true);
            Yii::$app->cache->set($mediaKey, $result['media_id'], 3600 * 21 * 3);

            return $result['media_id'];
        } else {
            return null;
        }
    }

    /**
     * 调用微信api,获取access_token,有效期7200s -xzz0704
     * @return mixed
     */
    public function get_accessToken()
    {
        //微信配置
        $config = Yii::$app->params['wx'];
        //小程序应用ID
        $appId = $config['app_id'];
        //小程序应用秘钥
        $secret = $config['applet_secret'];
        $tokenKey = "access_token";
        $access_token = Yii::$app->cache->get($tokenKey);
        if (!$access_token) {
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appId&secret=$secret";
            $res = json_decode($this->httpGet($url));
            $access_token = $res->access_token;
            if ($access_token) {
                Yii::$app->cache->set($tokenKey, $access_token, 7000);
            }
        }

        return $access_token;
    }

    private function httpGet($url)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
        // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
        curl_setopt($curl, CURLOPT_URL, $url);

        $res = curl_exec($curl);
        curl_close($curl);

        return $res;
    }
}

Acho que você gosta

Origin blog.csdn.net/zhoupenghui168/article/details/130198851
Recomendado
Clasificación