java对微信分享页面进行签名

第一步:获取公众号的access_token,记得将access_token进行缓存,这个每天只有2000次访问限制。

/**
 * 获取微信access_token
 * @return
 * @throws BusinessException
 * @return Object ,true:已关注,false:未关注
 * @author tyg
 * @date   2019年1月14日上午11:51:05
 */
@Override
public String getAccessToken() {
	String access_token = null;
	try {
	//查询是否还有缓存
		BoundValueOperations<String, String> ops = redisTemplate.boundValueOps(CacheUnifiedEnum.accessToken.getKey());
		//缓存时长
		if(StringUtils.isBlank(ops.get()) || ops.getExpire().longValue() < 20L) {
			Map<String, String> params = new HashMap<String, String>();
			params.put("grant_type", "client_credential");
			params.put("appid", "wx12fdsf4a5f4d6");
			params.put("secret", "fdf456f46fd");
			String respData = HttpUtils.sendGet("https://api.weixin.qq.com/cgi-bin/token", params);
			System.out.println("getaccess_token=====\n"+respData);
			json = JSON.parseObject(respData);
			ops.set(json.getString("access_token"));
			ops.expire(CacheUnifiedEnum.accessToken.getTime(), TimeUnit.SECONDS);
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
	return access_token;
}

第二步:获取微信票据签名。

/**
 * 获取微信jsapi_ticket
 * @return
 * @throws BusinessException
 * @return JSONObject
 * @author tyg
 * @date   2019年5月8日下午7:18:59
 */
public String getJsapiTicket() {
	String jsapi_ticket = null;
	try {
		String respData;
		JSONObject json = new JSONObject();
		BoundValueOperations<String, String> ops = redisTemplate.boundValueOps(CacheUnifiedEnum.jsapiTicket.getKey());
		//缓存时长
		if(StringUtils.isBlank(ops.get()) || ops.getExpire().longValue() < 20L) {
			Map<String, String> params = new HashMap<String, String>();
			params.put("access_token", this.getAccessToken());
			params.put("type", "jsapi");
			respData = HttpUtils.sendGet("https://api.weixin.qq.com/cgi-bin/ticket/getticket", params);
			System.out.println("getjsapi_ticket=====\n"+respData);
			json = JSON.parseObject(respData);
			ops.set(json.getString("ticket"));
			ops.expire(CacheUnifiedEnum.jsapiTicket.getTime(), TimeUnit.SECONDS);
		}
		jsapi_ticket = ops.get();
	} catch (Exception e) {
		e.printStackTrace();
	}
	return jsapi_ticket;
}

第三步:要把当前的页面地址进行签名。


/**
 * 微信分享进行签名
 * @param currentUrl
 * @return
 * @throws BusinessException
 * @return JSONObject
 * @author tyg
 * @date   2019年5月8日下午7:18:59
 */
@Override
public JSONObject getSignature(String currentUrl) throws BusinessException {
	JSONObject jssdk = null;
	try {
		String noncestr = UUID.randomUUID().toString();// 随机字符串
		String jsapi_ticket = getStoreDistributionJsapiTicket();// 调用微信JS接口的临时票据
		Long timestamp = new Date().getTime() / 1000;// 时间戳
		
		// 注意这里参数名必须全部小写,且必须有序
		String string1 = String.format("jsapi_ticket=%s&noncestr=%s&timestamp=%s&url=%s", jsapi_ticket, noncestr, timestamp, currentUrl);
		
		MessageDigest crypt = MessageDigest.getInstance("SHA-1");
		crypt.reset();
		crypt.update(string1.getBytes("UTF-8"));
		String signature = byteToHex(crypt.digest());
		
		jssdk = new JSONObject();
		jssdk.put("appId", "wx13458f4d89sffdsfd");
		jssdk.put("timestamp", timestamp);
		jssdk.put("nonceStr", noncestr);
		jssdk.put("signature", signature);
	} catch (Exception e) {
		e.printStackTrace();
		logI.addErrorLog(currentUrl, ErrorLogEnum.微信信息, "获取微信签名信息", e);
		Assert.throwException("无法获取微信签名信息!");
	}
	return jssdk;
}

 

上一篇:【02】Redis for OPS:消息订阅和事务管理


下一篇:通过linux的shell脚本批量处理交换机配置变更