文章参考——配置消息推送
小程序发版体验成员使用步骤
先分享一下遇到的几个问题
注册地址
获取小程序appip跟secret
启用小程序消息推送
微信小程序----》开发管理—》开发设置
我在这里卡了很久 点击提交一直提示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
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";
}
}
}
这里使用请求方法不同区分是因为 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
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);
}
}
@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 "测试";
}
}
@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 有解决的同学 也可以分享一下