java后台微信获取验证token 生成没有数量限制的小程序二维码

//微信获取token 生成小程序二维码
	@RequestMapping("/cs/getQrcode")
	public @ResponseBody
	Map<String, Object> getWxaqrcode(HttpServletRequest request, HttpServletResponse response, int id, int width) {
		log.info("======> /cs/getQrcode");
		Map<String, Object> Token = getaccessToken();
		String path="pages/cs";
		byte[] qrcode=getWxaCreateQrcode(Token.get("accessToken").toString(),path,width,"?id="+id);
		String ewm_qrcode=base64StringToImage(qrcode);
		map.put("qrcodeAddr",ewm_qrcode);
		return map;
	}
	//数量无限制接口
	public static final String unlimit= "https://api.weixin.qq.com/wxa/getwxacodeunlimit";
	private final static String wxappid = "你自己的id";
	private final static String wxappsecret = "你自己的密码";
	
	public byte[] getWxaCreateQrcode(String accesstoken,String path,int width,String scene){
		net.sf.json.JSONObject jsonObject= new net.sf.json.JSONObject();
		jsonObject.put("width",width);
		jsonObject.put("page",path);
		//二维码里传递参数
		jsonObject.put("scene",scene);
		org.apache.http.client.HttpClient client = HttpClients.createDefault();
		String url = unlimit+"?access_token="+accesstoken;
		HttpPost post = new HttpPost(url);
		byte[] result = null;
		try {
			// 设置通用属性
			StringEntity s = new StringEntity(jsonObject.toString(),"UTF-8");
			s.setContentEncoding("UTF-8");
			s.setContentType("application/json");
			// 设置发送的数据(数据尽量为json格式)
			post.setEntity(s);
			post.addHeader("content-type", "application/json;charset=UTF-8");
			//  获取数据
			HttpResponse res = client.execute(post);
			//  判断网络请求的是否成功,成功的状态码为200
			if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
				//  HttpEntity为消息实体,内容是http传送的报文,获取数据
				HttpEntity entity = res.getEntity();
				result=EntityUtils.toByteArray(entity);
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}finally {
			// 释放连接
			post.releaseConnection();
		}
		return result;
	}

	/**
	 * 获取小程序接口调用凭据
	 *  */
	public Map<String, Object> getAccessToken() {
		Map<String, Object> ReturnMap=new HashMap<String,Object>();
		Map<String, Object> Cache_Token=new HashMap<String,Object>();
		Map<String,Object> Database_Token=new HashMap<String,Object>();
		String mapKey=wxappid+wxappsecret;
		long token_id=0;
		try{
			Cache_Token= WxTokenMapManager.getWxToken(mapKey);
			if(Cache_Token==null)
				Cache_Token=new HashMap<String,Object>();

			if(isAccessTokenExpired(Cache_Token)){
				int updatetime=0;

				while(true){
					if(updatetime<10 &&(isAccessTokenExpired(Cache_Token) || isDbTokenExpired(Cache_Token,Database_Token))){
						updatetime++;
						//调用获取token
						String  requestUrl ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxappid+ "&secret=" + wxappsecret;
						net.sf.json.JSONObject jsonObject = null;
						log.info("requestUrl"+requestUrl);
						try {
							jsonObject = httpRequest(requestUrl, "GET", null);
						} catch (Exception e) {
							log.info("getAccessToken[Error]::[通讯异常]:["+e.getMessage()+"]["+requestUrl+"]");
		
							return Cache_Token;
						}

						// 如果请求成功
						if (null != jsonObject) {
							try {
								log.info(jsonObject.toString());
								Cache_Token.put("accessToken",	jsonObject.getString("access_token"));
								Cache_Token.put("expiresIn",	jsonObject.getInt("expires_in"));
								Cache_Token.put("validTime",	jsonObject.getInt("expires_in")*1000+System.currentTimeMillis());
								Cache_Token.put("errorToken", 	null);
								WxTokenMapManager.updateWxToken(mapKey,Cache_Token);

							} catch (JSONException e){
								log.info("getAccessToken[Error]::[接口错误码读取异常]");
							}
						}else{//jsonObject==null
							log.info("getAccessToken[Error]::[接口读取异常]:["+jsonObject+"]["+requestUrl+"]");
						}
						break;
					}
					else
					{//数据库中正确
						Cache_Token.put("accessToken",	Database_Token.get("accessToken").toString());
						Cache_Token.put("expiresIn",	Database_Token.get("expiresIn").toString());
						Cache_Token.put("validTime",	Database_Token.get("validTime").toString());
						Cache_Token.put("errorToken", 	null);
						WxTokenMapManager.updateWxToken(mapKey, Cache_Token);
						break;
					}
				}
			}
		}catch(Exception e){
			log.info("getAccessToken[Error]::[操作异常]:["+e.getMessage()+"]["+Cache_Token+"]["+Database_Token+"]");
			return Cache_Token;
		}
		ReturnMap=Cache_Token;
		return ReturnMap;
	}

	/**
	 * 判断缓存accesstoken过期
	 */
	public boolean isAccessTokenExpired(Map<String, Object> params){
		return (params.get("validTime")==null ||
				(Long.parseLong(params.get("validTime").toString())-System.currentTimeMillis()<=20000) ||
				params.get("errorToken")!=null);
	}
	/**
	 * 判断数据库中accesstoken过期
	 */
	public boolean isDbTokenExpired(Map<String, Object> catch_params , Map<String, Object> db_params){
		return (db_params == null ||
				(catch_params.get("errorToken")!=null && db_params.get("accessToken")!=null &&
						catch_params.get("errorToken").toString().equals(db_params.get("accessToken").toString())));
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值