生成openId,获取凭据

发布时间 2023-05-05 10:36:39作者: 葬爱_坤疤

问题及解决

在调用凭证access_token的时候出现的错误

 

当小程序出错出现代码40125,并显示:

errcode: 40125, errmsg: "invalid appSecret"

解决办法:

  1. 在mp.weixin.qq.com 里面重置你的app secret

  2. 或查看你的appid 是否没有对应上;

  3. 或查看你的url拼接是否出现空格,换行等等;使用trim()函数;

  4. 若你的小程序里面 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 网关转发请求给对应的服务。

 

总结

今天的学习状态是不错的,也学到了很多的东西,用代码的方式将微信公众接口的执行效果是一样的,这个接口是要改,是因为前端小程序不能直接调用他们自带的接口,所以我们要在本地将其接口敲出来。