b505信息科学研究所
* @Description 获取jsapi的凭证票(网上这代码可真坑人) * @author yulin * @Creat date 2018-11-30 13:23 */ public class JsapiTicketUtil { private static Logger log = LoggerFactory.getLogger(JsapiTicketUtil.class); // 获取access_token的接口地址(GET) 限2000(次/天) public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; // 菜单创建(POST) 限100(次/天) public static String menu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN"; /** * 创建菜单 * * @param menu 菜单实例 * @param accessToken 有效的access_token * @return 0表示成功,其他值表示失败 */ public static int createMenu(Menu menu, String accessToken) { int result = 0; // 拼装创建菜单的url String url = menu_create_url.replace("ACCESS_TOKEN", accessToken); // 将菜单对象转换成json字符串 String jsonMenu = JSONObject.fromObject(menu).toString(); // 调用接口创建菜单 JSONObject jsonObject = httpRequest(url, "POST", jsonMenu); if (null != jsonObject) { if (0 != jsonObject.getInt("errcode")) { result = jsonObject.getInt("errcode"); log.error("创建菜单失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); } } return result; } /*** * 描述:创建按钮专用!获取accessToken * auhtor:yulin * Create date 2019-9-16 12:42 * @return */ public static String getAccessToken(){ String appid="wx41c9f671d9c6355f";//应用ID String appSecret="bad1b7703b0195a7ba94001cc455d1e7";//(应用密钥) String url ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+appSecret+""; String backData=JsapiTicketUtil.sendGet(url, "utf-8", 10000); String accessToken = (String) JSONObject.fromObject(backData).get("access_token"); return accessToken; } /*** * 模拟get请求 * @param url * @param charset * @param timeout * @return */ public static String sendGet(String url, String charset, int timeout) { String result = ""; try { URL u = new URL(url); try { URLConnection conn = u.openConnection(); conn.connect(); conn.setConnectTimeout(timeout); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), charset)); String line=""; while ((line = in.readLine()) != null) { result = result + line; } in.close(); } catch (IOException e) { return result; } } catch (MalformedURLException e) { return result; } return result; } /** * 发起https请求并获取结果 * * @param requestUrl 请求地址 * @param requestMethod 请求方式(GET、POST) * @param outputStr 提交的数据 * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) */ public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) { JSONObject jsonObject = null; StringBuffer buffer = new StringBuffer(); try { // 创建SSLContext对象,并使用我们指定的信任管理器初始化 TrustManager[] tm = { new My509TrustManager() }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = new URL(requestUrl); HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection(); httpUrlConn.setSSLSocketFactory(ssf); httpUrlConn.setDoOutput(true); httpUrlConn.setDoInput(true); httpUrlConn.setUseCaches(false); // 设置请求方式(GET/POST) httpUrlConn.setRequestMethod(requestMethod); if ("GET".equalsIgnoreCase(requestMethod)) httpUrlConn.connect(); // 当有数据需要提交时 if (null != outputStr) { OutputStream outputStream = httpUrlConn.getOutputStream(); // 注意编码格式,防止中文乱码 outputStream.write(outputStr.getBytes("UTF-8")); outputStream.close(); } // 将返回的输入流转换成字符串 InputStream inputStream = httpUrlConn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } bufferedReader.close(); inputStreamReader.close(); // 释放资源 inputStream.close(); inputStream = null; httpUrlConn.disconnect(); jsonObject = JSONObject.fromObject(buffer.toString()); } catch (ConnectException ce) { log.error("Weixin server connection timed out."); } catch (Exception e) { log.error("https request error:{}", e); } return jsonObject; } /** * 获取access_token * * @param appid 凭证 * @param appsecret 密钥 * @return */ public static AccessToken getAccessToken(String appid, String appsecret) { AccessToken accessToken = null; String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret); JSONObject jsonObject = httpRequest(requestUrl, "GET", null); // 如果请求成功 if (null != jsonObject) { try { accessToken = new AccessToken(); accessToken.setToken(jsonObject.getString("access_token")); accessToken.setExpiresIn(jsonObject.getInt("expires_in")); } catch (JSONException e) { accessToken = null; // 获取token失败 log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); } } return accessToken; } } public static Menu getMenu() { CommonButton btn11 = new CommonButton(); btn11.setName("主页"); btn11.setType("click"); btn11.setKey("11"); CommonButton btn21=new CommonButton(); btn21.setName("会员通道"); btn21.setType("click"); btn21.setKey("21"); CommonButton btn31=new CommonButton(); btn31.setName("工作平台"); btn31.setType("view"); btn31.setUrl("http://hyxw.work/servicefunctiontwo"); /* CommonButton btn32=new CommonButton(); btn32.setName("收费测试"); btn32.setType("view"); btn32.setUrl("https://mp.weixin.qq.com/s?__biz=MzIyNjIyNzk4OQ==&mid=2247483660&idx=1&sn=57914686073b68cf156fe647321b87bf&chksm=e872e376df056a6090791b63ace6e065a8681a7976e5e68289bf37aa5f09cb53507bb074bd6f&token=1850092517&lang=zh_CN#rd"); */ /* CommonButton btn32=new CommonButton(); btn32.setName("用户咨询"); btn32.setType("click"); btn32.setKey( "32" );*/ /*CommonButton btn33=new CommonButton(); btn33.setName("联系方式"); btn33.setType("click"); btn33.setKey( "33" );*/ ComplexButton mainBtn2=new ComplexButton(); mainBtn2.setName("工作平台"); mainBtn2.setSub_button(new CommonButton[]{btn31}); Menu menu = new Menu(); menu.setButton(new Button[] {btn11, btn21,mainBtn2 }); return menu; } 8、获取用户的网页授权 /** * 描述:获取微信用户的网页授权 * 接口地址:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx41c9f671d9c6355f&redirect_uri=http%3a%2f%2f39.105.65.69%2ftext1&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect * author:yulin * Create date 2020-2-21 12:22 */ @RequestMapping("/text1") public String text1(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException { request.setCharacterEncoding("gb2312"); response.setCharacterEncoding("gb2312"); //用户同意授权 String code =request.getParameter("code"); if(!"authdeny".equals(code)){ WeixinOauth2Token weixinOauth2Token= AdvancedUtil.getOauth2AccessToken("","",code); //网页授权接口访问凭证 String accessToken=weixinOauth2Token.getAccessToken(); //用户标识 String openId=weixinOauth2Token.getOpenId(); //获取用户信息 SNSUserInfo snsUserInfo=AdvancedUtil.getSNSUserInfo(accessToken,openId); System.out.println("--------------------------------------------用户的城市在"+snsUserInfo.getCity()); return "text"; } return "error1"; } package com.b505.weixin.util; import com.b505.weixin.pojo.SNSUserInfo; import com.b505.weixin.pojo.WeixinOauth2Token; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.awt.*; public class AdvancedUtil { public static Logger logger = LoggerFactory.getLogger(AdvancedUtil.class); /** * 获取网页授权凭证 * @param appId 公众号的唯一标识 * @param appSecret 公众号的密匙 * @param code * @return WeixinAouth2Token * */ public static WeixinOauth2Token getOauth2AccessToken(String appId, String appSecret, String code){ WeixinOauth2Token wat=null; //拼接请求信息 String requestUrl ="https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code"; requestUrl=requestUrl.replace("APPID",appId); requestUrl=requestUrl.replace("SECRET",appSecret); requestUrl=requestUrl.replace("CODE",code); //获取网页授权的凭证 JSONObject jsonObject =JsapiTicketUtil.httpRequest(requestUrl,"GET",null); if(null!=jsonObject){ try { wat=new WeixinOauth2Token(); wat.setAccessToken(jsonObject.getString("access_token")); wat.setExpiresIn(jsonObject.getInt("expires_in")); wat.setRefreshToken(jsonObject.getString("refresh_token")); wat.setOpenId(jsonObject.getString("openid")); wat.setScope(jsonObject.getString("scope")); } catch (Exception e) { // TODO: handle exception wat=null; int errorCode=jsonObject.getInt("errcode"); String errorMsg=jsonObject.getString("errmsg"); logger.error("获取网络授权失败 errcode:{} errmsg:{}",errorCode,errorMsg); } } return wat; } /** * 通过网页授权获取用户的信息 * * @param accessToken 网页授权接口调用凭证 * @param openId 用户标识 * */ @SuppressWarnings({"deprecation","unchecked"}) public static SNSUserInfo getSNSUserInfo(String accessToken, String openId){ SNSUserInfo snsuserInfo=null; //拼接请求地址 String requestUrl="https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID"; requestUrl =requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId); //通过网页授权获取用户的信息 JSONObject jsonObject=JsapiTicketUtil.httpRequest(requestUrl, "GET", null); if(null!=jsonObject){ try { snsuserInfo=new SNSUserInfo(); //用户标识 snsuserInfo.setOpenId(jsonObject.getString("openid")); //昵称 snsuserInfo.setNickname(jsonObject.getString("nickname")); //性别(1是男性 2是女性 0是未知) snsuserInfo.setSex(jsonObject.getInt("sex")); //用户所在的国家 snsuserInfo.setCountry(jsonObject.getString("country")); //用户所在的省份 snsuserInfo.setProvince(jsonObject.getString("province")); //用户所在的城市 snsuserInfo.setCity(jsonObject.getString("city")); //用户头像 snsuserInfo.setHeadImgUrl(jsonObject.getString("headimgurl")); //用户特权信息 snsuserInfo.setPrivilegeList(JSONArray.toList(jsonObject.getJSONArray("privilege"), List.class) ); System.out.println("-----------------------------------------openid="+snsuserInfo.getOpenId()); } catch (Exception e) { // TODO: handle exception snsuserInfo=null; int errorCode=jsonObject.getInt("errcode"); String errorMsg=jsonObject.getString("errmsg"); logger.error("获取用户信息失败 errcode:{} errmsg:{}",errorCode,errorMsg); } } return snsuserInfo; } }