Commit 17a61670 authored by shiyu's avatar shiyu

1

parent 63de9a3c
package com.wwdz.ch.core.api; package com.wwdz.ch.core.api;
import com.wwdz.ch.core.entity.ConsignSaleSubscribeMsg; import com.wwdz.ch.core.entity.ConsignSaleSubscribeMsg;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.util.OkHttpUtil; import com.wwdz.ch.core.util.OkHttpUtil;
import com.wwdz.ch.core.util.RedisUtils; import com.wwdz.ch.core.util.RedisUtils;
import com.xxdxxs.utils.JsonUtils; import com.xxdxxs.utils.JsonUtils;
...@@ -10,8 +11,12 @@ import org.slf4j.LoggerFactory; ...@@ -10,8 +11,12 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.security.MessageDigest;
import java.util.Formatter;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
...@@ -26,7 +31,7 @@ public class OfficialAccountApi { ...@@ -26,7 +31,7 @@ public class OfficialAccountApi {
private final static String SEND_MSG_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send"; private final static String SEND_MSG_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send";
private final static String GET_JSAPI_TICKET = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
/** /**
* 测试环境和正式环境的url不同,相互隔离不会冲突 * 测试环境和正式环境的url不同,相互隔离不会冲突
...@@ -175,6 +180,95 @@ public class OfficialAccountApi { ...@@ -175,6 +180,95 @@ public class OfficialAccountApi {
} }
public String getJsapiTicket() {
String key = OFFICIAL_ACCOUNT_APPID + "_jsapi_ticket";
String ticket = redisUtils.hasKey(key)? redisUtils.get(key).toString() : null;
if (StringUtils.isEmpty(ticket)) {
String token = getAccessToken();
String url = GET_JSAPI_TICKET + "?access_token=" + token + "&type=jsapi";
OkHttpUtil okHttpUtil = OkHttpUtil.builder().url(url);
okHttpUtil.get();
String responseStr = okHttpUtil.async();
logger.info("获取JsapiTicket接口返回原文 :{}", responseStr);
if (!responseStr.contains("ticket")) {
String errorCode = JsonUtils.getValueByPath(responseStr, "errcode");
String errmsg = JsonUtils.getValueByPath(responseStr, "errmsg");
//token失效
if (("40001").equals(errorCode)) {
refreshAccessToken();
}
logger.error(">>>>>>>> 获取JsapiTicket失败: {} ", errmsg);
} else {
ticket = JsonUtils.getValueByPath(responseStr, "ticket");
String expires_in = JsonUtils.getValueByPath(responseStr, "expires_in");
redisUtils.set(key, ticket, Long.valueOf(expires_in) - 10, TimeUnit.SECONDS);
}
}
return ticket;
}
public Result getSignature(String url) {
try {
String ticket = getJsapiTicket();
Map<String, String> map = new HashMap();
String nonce_str = create_nonce_str();
String timestamp = create_timestamp();
//注意这里参数名必须全部小写,且必须有序
String str = "jsapi_ticket=" + ticket +
"&noncestr=" + nonce_str +
"&timestamp=" + timestamp +
"&url=" + url;
logger.info("公众号生成jsapi签名原串 : {}", str);
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(str.getBytes("UTF-8"));
String signature = byteToHex(crypt.digest());
map.put("url", url);
map.put("jsapi_ticket", ticket);
map.put("nonceStr", nonce_str);
map.put("timestamp", timestamp);
map.put("signature", signature);
map.put("appId", OFFICIAL_ACCOUNT_APPID);//公众号appid
logger.info("获取签名返回的数据 : {}", map);
return Result.success(map);
} catch (Exception e) {
logger.error("获取公众号jsapi签名 error :{}", e);
}
return Result.failed();
}
/**
* 随机加密
* @param hash
* @return
*/
private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash)
{
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
/**
* 产生随机串--由程序自己随机产生
* @return
*/
private String create_nonce_str() {
return UUID.randomUUID().toString();
}
/**
* 由程序自己获取当前时间
* @return
*/
private static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment