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

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

遇到的几个问题

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

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

对接前准备

对接前几个问题点

  • 如何按关键字回复 设置 消息推送
  • 按关键字恢复后如何转到人工客服 对应文档转发客服消息
  • 客服消息文档

开发工具准备

  • idae
  • 微信开发者工具 下载地址
  • hbuilderX(辅助开发小程序)下载地址

先注册小程序

注册地址

获取小程序appip跟secret

启用消息推送设置

启用小程序消息推送

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

史上最简单最全 java后端对接微信小程序客服教程_第1张图片

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

正确步骤

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

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

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

配置消息推送的代码

创建spring boot项目

依赖

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



            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
            org.projectlombok
            lombok
            true
        
 
		
        
            cn.hutool
            hutool-all
            5.4.7
        

        
            com.google.guava
            guava
            24.1.1-jre
        

        
            com.alibaba
            fastjson
            1.2.47
        
实体类
@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 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页面将客服组件添加


	
	

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

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

对接小程序推送

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

导入依赖


            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
            org.projectlombok
            lombok
            true
        


        
        
            com.github.binarywang
            wx-java-miniapp-spring-boot-starter
            4.1.0
        

        
            com.github.jedis-lock
            jedis-lock
            1.0.0
        

        
            org.springframework.boot
            spring-boot-starter-data-redis
        

        
            cn.hutool
            hutool-all
            5.4.7
        

        
            com.google.guava
            guava
            24.1.1-jre
        

        
            com.alibaba
            fastjson
            1.2.47
        

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 有解决的同学 也可以分享一下

你可能感兴趣的:(java,小程序,微信)