1
0
mirror of synced 2026-03-24 13:38:59 +08:00

🆕 #3879 【公众号】被动回复消息增加「转接AI回复」支持

This commit is contained in:
Copilot
2026-02-28 17:26:26 +08:00
committed by GitHub
parent 389f1785b6
commit 60f7497b12
6 changed files with 107 additions and 0 deletions

View File

@@ -53,6 +53,7 @@ public class WxConsts {
public static final String DEVICE_STATUS = "device_status"; public static final String DEVICE_STATUS = "device_status";
public static final String HARDWARE = "hardware"; public static final String HARDWARE = "hardware";
public static final String TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service"; public static final String TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service";
public static final String TRANSFER_BIZ_AI_IVR = "transfer_biz_ai_ivr";
public static final String UPDATE_TASKCARD = "update_taskcard"; public static final String UPDATE_TASKCARD = "update_taskcard";
public static final String UPDATE_BUTTON = "update_button"; public static final String UPDATE_BUTTON = "update_button";
} }

View File

@@ -131,6 +131,15 @@ public abstract class WxMpXmlOutMessage implements Serializable {
return new TransferCustomerServiceBuilder(); return new TransferCustomerServiceBuilder();
} }
/**
* 获得转接AI回复消息builder
*
* @return 转接AI回复消息构建器
*/
public static TransferBizAiIvrBuilder TRANSFER_BIZ_AI_IVR() {
return new TransferBizAiIvrBuilder();
}
/** /**
* 获得设备消息builder * 获得设备消息builder
* *

View File

@@ -0,0 +1,29 @@
package me.chanjar.weixin.mp.bean.message;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import lombok.EqualsAndHashCode;
import me.chanjar.weixin.common.api.WxConsts;
/**
* 转接AI回复消息.
* <pre>
* 当用户发送消息给公众号时公众号开发者服务器回复如下内容会触发微信公众平台的AI回复。
* 注意需要公众号在微信公众平台上已开启AI回复功能并且AI已学习完毕历史发表文章。
* 官方文档https://developers.weixin.qq.com/doc/subscription/guide/product/message/Passive_user_reply_message.html
* </pre>
*
* @author copilot
*/
@Data
@XStreamAlias("xml")
@JacksonXmlRootElement(localName = "xml")
@EqualsAndHashCode(callSuper = true)
public class WxMpXmlOutTransferBizAiIvrMessage extends WxMpXmlOutMessage {
private static final long serialVersionUID = 8275281170988017563L;
public WxMpXmlOutTransferBizAiIvrMessage() {
this.msgType = WxConsts.XmlMsgType.TRANSFER_BIZ_AI_IVR;
}
}

View File

@@ -0,0 +1,22 @@
package me.chanjar.weixin.mp.builder.outxml;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTransferBizAiIvrMessage;
/**
* 转接AI回复消息builder.
* <pre>
* 用法: WxMpXmlOutTransferBizAiIvrMessage m = WxMpXmlOutMessage.TRANSFER_BIZ_AI_IVR().toUser("").fromUser("").build();
* </pre>
*
* @author copilot
*/
public final class TransferBizAiIvrBuilder
extends BaseBuilder<TransferBizAiIvrBuilder, WxMpXmlOutTransferBizAiIvrMessage> {
@Override
public WxMpXmlOutTransferBizAiIvrMessage build() {
WxMpXmlOutTransferBizAiIvrMessage m = new WxMpXmlOutTransferBizAiIvrMessage();
setCommon(m);
return m;
}
}

View File

@@ -15,6 +15,7 @@ import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMusicMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutNewsMessage; import me.chanjar.weixin.mp.bean.message.WxMpXmlOutNewsMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage; import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTransferKefuMessage; import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTransferKefuMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTransferBizAiIvrMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutVideoMessage; import me.chanjar.weixin.mp.bean.message.WxMpXmlOutVideoMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutVoiceMessage; import me.chanjar.weixin.mp.bean.message.WxMpXmlOutVoiceMessage;
@@ -30,6 +31,7 @@ public class XStreamTransformer {
registerClass(WxMpXmlOutVideoMessage.class); registerClass(WxMpXmlOutVideoMessage.class);
registerClass(WxMpXmlOutVoiceMessage.class); registerClass(WxMpXmlOutVoiceMessage.class);
registerClass(WxMpXmlOutTransferKefuMessage.class); registerClass(WxMpXmlOutTransferKefuMessage.class);
registerClass(WxMpXmlOutTransferBizAiIvrMessage.class);
} }
/** /**

View File

@@ -0,0 +1,44 @@
package me.chanjar.weixin.mp.bean.message;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* 转接AI回复消息测试.
*
* @author copilot
*/
public class WxMpXmlOutTransferBizAiIvrMessageTest {
@Test
public void test() {
WxMpXmlOutTransferBizAiIvrMessage m = new WxMpXmlOutTransferBizAiIvrMessage();
m.setCreateTime(1399197672L);
m.setFromUserName("fromuser");
m.setToUserName("touser");
String expected = "<xml>" +
"<ToUserName><![CDATA[touser]]></ToUserName>" +
"<FromUserName><![CDATA[fromuser]]></FromUserName>" +
"<CreateTime>1399197672</CreateTime>" +
"<MsgType><![CDATA[transfer_biz_ai_ivr]]></MsgType>" +
"</xml>";
System.out.println(m.toXml());
Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", ""));
}
@Test
public void testBuild() {
WxMpXmlOutTransferBizAiIvrMessage m = WxMpXmlOutMessage.TRANSFER_BIZ_AI_IVR()
.fromUser("fromuser").toUser("touser").build();
m.setCreateTime(1399197672L);
String expected = "<xml>" +
"<ToUserName><![CDATA[touser]]></ToUserName>" +
"<FromUserName><![CDATA[fromuser]]></FromUserName>" +
"<CreateTime>1399197672</CreateTime>" +
"<MsgType><![CDATA[transfer_biz_ai_ivr]]></MsgType>" +
"</xml>";
System.out.println(m.toXml());
Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", ""));
}
}