package me.chanjar.weixin.cp.api;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpHost;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.CloseableHttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
import com.google.gson.reflect.TypeToken;
import me.chanjar.weixin.common.bean.WxAccessToken;
import me.chanjar.weixin.common.bean.WxJsapiSignature;
import me.chanjar.weixin.common.bean.menu.WxMenu;
import me.chanjar.weixin.common.bean.result.WxError;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.session.StandardSessionManager;
import me.chanjar.weixin.common.session.WxSession;
import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.common.util.RandomUtils;
import me.chanjar.weixin.common.util.StringUtils;
import me.chanjar.weixin.common.util.crypto.SHA1;
import me.chanjar.weixin.common.util.fs.FileUtils;
import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder;
import me.chanjar.weixin.common.util.http.DefaultApacheHttpClientBuilder;
import me.chanjar.weixin.common.util.http.MediaDownloadRequestExecutor;
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
import me.chanjar.weixin.common.util.http.RequestExecutor;
import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
import me.chanjar.weixin.common.util.http.URIUtil;
import me.chanjar.weixin.common.util.json.GsonHelper;
import me.chanjar.weixin.cp.bean.WxCpDepart;
import me.chanjar.weixin.cp.bean.WxCpMessage;
import me.chanjar.weixin.cp.bean.WxCpTag;
import me.chanjar.weixin.cp.bean.WxCpUser;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
public class WxCpServiceImpl implements WxCpService {
protected final Logger log = LoggerFactory.getLogger(WxCpServiceImpl.class);
/**
* 全局的是否正在刷新access token的锁
*/
protected final Object globalAccessTokenRefreshLock = new Object();
/**
* 全局的是否正在刷新jsapi_ticket的锁
*/
protected final Object globalJsapiTicketRefreshLock = new Object();
protected WxCpConfigStorage configStorage;
protected CloseableHttpClient httpClient;
protected HttpHost httpProxy;
protected WxSessionManager sessionManager = new StandardSessionManager();
/**
* 临时文件目录
*/
protected File tmpDirFile;
private int retrySleepMillis = 1000;
private int maxRetryTimes = 5;
@Override
public boolean checkSignature(String msgSignature, String timestamp, String nonce, String data) {
try {
return SHA1.gen(this.configStorage.getToken(), timestamp, nonce, data)
.equals(msgSignature);
} catch (Exception e) {
return false;
}
}
@Override
public void userAuthenticated(String userId) throws WxErrorException {
String url = "https://qyapi.weixin.qq.com/cgi-bin/user/authsucc?userid=" + userId;
get(url, null);
}
@Override
public String getAccessToken() throws WxErrorException {
return getAccessToken(false);
}
@Override
public String getAccessToken(boolean forceRefresh) throws WxErrorException {
if (forceRefresh) {
this.configStorage.expireAccessToken();
}
if (this.configStorage.isAccessTokenExpired()) {
synchronized (this.globalAccessTokenRefreshLock) {
if (this.configStorage.isAccessTokenExpired()) {
String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?"
+ "&corpid=" + this.configStorage.getCorpId()
+ "&corpsecret=" + this.configStorage.getCorpSecret();
try {
HttpGet httpGet = new HttpGet(url);
if (this.httpProxy != null) {
RequestConfig config = RequestConfig.custom()
.setProxy(this.httpProxy).build();
httpGet.setConfig(config);
}
String resultContent = null;
CloseableHttpClient httpclient = getHttpclient();
CloseableHttpResponse response = httpclient.execute(httpGet);
try {
resultContent = new BasicResponseHandler().handleResponse(response);
} finally {
IOUtils.closeQuietly(response);
IOUtils.closeQuietly(httpclient);
httpGet.releaseConnection();
}
WxError error = WxError.fromJson(resultContent);
if (error.getErrorCode() != 0) {
throw new WxErrorException(error);
}
WxAccessToken accessToken = WxAccessToken.fromJson(resultContent);
this.configStorage.updateAccessToken(
accessToken.getAccessToken(), accessToken.getExpiresIn());
} catch (ClientProtocolException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
return this.configStorage.getAccessToken();
}
@Override
public String getJsapiTicket() throws WxErrorException {
return getJsapiTicket(false);
}
@Override
public String getJsapiTicket(boolean forceRefresh) throws WxErrorException {
if (forceRefresh) {
this.configStorage.expireJsapiTicket();
}
if (this.configStorage.isJsapiTicketExpired()) {
synchronized (this.globalJsapiTicketRefreshLock) {
if (this.configStorage.isJsapiTicketExpired()) {
String url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket";
String responseContent = execute(new SimpleGetRequestExecutor(), url, null);
JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject();
String jsapiTicket = tmpJsonObject.get("ticket").getAsString();
int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
this.configStorage.updateJsapiTicket(jsapiTicket,
expiresInSeconds);
}
}
}
return this.configStorage.getJsapiTicket();
}
@Override
public WxJsapiSignature createJsapiSignature(String url) throws WxErrorException {
long timestamp = System.currentTimeMillis() / 1000;
String noncestr = RandomUtils.getRandomStr();
String jsapiTicket = getJsapiTicket(false);
String signature = SHA1.genWithAmple(
"jsapi_ticket=" + jsapiTicket,
"noncestr=" + noncestr,
"timestamp=" + timestamp,
"url=" + url
);
WxJsapiSignature jsapiSignature = new WxJsapiSignature();
jsapiSignature.setTimestamp(timestamp);
jsapiSignature.setNoncestr(noncestr);
jsapiSignature.setUrl(url);
jsapiSignature.setSignature(signature);
// Fixed bug
jsapiSignature.setAppid(this.configStorage.getCorpId());
return jsapiSignature;
}
@Override
public void messageSend(WxCpMessage message) throws WxErrorException {
String url = "https://qyapi.weixin.qq.com/cgi-bin/message/send";
post(url, message.toJson());
}
@Override
public void menuCreate(WxMenu menu) throws WxErrorException {
menuCreate(this.configStorage.getAgentId(), menu);
}
@Override
public void menuCreate(String agentId, WxMenu menu) throws WxErrorException {
String url = "https://qyapi.weixin.qq.com/cgi-bin/menu/create?agentid="
+ this.configStorage.getAgentId();
post(url, menu.t
没有合适的资源?快使用搜索试试~ 我知道了~
WxJava-for-JDK6-master.zip
共357个文件
java:326个
xml:12个
gradle:5个
需积分: 1 0 下载量 137 浏览量
2023-08-17
12:05:54
上传
评论
收藏 1.55MB ZIP 举报
温馨提示
WxJava-for-JDK6-master.zip
资源推荐
资源详情
资源评论
收起资源包目录
WxJava-for-JDK6-master.zip (357个子文件)
.editorconfig 230B
.gitignore 345B
build.gradle 1KB
build.gradle 636B
build.gradle 608B
build.gradle 565B
settings.gradle 352B
WxCpServiceImpl.java 25KB
WxMpServiceImpl.java 22KB
WxMpXmlMessage.java 19KB
WxCpService.java 17KB
WxCpXmlMessage.java 16KB
WxUnifiedOrderRequest.java 15KB
WxMpMaterialServiceImplTest.java 14KB
WxMpStoreBaseInfo.java 14KB
WxMpPayServiceImpl.java 13KB
WxMpService.java 12KB
WxMpDataCubeService.java 10KB
WxDataCubeArticleTotalDetail.java 10KB
WxCpMessageRouterTest.java 10KB
WxCryptUtil.java 10KB
WxMpMessageRouterTest.java 10KB
WxMpCardServiceImpl.java 9KB
WxMpXmlMessageTest.java 9KB
WxMpDataCubeServiceImpl.java 9KB
StandardSession.java 9KB
WxConsts.java 8KB
StringManager.java 8KB
WxMpKefuService.java 8KB
StandardSessionManager.java 8KB
WxMpMessageRouterRule.java 8KB
WxMpDataCubeServiceImplTest.java 8KB
WxMpMessageRouter.java 8KB
WxCpMessageRouterRule.java 8KB
WxMpMassMessageAPITest.java 8KB
WxCpMessageRouter.java 8KB
WxMpKefuServiceImpl.java 7KB
WxMpKefuServiceImplTest.java 7KB
WxMpPayCallback.java 7KB
WxCpJedisConfigStorage.java 7KB
WxMpMaterialService.java 7KB
DefaultApacheHttpClientBuilder.java 7KB
WxMpMaterialServiceImpl.java 7KB
WxMpInMemoryConfigStorage.java 6KB
WxMpCustomMessageTest.java 6KB
WxSendRedpackRequest.java 6KB
WxMpPayRefundResult.java 5KB
WxMpStoreService.java 5KB
WxMpPayResult.java 5KB
WxDataCubeArticleResult.java 5KB
WxCpInMemoryConfigStorage.java 5KB
WxMpStoreServiceImpl.java 5KB
WxMpGsonBuilder.java 5KB
WxCryptUtilTest.java 5KB
XStreamTransformer.java 5KB
WxMpUserTagServiceImpl.java 5KB
WxMpCustomMessage.java 5KB
WxMenuTest.java 5KB
WxEntPayRequest.java 5KB
WxCpXmlMessageTest.java 5KB
WxCpMessage.java 5KB
WxCpMessageTest.java 5KB
WxMpUserQuery.java 4KB
WxMpCardService.java 4KB
WxMenuGsonAdapter.java 4KB
WxMpMaterialNews.java 4KB
WxMpPayService.java 4KB
WxCpUserGsonAdapter.java 4KB
WxMpMenuServiceImplTest.java 4KB
GsonHelper.java 4KB
WxMpServiceImplTest.java 4KB
SessionTest.java 4KB
WxMpQrcodeServiceImpl.java 4KB
WxMpMaterialNewsArticleGsonAdapter.java 4KB
WxMpMassNews.java 4KB
WxMpUser.java 4KB
WxMpCustomMessageGsonAdapter.java 4KB
DemoGuessNumberHandler.java 4KB
XStreamTransformer.java 4KB
WxMpKfInfo.java 4KB
InternalSessionManager.java 4KB
WxCpXmlOutNewsMessageTest.java 3KB
WxEntPayResult.java 3KB
WxMpUserTagService.java 3KB
MediaDownloadRequestExecutor.java 3KB
WxCpMessageGsonAdapter.java 3KB
WxCpDemoServer.java 3KB
WxXmlOutNewsMessageTest.java 3KB
WxMpMassNewsArticleGsonAdapter.java 3KB
WxDataCubeMsgResult.java 3KB
WxCpUser.java 3KB
StringUtils.java 3KB
WxMpCardServiceImplTest.java 3KB
WxUnifiedOrderResult.java 3KB
WxMpEndpointServlet.java 3KB
WxMpXmlOutMusicMessage.java 3KB
WxMpXmlOutMessage.java 3KB
WxMpStoreServiceImplTest.java 3KB
WxMpTemplateMessage.java 3KB
WxMpXmlOutTransferCustomerServiceMessageTest.java 3KB
共 357 条
- 1
- 2
- 3
- 4
资源评论
hello_中年人
- 粉丝: 7
- 资源: 324
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功