微信小程序客服消息服务端发送操作功能详解

这篇具有很好参考价值的文章主要介绍了微信小程序客服消息服务端发送操作功能详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.简介

为丰富小程序的服务能力,提高服务质量,微信为小程序提供客服消息能力,以便小程序用户可以方便快捷地与小程序服务提供方进行沟通。

2.功能介绍

用户可使用小程序客服消息功能,与小程序的客服人员进行沟通。

客服消息会话入口有两个:

1、小程序内:开发者在小程序内添加客服消息按钮组件,用户可在小程序内唤起客服会话页面,给小程序发消息;

2、已使用过的小程序客服消息会聚合显示在微信会话「小程序客服消息」盒子内,用户可以在小程序外查看历史客服消息,并给小程序发送消息。

微信小程序客服消息,微信,Php,微信小程序客服消息,Powered by 金山文档

客服消息下发条件:小程序用户在小程序内唤起客服会话或用户给小程序客服发送消息,具体下发时间有效期及消息条数限制见客服消息下发条件说明

客服消息类型:目前支持文本、图片、小程序卡片类型消息。

为尽量满足小程序开发者的需求,小程序可通过以下3种方式下发客服消息:1. 调用发送客服消息接口;2. 使用网页端客服工具;3. 使用移动端「客服小助手」小程序。

3.下发条件说明

当用户和小程序客服产生特定动作的交互时(具体动作列表请见下方说明),小程序可向用户下发客服消息。

目前允许的动作列表如下,不同动作触发后,允许下发消息条数和下发时限不同。下发条数达到上限后,会返回错误码。

用户动作

允许下发条数限制

下发时限

用户发送信息

5条

48小时

可发送客服消息条数不累加,上述用户动作会触发可下发条数及可下发时限的更新,可下发消息条数更新为当前可下发条数限制的最大值,有效下发时间限制也更新为最长有效时间。

4.调用客服消息接口发送客服消息

当用户给小程序客服发消息,微信服务器会将消息(或事件)的数据包(JSON或者XML格式)POST到开发者填写的URL。开发者收到请求后可以调用接口进行异步回复。

如小程序的客服消息权限集已授权给第三方平台,则所有的客服消息将推送到第三方平台的服务器,不再推送到开发者的服务器或推送到网页版客服工具

填写消息推送配置

登录小程序,在“设置-开发设置-消息推送”启用消息推送功能并完成相关信息配置(包括服务器地址、Token、及加密方式等)。

微信小程序客服消息,微信,Php,微信小程序客服消息,Powered by 金山文档
微信小程序客服消息,微信,Php,微信小程序客服消息,Powered by 金山文档

启用并设置服务器配置后,用户发送的消息以及开发者需要的事件推送,都将被微信转发至开发者URL中。

微信小程序客服消息,微信,Php,微信小程序客服消息,Powered by 金山文档

接口调用

小程序客服消息API文档文章来源地址https://www.toymoban.com/news/detail-631475.html

5.案例演示

相关网站:
发送客服消息: https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/kf-mgnt/kf-message/sendCustomMessage.html
客服功能指南: https://developers.weixin.qq.com/miniprogram/introduction/custom.html
服务端-小程序客服消息: https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/#%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%AE%A2%E6%9C%8D
小程序消息sdk:链接: https://pan.baidu.com/s/1ekDtfwfnegRngKOOGzMK1g 提取码: n1tr
框架以yii2为案例
<?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;
    }
}

到了这里,关于微信小程序客服消息服务端发送操作功能详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp - 微信小程序平台模板消息订阅功能,唤起订阅模板消息弹框、微信公众号向用户发送 “服务通知“ 实现全过程示例代码,支持一次性订阅与永久性订阅(注释详细,一键复制开箱即用)

    本博客实现了uniapp微信小程序端,详细实现公众号订阅通知模板消息完整示例源码,一次性订阅与永久订阅均可,注释详细新手一看就懂! 效果如图所示,uniapp编译的微信小程序内点击按钮后,唤起模板消息订阅申请弹框,后续微信内会收到通知。

    2024年02月13日
    浏览(67)
  • 微信小程序——服务通知,发送订阅消息

    1 小程序开通订阅消息 2 postApi测试效果 这里有个需要特别注意的点,我们要给用户发送消息,就必须引导用户授权,如下 因为用户不点击允许,你是没有办法给用户推送消息的。每一次授权只允许发送一条消息,所以如果你想尽量多的发送消息,就得尽量多的引导用户授权

    2024年02月11日
    浏览(73)
  • 微信小程序通过公众号服务号发送消息

    一、基础概念: 准备条件:      1、公众号和小程序必须在同一个公司主体下。      2、在公众号后台需要对小程序进程绑定操作。 公众号提供了两种消息,一种是订阅消息,一种是模板消息。 订阅消息需要用户主动订阅,然后才能接收消息,微信提供前端组件用于用户进

    2024年02月07日
    浏览(46)
  • uniapp微信小程序订阅消息发送服务通知--超详细

    由于公司需求,刚学完的小程序的我,要求开发一个直播通知的微信小程序,学了vue的我,选择还是使用uniapp开发,wx原生语法学完已经快忘了。在利用uniapp写代码的过程中,遇到很多问题,通过这篇博客分享一下总体实现思路以及一些小坑。整篇博客以逐步的思路让你完整

    2024年02月06日
    浏览(51)
  • 微信小程序服务通知(订阅消息)定时推送消息功能

    首先先说项目需求:向预约参观的用户提前一天晚上8点推送消息。小程序端主要用到的 API 是我是小程序用到的API。以及服务端用到的 API :我是服务端用到的API。 1. 开通订阅消息功能 (1)、 首先需要在小程序管理后台开通订阅消息功能。没开通前如下图所示: (2)、开通之

    2024年02月08日
    浏览(80)
  • 微信小程序的订阅消息是一个允许开发者向用户发送重要通知的功能。这里为您展示如何实现小程序订阅消息的基本步骤和代码示例

    步骤 1: 获取模板 ID 首先,您需要登录微信公众平台,进入「小程序管理」后台,找到“设置” “开发设置” “订阅消息”,然后选择并配置所需的模板,记录模板 ID。 步骤 2: 小程序前端请求订阅 在小程序的某个页面或组件中,当用户执行某个操作(例如点击按钮)时,可

    2024年02月04日
    浏览(94)
  • 微信小程序实现订阅消息功能(Node服务器篇)

            * 源码已经上传到资源处,需要的话点击跳转下载 |  源码下载         在上一篇内容当中在微信小程序中实现订阅消息功能,都在客户端(小程序)中来实现的,在客户端中模拟了服务器端来进行发送订阅消息的功能,那么本篇就将上一篇内容中仅在客户端中实现

    2024年02月03日
    浏览(64)
  • 实现微信小程序定时发送通知(1)发送请求篇

    小程序发通知需要获取获取小程序全局唯一后台接口调用凭据(access_token)。调用绝大多数后台接口时都需使用 access_token,后面会进行使用redis的存取。 但是急于求成加上先去看了小马如何获取openId,打算使用前端发过来的code获取access_token,这确实是一个获取access_token的方

    2024年02月09日
    浏览(44)
  • 【微信小程序】使用 WebSocket 进行订阅操作、连接监听、接收到服务器的消息事件

    在微信小程序中使用 WebSocket 进行订阅操作,可以通过 wx.connectSocket 方法创建 WebSocket 连接,并通过相关事件处理函数进行订阅和数据处理。 以下是一个示例代码,演示了在微信小程序中使用 WebSocket 进行订阅: 在上述代码中,我们首先使用 wx.connectSocket 方法创建 WebSocket 连接

    2024年02月16日
    浏览(62)
  • 【微信小程序开发】自定义tabBar案例(定制消息99+小红心)

    🤵‍♂️ 个人主页: @计算机魔术师 👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。 🌐 推荐一款找工作神器网站: 点击跳转牛客网 |笔试题库|面试经验|实习招聘内推| 还没有账户的小伙伴 速速点击链接登录注册把!🎉🎉 该文章收录专栏 ✨ 2022微信小程序京东商

    2024年01月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包