From f50612b6fa4966105874e8a3337803a2ddc1b668 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 31 Aug 2025 15:05:58 +0000
Subject: [PATCH] Complete Mini Program customer service management
implementation with tests and documentation
Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com>
---
MINIAPP_KEFU_SERVICE.md | 80 ++++++++++++++++++
.../api/impl/WxMaKefuServiceImplTest.java | 60 +++++++++++++
.../wx/miniapp/demo/WxMaKefuServiceDemo.java | 84 +++++++++++++++++++
3 files changed, 224 insertions(+)
create mode 100644 MINIAPP_KEFU_SERVICE.md
create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaKefuServiceImplTest.java
create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaKefuServiceDemo.java
diff --git a/MINIAPP_KEFU_SERVICE.md b/MINIAPP_KEFU_SERVICE.md
new file mode 100644
index 000000000..96cf4c383
--- /dev/null
+++ b/MINIAPP_KEFU_SERVICE.md
@@ -0,0 +1,80 @@
+# WeChat Mini Program Customer Service Management
+
+This document describes the new customer service management functionality added to the WxJava Mini Program SDK.
+
+## Overview
+
+Previously, the mini program module only had:
+- `WxMaCustomserviceWorkService` - For binding mini programs to enterprise WeChat customer service
+- `WxMaMsgService.sendKefuMsg()` - For sending customer service messages
+
+The new `WxMaKefuService` adds comprehensive customer service management capabilities:
+
+## Features
+
+### Customer Service Account Management
+- `kfList()` - Get list of customer service accounts
+- `kfAccountAdd()` - Add new customer service account
+- `kfAccountUpdate()` - Update customer service account
+- `kfAccountDel()` - Delete customer service account
+
+### Session Management
+- `kfSessionCreate()` - Create customer service session
+- `kfSessionClose()` - Close customer service session
+- `kfSessionGet()` - Get customer session status
+- `kfSessionList()` - Get customer service session list
+
+## Usage Example
+
+```java
+// Get the customer service management service
+WxMaKefuService kefuService = wxMaService.getKefuService();
+
+// Add a new customer service account
+WxMaKfAccountRequest request = WxMaKfAccountRequest.builder()
+ .kfAccount("service001@example")
+ .kfNick("Customer Service 001")
+ .kfPwd("password123")
+ .build();
+boolean result = kefuService.kfAccountAdd(request);
+
+// Create a session between user and customer service
+boolean sessionResult = kefuService.kfSessionCreate("user_openid", "service001@example");
+
+// Get customer service list
+WxMaKfList kfList = kefuService.kfList();
+```
+
+## Bean Classes
+
+### Request Objects
+- `WxMaKfAccountRequest` - For customer service account operations
+- `WxMaKfSessionRequest` - For session operations
+
+### Response Objects
+- `WxMaKfInfo` - Customer service account information
+- `WxMaKfList` - List of customer service accounts
+- `WxMaKfSession` - Session information
+- `WxMaKfSessionList` - List of sessions
+
+## API Endpoints
+
+The service uses the following WeChat Mini Program API endpoints:
+- `https://api.weixin.qq.com/cgi-bin/customservice/getkflist` - Get customer service list
+- `https://api.weixin.qq.com/customservice/kfaccount/add` - Add customer service account
+- `https://api.weixin.qq.com/customservice/kfaccount/update` - Update customer service account
+- `https://api.weixin.qq.com/customservice/kfaccount/del` - Delete customer service account
+- `https://api.weixin.qq.com/customservice/kfsession/create` - Create session
+- `https://api.weixin.qq.com/customservice/kfsession/close` - Close session
+- `https://api.weixin.qq.com/customservice/kfsession/getsession` - Get session
+- `https://api.weixin.qq.com/customservice/kfsession/getsessionlist` - Get session list
+
+## Integration
+
+The service is automatically available through the main `WxMaService` interface:
+
+```java
+WxMaKefuService kefuService = wxMaService.getKefuService();
+```
+
+This fills the gap mentioned in the original issue and provides full customer service management capabilities for WeChat Mini Programs.
\ No newline at end of file
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaKefuServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaKefuServiceImplTest.java
new file mode 100644
index 000000000..456aca93f
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaKefuServiceImplTest.java
@@ -0,0 +1,60 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaKefuService;
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.kefu.WxMaKfList;
+import cn.binarywang.wx.miniapp.bean.kefu.request.WxMaKfAccountRequest;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+/**
+ * 小程序客服管理服务测试.
+ *
+ * @author Binary Wang
+ */
+public class WxMaKefuServiceImplTest {
+
+ @Test
+ public void testKfList() throws WxErrorException {
+ WxMaService service = mock(WxMaService.class);
+ when(service.get(anyString(), any())).thenReturn("{\"kf_list\":[]}");
+
+ WxMaKefuService kefuService = new WxMaKefuServiceImpl(service);
+ WxMaKfList result = kefuService.kfList();
+
+ Assert.assertNotNull(result);
+ Assert.assertNotNull(result.getKfList());
+ Assert.assertEquals(result.getKfList().size(), 0);
+ }
+
+ @Test
+ public void testKfAccountAdd() throws WxErrorException {
+ WxMaService service = mock(WxMaService.class);
+ when(service.post(anyString(), anyString())).thenReturn("{\"errcode\":0}");
+
+ WxMaKefuService kefuService = new WxMaKefuServiceImpl(service);
+ WxMaKfAccountRequest request = WxMaKfAccountRequest.builder()
+ .kfAccount("test@kfaccount")
+ .kfNick("测试客服")
+ .kfPwd("password")
+ .build();
+
+ boolean result = kefuService.kfAccountAdd(request);
+ Assert.assertTrue(result);
+ }
+
+ @Test
+ public void testKfSessionCreate() throws WxErrorException {
+ WxMaService service = mock(WxMaService.class);
+ when(service.post(anyString(), anyString())).thenReturn("{\"errcode\":0}");
+
+ WxMaKefuService kefuService = new WxMaKefuServiceImpl(service);
+ boolean result = kefuService.kfSessionCreate("test_openid", "test@kfaccount");
+ Assert.assertTrue(result);
+ }
+}
\ No newline at end of file
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaKefuServiceDemo.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaKefuServiceDemo.java
new file mode 100644
index 000000000..1d62fd9be
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaKefuServiceDemo.java
@@ -0,0 +1,84 @@
+package cn.binarywang.wx.miniapp.demo;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.kefu.WxMaKfList;
+import cn.binarywang.wx.miniapp.bean.kefu.WxMaKfSession;
+import cn.binarywang.wx.miniapp.bean.kefu.WxMaKfSessionList;
+import cn.binarywang.wx.miniapp.bean.kefu.request.WxMaKfAccountRequest;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+/**
+ * 小程序客服管理功能使用示例.
+ *
+ * @author Binary Wang
+ */
+public class WxMaKefuServiceDemo {
+
+ private final WxMaService wxMaService;
+
+ public WxMaKefuServiceDemo(WxMaService wxMaService) {
+ this.wxMaService = wxMaService;
+ }
+
+ /**
+ * 演示客服账号管理功能
+ */
+ public void demonstrateCustomerServiceManagement() throws WxErrorException {
+ // 1. 获取客服列表
+ WxMaKfList kfList = wxMaService.getKefuService().kfList();
+ System.out.println("当前客服数量: " + kfList.getKfList().size());
+
+ // 2. 添加新客服账号
+ WxMaKfAccountRequest addRequest = WxMaKfAccountRequest.builder()
+ .kfAccount("service001@example")
+ .kfNick("客服001")
+ .kfPwd("password123")
+ .build();
+
+ boolean addResult = wxMaService.getKefuService().kfAccountAdd(addRequest);
+ System.out.println("添加客服账号结果: " + addResult);
+
+ // 3. 更新客服账号信息
+ WxMaKfAccountRequest updateRequest = WxMaKfAccountRequest.builder()
+ .kfAccount("service001@example")
+ .kfNick("高级客服001")
+ .build();
+
+ boolean updateResult = wxMaService.getKefuService().kfAccountUpdate(updateRequest);
+ System.out.println("更新客服账号结果: " + updateResult);
+ }
+
+ /**
+ * 演示客服会话管理功能
+ */
+ public void demonstrateSessionManagement() throws WxErrorException {
+ String userOpenid = "user_openid_example";
+ String kfAccount = "service001@example";
+
+ // 1. 创建客服会话
+ boolean createResult = wxMaService.getKefuService().kfSessionCreate(userOpenid, kfAccount);
+ System.out.println("创建会话结果: " + createResult);
+
+ // 2. 获取用户会话状态
+ WxMaKfSession session = wxMaService.getKefuService().kfSessionGet(userOpenid);
+ System.out.println("用户当前会话客服: " + session.getKfAccount());
+
+ // 3. 获取客服的会话列表
+ WxMaKfSessionList sessionList = wxMaService.getKefuService().kfSessionList(kfAccount);
+ System.out.println("客服当前会话数量: " + sessionList.getSessionList().size());
+
+ // 4. 关闭客服会话
+ boolean closeResult = wxMaService.getKefuService().kfSessionClose(userOpenid, kfAccount);
+ System.out.println("关闭会话结果: " + closeResult);
+ }
+
+ /**
+ * 演示客服账号删除功能
+ */
+ public void demonstrateAccountDeletion() throws WxErrorException {
+ String kfAccount = "service001@example";
+
+ boolean deleteResult = wxMaService.getKefuService().kfAccountDel(kfAccount);
+ System.out.println("删除客服账号结果: " + deleteResult);
+ }
+}
\ No newline at end of file