微信jssdk后端接口demo

  • i8_663156
    了解作者
  • 3.7MB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-05-23 11:31
    上传日期
微信jssdk后端接口demo
wechat_jssdkdemo.rar
内容介绍
package com.util.weixin; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ConnectException; import java.net.URL; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import net.sf.json.JSONException; import net.sf.json.JSONObject; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.util.weixin.domain.AccessToken; import com.util.weixin.domain.JsAPITicket; import com.util.weixin.util.DateUtil; public class WeChatUtil { private static Logger log = LoggerFactory.getLogger(WeChatUtil.class); //存放accesstoken key:appid public static Map<String, AccessToken> tokenMap=new HashMap<String, AccessToken>(); //存放jssdk tiket key:appid public static Map<String, JsAPITicket> ticketMap=new HashMap<String, JsAPITicket>(); /** * 获取access_token的接口地址(GET) 限200(次/天) */ public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; public final static String jsAPITicket_url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=ACCESS_TOKEN"; public static AccessToken getAccessToken(String appid, String appsecret) { AccessToken accessToken=null; if (!checkIsAccessTokenNotExpires(tokenMap.get(appid))) {//内存中的不过期,则用内存中的 accessToken= tokenMap.get(appid); }else { Lock lock=new ReentrantLock(); lock.lock();// 取得锁 accessToken = getAccessTokenFromServer(appid, appsecret); lock.unlock(); } return accessToken; } private static AccessToken getAccessTokenFromServer(String appid, String appsecret) { if (!checkIsAccessTokenNotExpires(tokenMap.get(appid))) {//内存中的不过期,则用内存中的 return tokenMap.get(appid); } log.info("reget access token:"+new Date()); //过期了则重新请求 AccessToken accessToken = null; JSONObject jsonObject=null; try { String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret); jsonObject = httpRequest(requestUrl, "GET", null); // 如果请求成功 if (null!=jsonObject) { accessToken = new AccessToken(); accessToken.setAppId(appid); accessToken.setAccessToken(jsonObject.getString("access_token")); //官方定义的过期时间 int expires=jsonObject.getInt("expires_in"); accessToken.setCtime(new Date());//设置创建时间 //设置过期的时间,减少120s是因为怕最后几秒用户获取到一个,过一段时间在操作,失效了 long expireMills=(expires-120)*1000; accessToken.setExpiresTime(DateUtil.generateExpiry(expireMills)); accessToken.setExpiresIn(expires); tokenMap.put(appid, accessToken); } } catch (JSONException e) { e.printStackTrace(); accessToken = null; // 获取token失败 log.error("get access token error errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); }catch (Exception e) { accessToken = null; // 获取token失败 e.printStackTrace(); log.error("get access token error "+e.getMessage() ); } return accessToken; } /** * 检查请求是否正确返回,并且返回code是0 * 全局返回码说明文档http://mp.weixin.qq.com/wiki/10/6380dc743053a91c544ffd2b7c959166.html */ private static boolean checkRequestReturn(JSONObject jsonObject) { boolean isValid=false; if (jsonObject!=null) { String errcode=jsonObject.getString("errcode"); if ("0".equals(errcode)) { isValid=true; } } return isValid; } public static JsAPITicket getJsAPITicket( ) { JsAPITicket ticket=null; AccessToken accessToken=getAccessToken(WechatVariable.APPID, WechatVariable.APPSECRET); if (!checkIsTicketNotExpires(ticketMap.get(accessToken.getAppId()))) {//内存中的不过期,则用内存中的 ticket= ticketMap.get(accessToken.getAppId()); }else { Lock lock=new ReentrantLock(); lock.lock();// 取得锁 ticket = getJsTicketFromServer(accessToken); lock.unlock();// 释放锁 } return ticket; } /** * 从微信服务器获取ticket * @param accessToken * @return */ private static JsAPITicket getJsTicketFromServer(AccessToken accessToken) { if (!checkIsTicketNotExpires(ticketMap.get(accessToken.getAppId()))) {//内存中的不过期,则用内存中的 return ticketMap.get(accessToken.getAppId()); } JsAPITicket ticket=null; JSONObject jsonObject=null; try { log.info("reget jssdk ticket:"+new Date()); //过期了则重新请求 String requestUrl = jsAPITicket_url.replace("ACCESS_TOKEN", accessToken.getAccessToken()); jsonObject = httpRequest(requestUrl, "GET", null); // 如果请求成功 if (checkRequestReturn(jsonObject)) { ticket = new JsAPITicket(); ticket.setAppId(accessToken.getAppId()); ticket.setTicket(jsonObject.getString("ticket")); //官方定义的过期时间 int expires=jsonObject.getInt("expires_in"); ticket.setCtime(new Date());//设置创建时间 //设置过期的时间,减少120s是因为怕最后几秒用户获取到一个,过一段时间在操作,失效了 long expireMills=(expires-120)*1000; ticket.setExpiresTime(DateUtil.generateExpiry(expireMills)); ticket.setExpiresIn(expires); ticketMap.put(accessToken.getAppId(), ticket); } } catch (JSONException e) { e.printStackTrace(); ticket = null; // 获取token失败 log.error("获取ticket失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); }catch (Exception e) { ticket = null; e.printStackTrace(); log.error("get ticket error:"+e.getMessage()); } return ticket; } /** * 检查Access Token是否过期 * @return */ private static boolean checkIsTicketNotExpires(JsAPITicket jsAPITicket) { boolean isExpire=true; if (jsAPITicket!=null&&StringUtils.isNotBlank(jsAPITicket.getTicket())) { isExpire= new Date().after(jsAPITicket.getExpiresTime()); } return isExpire; } /** * 检查jssdk ticket是否过期 * @return */ private static boolean checkIsAccessTokenNotExpires(AccessToken accessToken) { boolean isExpire=true; if (accessToken!=null&&StringUtils.isNotBlank(accessToken.getAccessToken())) { isExpire= new Date().after(accessToken.getExpiresTime()); } return isExpire; } /** * 发起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 MyX509TrustManager() }; 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 != ou
评论
    相关推荐
    • 微信支付 java 后端 demo
      yongJava写的一个小项目用于微信支付,自己可以参考官方文档看一下,不想看代码可直接复制粘贴
    • 微信APP支付 PHP后端
      在前人的车轮上修改了一下,微信APP支付验证通过,阿里的还未验证
    • 看书阅读带后端-微信小程序
      看书阅读带后端-微信小程序,微信小程序(wei xin xiao cheng xu),简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用。
    • Java后端微信小程序视频教程
      Java页面静态化视频教程,使用Java进行微信小程序和服务器的交互
    • 微信分享后端接口
      简单的对前端微信分享需要的参数进行生成,针对access_token的次数时长限制加以优化,再五数据库情况下保存分享的点击量
    • 微信支付 java后端demo
      完整的demo,相信很多做微信支付的都会走很多坑,这个demo可以让你少走很多坑
    • 微信支付asp后端 少有资源
      微信支付asp后端 少有资源
    • 简易记账带后端-微信小程序
      简易记账带后端-微信小程序,微信小程序(wei xin xiao cheng xu),简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用。...
    • 客家旅运带后端-微信小程序
      客家旅运带后端-微信小程序,微信小程序(wei xin xiao cheng xu),简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用。
    • GaussDB_100_1.0.1-DATABASE-REDHAT-64bit.tar.gz
      guassdb100在redhat上安装包,单机部署的包,安装步骤请看我的文中介绍,经过大量实验搭建总结出来的文档