问题及解决
在调用凭证access_token的时候出现的错误
当小程序出错出现代码40125,并显示:
errcode: 40125, errmsg: "invalid appSecret"
解决办法:
-
在mp.weixin.qq.com 里面重置你的app secret
-
或查看你的appid 是否没有对应上;
-
或查看你的url拼接是否出现空格,换行等等;使用trim()函数;
-
若你的小程序里面 project.config.json 里的appId 和你管理页面新增的appid不一致时, 将该小程序在编辑工具里面删除;(不会删除源代码),再重新导入;
学习重点及理解
生成openId
生成openId底层的代码,其实和微信公众平台上的是一样的,调用的也是这个接口
/**
*微信的生成openId
* @param code
* @return
*/
@GetMapping("/login")
public AjaxResult OpenId(String code){
StringBuilder url = new StringBuilder("https://api.weixin.qq.com/sns/jscode2session?");
url.append("appid=").append(appId);//appid设置
url.append("&secret=").append(secret);//secret设置
url.append("&js_code=").append(code);//code设置
url.append("&grant_type=authorization_code");
JSONObject res = null;
try {
res = JSONObject.parseObject(HttpUtil.get(url.toString())); //构建一个GET请求
} catch (Exception e) {
e.printStackTrace();
}
//将获取的openId输出
return AjaxResult.success(res);
}
这就像微信公众上的接口是一样的,只是在用后台中用代码写出,将其中的一些参数写到其中罢了
获取凭据
/**
*获取接口调用凭据
* @return
*/
@GetMapping("/accessToken")
public AjaxResult getAccessToken(){
StringBuilder url = new StringBuilder("https://api.weixin.qq.com/cgi-bin/token?");
url.append("appid=").append(appId);//appid设置
url.append("&secret=").append(secret);//secret设置
url.append("&grant_type=client_credential");
JSONObject res = null;
try {
res = JSONObject.parseObject(HttpUtil.get(url.toString())); //构建一个GET请求
} catch (Exception e) {
e.printStackTrace();
}
return AjaxResult.success(res);
}
消息订阅
消息订阅这个接口是比较麻烦,其中的参数是要很多,其中包括了access_token的参数,这个参数要获取。模板的的类型要对应的上,不然会报错,说模型的id和和你要发送的消息的不一致的。
@GetMapping("/sendMessageWx")
@ApiOperation("订阅消息推送测试")
public static void SendMessage(String token, String openId, SendMessageDto sendMessageDto) {
List<TemplateParam> templateParams = new ArrayList<>();
//当前进度
templateParams.add(TemplateParam.builder().key("thing5").value(sendMessageDto.getName()).build());
//事项编码
templateParams.add(TemplateParam.builder().key("thing2").value(sendMessageDto.getWarningName()).build());
//事项名称
templateParams.add(TemplateParam.builder().key("thing4").value(sendMessageDto.getWarningRemarks()).build());
Template template = Template.builder()
.template_id("RHyBM3s1xYPd97VsTYdPX7O20A6Wl4thsjC7WrGtZ3w")//模板 ID
.touser(openId)//用户 openid
.data(templateParams) //模板参数
.page("pages/user/myDocument/index1/index1")//点击消息跳转页面
.build();
//请求地址
String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+token;
log.info("推送的模板参数信息:"+ template.toJSON());
String jsonResult = null;
jsonResult = cn.hutool.http.HttpUtil.post(requestUrl,template.toJSON());
if (jsonResult != null) {
JSONObject OpenidJSONO = JSONObject.parseObject(jsonResult);
System.out.println(jsonResult);
String errorCode = OpenidJSONO.get("errcode").toString();
String errorMessage = OpenidJSONO.get("errmsg").toString();
if ("0".equals(errorCode)) {
log.info("推送订阅消息: Send Success");
} else {
log.info("订阅消息发送失败:"+ errorCode+errorMessage);
}
} else {
log.info("订阅消息发送失败");
}
}
扩展学习
面试题
-
一、什么是 spring cloud?
-
spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。
-
-
二、spring cloud 断路器的作用是什么?
-
在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。
-
-
三、spring cloud 的核心组件有哪些?
-
Eureka:服务注册于发现。
-
Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。
-
Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。
-
Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
-
Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。
-
总结
今天的学习状态是不错的,也学到了很多的东西,用代码的方式将微信公众接口的执行效果是一样的,这个接口是要改,是因为前端小程序不能直接调用他们自带的接口,所以我们要在本地将其接口敲出来。
标签:openId,code,String,url,凭据,获取,secret,append From: https://www.cnblogs.com/ikunba/p/17373435.html