# 微信服务端java-api **Repository Path**: twoke/wechat_server_java_api ## Basic Information - **Project Name**: 微信服务端java-api - **Description**: 采用java调用微信服务端接口实现微信api的调用,封装了调用凭证,登录认证和消息订阅等api - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2020-07-01 - **Last Updated**: 2022-06-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 微信服务端API java-sdk开发版 ## 开发环境 ```JAVA JDK 1.8 MAVEN 3.5+ SpringBoot 2.3.1 ``` ## 项目结构 ```java |---- com.twoke.wx root包 |----api 微信API java实现 |----WeiXinApi 基类 |----WeiXinAuthApi 授权相关API |----WeiXinSubscribeMessageApi 消息订阅相关API |----config 基本配置类 |----BeanConfiguration Bean注入配置文件 |----constant 微信基本常量 |----WeiXinApiConstant 微信常量类 |----controller 测试控制层 |----TempController 临时测试控制层 |----entity 微信API用到的实体类 |----AccessToken 调用凭证 |----CodeToSessionResult 登录认证响应结果 |----SubscribeMessageSendEntity 消息订阅发送实体 |----enums 微信API中用到的枚举类型 |----LangEnum 语言类型枚举 |----MiniProgramStateEnum 小程序跳转类型 |----exception 自定义异常 |----CodeToSessionResultIsNullException 登录认证结果为空异常 |----SubscribeMessageApiException 订阅消息异常 ``` ## 封装API ```shell 1. 登录认证,获取openid和session_key 2. 获取调用凭证(access_token) 3. 获取程序码及小程序二维码 4. 订阅消息的发送 ``` ### 登录认证API **JAVA端实现** ```java /** * 登录凭证校验,获取微信用户的唯一标识 */ public CodeToSessionResult code2Session(String code){ //1.构造url String url = WeiXinApiConstant.AUTH_CODE_TO_SESSION_API .replace(WeiXinApiConstant.$_APP_ID,appid) .replace(WeiXinApiConstant.$_SECRET,secret) .replace(WeiXinApiConstant.$_JS_CODE,code) ; //2.获取响应结果 String json = restTemplate.getForObject(url, String.class); //3.转化结果 JSONObject jsonObject = JSONObject.parseObject(json); //4.返回结果 if(jsonObject.get(WeiXinApiConstant.OPENID)!=null){ CodeToSessionResult result = new CodeToSessionResult(); result.setOpenid(jsonObject.getString(WeiXinApiConstant.OPENID)); result.setSessionKey(jsonObject.getString(WeiXinApiConstant.SESSION_KEY)); if(jsonObject.get(WeiXinApiConstant.UNION_ID)!=null){ result.setUnionId(jsonObject.getString(WeiXinApiConstant.UNION_ID)); } return result; } throw new CodeToSessionResultIsNullException(json); } ``` **Controller调用** ```java @RequestMapping("/getOpenid") public Map getOpenid(@RequestBody JSONObject json){ Map map = new HashMap<>(); String openid = authApi.code2Session(json.getString("code")).getOpenid(); if(openid == null){ openid = "request:error"; } map.put(WeiXinApiConstant.OPENID,openid); return map; } ``` **微信小程序端调用** ​ index.wxml ```xml ``` 效果图 ![image-20200701162859587](README.assets/image-20200701162859587.png) index.js ```js getOpenid(res){ let _this = this; wx.request({ url: 'http://localhost:8080/api/getOpenid', method:"POST", data:{ code:res.code, username:_this.username, password:_this.password }, header: { 'content-type': 'application/json' // 默认值 }, success (res) { console.log(res.data) } }) } ``` **展示结果** ​ 点击登录 ![image-20200701163102314](README.assets/image-20200701163102314.png) ### 获取调用凭证(access_token) **JAVA端实现** ```java /** * 获取调用凭证 * @return */ public String getAccessToken(){ if(accessToken==null||accessToken.getExpiresTime()>=System.currentTimeMillis()){ //1.构造url String url = WeiXinApiConstant.AUTH_GET_ACCESS_TOKEN .replace(WeiXinApiConstant.$_APP_ID, appid) .replace(WeiXinApiConstant.$_SECRET, secret); //2.获取响应结果 String jsonStr = restTemplate.getForObject(url, String.class); //3.转化结果 JSONObject josnObject = JSONObject.parseObject(jsonStr); //4.获取调用凭证 String accessTokenStr = josnObject.getString(WeiXinApiConstant.ACCESS_TOKEN); Integer expiresIn = josnObject.getInteger(WeiXinApiConstant.EXPIRES_IN); //5.封装调用凭证 if(accessToken==null){ accessToken = new AccessToken(accessTokenStr,System.currentTimeMillis()+expiresIn*1000); }else{ accessToken.setAccessToken(accessTokenStr); accessToken.setExpiresTime(System.currentTimeMillis()+expiresIn*1000); } } return accessToken.getAccessToken(); } ```