史上最简单最全 java后端对接微信小程序客服教程

本文档详细介绍了微信小程序配置消息推送服务的步骤,包括解决token校验失败的问题、设置体验版以供体验用户访问,以及对接前后需要注意的事项。同时,提供了SpringBoot项目中实现消息推送的代码示例,包括接收和处理客服消息的方法。最后,提到了微信小程序客服功能的限制,即转人工后无法正常与客服聊天的当前问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章参考——配置消息推送
小程序发版体验成员使用步骤

遇到的几个问题

先分享一下遇到的几个问题

  • 提交消息推送服务起一直提示token校验失败 是因为没有启动项目 微信无法校验链接正确性
  • 体验用户无法正常打开小程序 需要先把小程序上传后设置为体验版 才能正常访问

对接前准备

对接前几个问题点

开发工具准备

先注册小程序

注册地址

获取小程序appip跟secret

启用消息推送设置

启用小程序消息推送

微信小程序----》开发管理—》开发设置

在这里插入图片描述

我在这里卡了很久 点击提交一直提示token校验失败,原来是需要先编写代码测试你填写的url链接是否可以请求通才行

正确步骤

  • 填写信息(不提交)
  • 编写确认程序 启动项目
  • 点击提交

代码见下面 填写完信息后,启动项目 点击提交 就会看到配置成功的界面了 启用完毕消息推送就可以进行关键字回复信息的功能了

这里的url如果没有自己的域名的话可以使用内网穿透自己在本地测试
内网穿透教程
注册账号后 实名认证 然后启动程序 按步骤会返回一个域名 自己可以启动程序 将端口号改为域名测试
然后将域名加自己的请求链接填写到 配置消息推送服务器的url地址

配置消息推送的代码

创建spring boot项目

依赖

需要添加hutool、guava的依赖 实体类使用lombok注解

<!--spring boot 相关-->
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
 
		<!--工具类-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.7</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>24.1.1-jre</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
实体类
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class WeChatMessage {


    /**
     * 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数
     */
    private String signature;

    /**
     * 时间戳
     */
    private String timestamp;

    /**
     * 随机数
     */
    private String nonce;

    /**
     * 随机字符串
     */
    private String echostr;
}
service
@Service
public class WeChatMessageService1 {

    public String checkSignature(WeChatMessage message) {
        String signature = message.getSignature();
        String timestamp = message.getTimestamp();
        String nonce = message.getNonce();

        //必须与请求参数中的token一致
        String token = "这里填写你需要配置的token 即上图中的Token(令牌)";
        List<String> list = Lists.newArrayList(token, timestamp, nonce);
       // 排序跟使用hutool工具类 进行字典排序跟加密
        String str = list.stream().sorted().collect(Collectors.joining());
        String tmpStr = SecureUtil.sha1(str);
        if (signature.equals(tmpStr)) {
            System.out.println("echostr = " + message.getEchostr());
            return message.getEchostr();
        } else {
            return "shibai";
        }
    }


}
controller

这里使用请求方法不同区分是因为 get请求的是进行认证的 其他的是post到服务器的地址进行消息推送等

@RestController
@RequestMapping
@RequiredArgsConstructor
public class RegisterWxRest {

    private final WeChatMessageService1 weChatMessageService;


    /**
     * 将此地址填写到服务器地址url上 启动项目 点击提交
     *
     * @param message 消息
     * @return {@link String}
     */
    @RequestMapping("message")
    public Object register(WeChatMessage message, HttpServletRequest request) throws IOException{
        String method = request.getMethod();
        if (HttpMethod.GET.name().equalsIgnoreCase(method)) {
            // 认证
            return weChatMessageService.checkSignature(message);
        } else if (HttpMethod.POST.name().equalsIgnoreCase(method)) {
			// 认证外的其他请求
            return null;
        } else {
            return null;
        }
    }
}

使用微信开发者工具新建小程序

在index页面将客服组件添加

<view>
	<button open-type="contact" bindcontact="handleContact">联系客服</button>
</view>	

这是我们使用开发者账号可以扫码进行预览 进入客服发送消息 但是如何让体验者也是用呢 我用别的微信号 扫了半天 怎么也进不去 原来需要将小程序上传设置为体验版才可以 这里如果我们把消息推送关闭 是正常是用网页版小程序对话的

小程序发版体验成员使用步骤

对接小程序推送

参考地址
接下来就是创建小程序项目了
spring boot 三板斧 依赖、yml、注解

导入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>


        <!--微信小程序-->
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>wx-java-miniapp-spring-boot-starter</artifactId>
            <version>4.1.0</version>
        </dependency>

        <dependency>
            <groupId>com.github.jedis-lock</groupId>
            <artifactId>jedis-lock</artifactId>
            <version>1.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.7</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>24.1.1-jre</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

yml配置文件

wx:
  miniapp:
    appid: appid
    secret: 你的密钥
    token: 消息推送配置的token
    aesKey: 消息推送的aeskey
    msgDataFormat: XML               # 消息格式,XML或者JSON.

编写代码

注入wxService

@Configuration
public class MiniAppConfiguration {

    @Resource
    private WxMaService wxMaService;

    /**
     * 客服消息
     *
     * @return {@link WxMaMsgService}
     */
    @Bean
    public WxMaMsgService wxMaMsgService() {
        return new WxMaMsgServiceImpl(wxMaService);
    }

    /**
     * 临时素材接口
     *
     * @return {@link WxMaMediaService}
     */
    @Bean
    public WxMaMediaService wxMaMediaService() {
        return new WxMaMediaServiceImpl(wxMaService);
    }
}

service

@Slf4j
@Service
@RequiredArgsConstructor
public class MessageSendService {

    private final WxMaMsgService wxMaMsgService;

    public Object send(HttpServletRequest request) throws IOException, WxErrorException {
        BufferedReader streamReader = new BufferedReader( new InputStreamReader(request.getInputStream(), "UTF-8"));
        StringBuilder responseStrBuilder = new StringBuilder();
        String inputStr;
        while ((inputStr = streamReader.readLine()) != null){
            responseStrBuilder.append(inputStr);
        }
        WxMaMessage message = WxMaMessage.fromXml(responseStrBuilder.toString());
        if (WxMaConstants.KefuMsgType.TEXT.equals(message.getMsgType()) && message.getContent().contains("转人工")) {
            // 设置转到客服消息 进行人工回复
            WxMaXmlOutMessage wxMaXmlOutMessage = new WxMaXmlOutMessage();
            wxMaXmlOutMessage.setCreateTime(message.getCreateTime().longValue());
            wxMaXmlOutMessage.setFromUserName(message.getToUser());
            wxMaXmlOutMessage.setToUserName(message.getFromUser());
            wxMaXmlOutMessage.setMsgType("transfer_customer_service");
            // 这里注意 如果你在配置消息推送是是xml 返回xml 如果是json返回json
            return XStreamTransformer.toXml(WxMaXmlOutMessage.class, wxMaXmlOutMessage);
        } else {
            WxMaKefuMessage message1 = new WxMaKefuMessage();
            message1.setToUser(message.getFromUser());
            WxMaKefuMessage.KfText text = new WxMaKefuMessage.KfText("测试一二三");
            message1.setText(text);
            message1.setMsgType(WxMaConstants.KefuMsgType.TEXT);
            wxMaMsgService.sendKefuMsg(message1);
        }
        return "测试";
    }
}

rest

@RestController
@RequestMapping
@RequiredArgsConstructor
public class RegisterWxRest {

    private final WeChatMessageService1 weChatMessageService;
    private final MessageSendService messageSendService;


    /**
     * 将此地址填写到服务器地址url上 启动项目 点击提交
     *
     * @param message 消息
     * @return {@link String}
     */
    @RequestMapping("message")
    public Object register(WeChatMessage message, HttpServletRequest request) throws IOException, WxErrorException {
        String method = request.getMethod();

        if (HttpMethod.GET.name().equalsIgnoreCase(method)) {
            // 认证
            return weChatMessageService.checkSignature(message);
        } else if (HttpMethod.POST.name().equalsIgnoreCase(method)) {
            // 接收用户消息
            return messageSendService.send(request);
        } else {
            return null;
        }
    }
}

启动项目测试

启动项目 微信扫码体验版小程序 点击联系客服进行测试

目前微信小程序客服貌似还有问题 转人工后 再次发消息还是会推送到服务器上。。就没法实现正常跟人工客服聊天 不知道后面微信什么时候会修掉这个bug 有解决的同学 也可以分享一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值