| @@ -5,7 +5,7 @@ | |||||
| <modelVersion>4.0.0</modelVersion> | <modelVersion>4.0.0</modelVersion> | ||||
| <groupId>com.github.binarywang</groupId> | <groupId>com.github.binarywang</groupId> | ||||
| <artifactId>weixin-java-parent</artifactId> | <artifactId>weixin-java-parent</artifactId> | ||||
| <version>2.6.0</version> | |||||
| <version>2.7.0-SNAPSHOT</version> | |||||
| <packaging>pom</packaging> | <packaging>pom</packaging> | ||||
| <name>WeiXin Java Tools - Parent</name> | <name>WeiXin Java Tools - Parent</name> | ||||
| <description>微信公众号、企业号上级POM</description> | <description>微信公众号、企业号上级POM</description> | ||||
| @@ -52,7 +52,7 @@ | |||||
| --------------------------------- | --------------------------------- | ||||
| ## Maven & Gradle 最新正式版本 | ## Maven & Gradle 最新正式版本 | ||||
| * 微信支付(暂时为测试版本): | |||||
| * 微信支付: | |||||
| maven: | maven: | ||||
| ```xml | ```xml | ||||
| @@ -6,7 +6,7 @@ | |||||
| <parent> | <parent> | ||||
| <groupId>com.github.binarywang</groupId> | <groupId>com.github.binarywang</groupId> | ||||
| <artifactId>weixin-java-parent</artifactId> | <artifactId>weixin-java-parent</artifactId> | ||||
| <version>2.6.0</version> | |||||
| <version>2.7.0-SNAPSHOT</version> | |||||
| </parent> | </parent> | ||||
| <artifactId>weixin-java-common</artifactId> | <artifactId>weixin-java-common</artifactId> | ||||
| @@ -39,6 +39,11 @@ | |||||
| <artifactId>jetty-servlet</artifactId> | <artifactId>jetty-servlet</artifactId> | ||||
| <scope>test</scope> | <scope>test</scope> | ||||
| </dependency> | </dependency> | ||||
| <dependency> | |||||
| <groupId>org.jodd</groupId> | |||||
| <artifactId>jodd-http</artifactId> | |||||
| <version>3.7</version> | |||||
| </dependency> | |||||
| </dependencies> | </dependencies> | ||||
| <build> | <build> | ||||
| @@ -10,6 +10,7 @@ import me.chanjar.weixin.common.exception.WxErrorException; | |||||
| import me.chanjar.weixin.common.util.fs.FileUtils; | import me.chanjar.weixin.common.util.fs.FileUtils; | ||||
| import me.chanjar.weixin.common.util.http.apache.InputStreamResponseHandler; | import me.chanjar.weixin.common.util.http.apache.InputStreamResponseHandler; | ||||
| import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | ||||
| import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | ||||
| import okhttp3.*; | import okhttp3.*; | ||||
| @@ -111,7 +112,7 @@ public class MediaDownloadRequestExecutor extends AbstractRequestExecutor<File, | |||||
| } | } | ||||
| } | } | ||||
| String fileName = getFileName(response); | |||||
| String fileName = getFileNameApache(response); | |||||
| if (StringUtils.isBlank(fileName)) { | if (StringUtils.isBlank(fileName)) { | ||||
| return null; | return null; | ||||
| } | } | ||||
| @@ -128,7 +129,6 @@ public class MediaDownloadRequestExecutor extends AbstractRequestExecutor<File, | |||||
| /** | /** | ||||
| * jodd-http实现方式 | * jodd-http实现方式 | ||||
| * | |||||
| * @param provider | * @param provider | ||||
| * @param proxyInfo | * @param proxyInfo | ||||
| * @param uri | * @param uri | ||||
| @@ -237,7 +237,23 @@ public class MediaDownloadRequestExecutor extends AbstractRequestExecutor<File, | |||||
| if (m.matches()) { | if (m.matches()) { | ||||
| return m.group(1); | return m.group(1); | ||||
| } | } | ||||
| throw new WxErrorException(WxError.newBuilder().setErrorMsg("无法获取到文件名").build()); | |||||
| request.withConnectionProvider(provider); | |||||
| HttpResponse response = request.send(); | |||||
| String contentType = response.header("Content-Type"); | |||||
| if (contentType != null && contentType.startsWith("application/json")) { | |||||
| // application/json; encoding=utf-8 下载媒体文件出错 | |||||
| throw new WxErrorException(WxError.fromJson(response.bodyText())); | |||||
| } | |||||
| String fileName = getFileNameJodd(response); | |||||
| if (StringUtils.isBlank(fileName)) { | |||||
| return null; | |||||
| } | |||||
| InputStream inputStream = new ByteArrayInputStream(response.bodyBytes()); | |||||
| String[] nameAndExt = fileName.split("\\."); | |||||
| return FileUtils.createTmpFile(inputStream, nameAndExt[0], nameAndExt[1], this.tmpDirFile); | |||||
| } | } | ||||
| } | } | ||||
| @@ -8,6 +8,7 @@ import me.chanjar.weixin.common.bean.result.WxError; | |||||
| import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | ||||
| import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
| import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | ||||
| import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | ||||
| import okhttp3.*; | import okhttp3.*; | ||||
| @@ -3,6 +3,7 @@ package me.chanjar.weixin.common.util.http; | |||||
| import jodd.http.HttpConnectionProvider; | import jodd.http.HttpConnectionProvider; | ||||
| import jodd.http.ProxyInfo; | import jodd.http.ProxyInfo; | ||||
| import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
| import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | ||||
| import okhttp3.ConnectionPool; | import okhttp3.ConnectionPool; | ||||
| @@ -63,5 +64,4 @@ public interface RequestExecutor<T, E> { | |||||
| */ | */ | ||||
| T executeOkhttp(ConnectionPool pool, final OkhttpProxyInfo proxyInfo, String uri, E data) throws WxErrorException, IOException; | T executeOkhttp(ConnectionPool pool, final OkhttpProxyInfo proxyInfo, String uri, E data) throws WxErrorException, IOException; | ||||
| } | } | ||||
| @@ -7,6 +7,7 @@ import jodd.http.ProxyInfo; | |||||
| import me.chanjar.weixin.common.bean.result.WxError; | import me.chanjar.weixin.common.bean.result.WxError; | ||||
| import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
| import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | ||||
| import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | ||||
| import okhttp3.*; | import okhttp3.*; | ||||
| @@ -28,6 +29,7 @@ import java.util.concurrent.TimeUnit; | |||||
| */ | */ | ||||
| public class SimpleGetRequestExecutor extends AbstractRequestExecutor<String, String> { | public class SimpleGetRequestExecutor extends AbstractRequestExecutor<String, String> { | ||||
| /** | /** | ||||
| * apache-http实现方式 | * apache-http实现方式 | ||||
| * | * | ||||
| @@ -98,6 +100,7 @@ public class SimpleGetRequestExecutor extends AbstractRequestExecutor<String, St | |||||
| return responseContent; | return responseContent; | ||||
| } | } | ||||
| /** | /** | ||||
| * okHttp实现方式 | * okHttp实现方式 | ||||
| * | * | ||||
| @@ -146,5 +149,4 @@ public class SimpleGetRequestExecutor extends AbstractRequestExecutor<String, St | |||||
| return responseContent; | return responseContent; | ||||
| } | } | ||||
| } | } | ||||
| @@ -7,6 +7,7 @@ import jodd.http.ProxyInfo; | |||||
| import me.chanjar.weixin.common.bean.result.WxError; | import me.chanjar.weixin.common.bean.result.WxError; | ||||
| import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
| import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | ||||
| import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | ||||
| import okhttp3.*; | import okhttp3.*; | ||||
| @@ -40,6 +41,7 @@ public class SimplePostRequestExecutor extends AbstractRequestExecutor<String, S | |||||
| * @throws IOException | * @throws IOException | ||||
| */ | */ | ||||
| public String executeApache(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, String postEntity) throws WxErrorException, IOException { | public String executeApache(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, String postEntity) throws WxErrorException, IOException { | ||||
| HttpPost httpPost = new HttpPost(uri); | HttpPost httpPost = new HttpPost(uri); | ||||
| if (httpProxy != null) { | if (httpProxy != null) { | ||||
| RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); | RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); | ||||
| @@ -6,7 +6,7 @@ | |||||
| <parent> | <parent> | ||||
| <groupId>com.github.binarywang</groupId> | <groupId>com.github.binarywang</groupId> | ||||
| <artifactId>weixin-java-parent</artifactId> | <artifactId>weixin-java-parent</artifactId> | ||||
| <version>2.6.0</version> | |||||
| <version>2.7.0-SNAPSHOT</version> | |||||
| </parent> | </parent> | ||||
| <artifactId>weixin-java-cp</artifactId> | <artifactId>weixin-java-cp</artifactId> | ||||
| @@ -1,6 +1,5 @@ | |||||
| package me.chanjar.weixin.cp.api.impl.apache; | package me.chanjar.weixin.cp.api.impl.apache; | ||||
| import me.chanjar.weixin.common.bean.WxAccessToken; | import me.chanjar.weixin.common.bean.WxAccessToken; | ||||
| import me.chanjar.weixin.common.bean.result.WxError; | import me.chanjar.weixin.common.bean.result.WxError; | ||||
| import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
| @@ -8,6 +7,7 @@ import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; | |||||
| import me.chanjar.weixin.common.util.http.apache.DefaultApacheHttpClientBuilder; | import me.chanjar.weixin.common.util.http.apache.DefaultApacheHttpClientBuilder; | ||||
| import me.chanjar.weixin.cp.api.impl.AbstractWxCpService; | import me.chanjar.weixin.cp.api.impl.AbstractWxCpService; | ||||
| import org.apache.http.HttpHost; | import org.apache.http.HttpHost; | ||||
| import org.apache.http.client.config.RequestConfig; | import org.apache.http.client.config.RequestConfig; | ||||
| import org.apache.http.client.methods.CloseableHttpResponse; | import org.apache.http.client.methods.CloseableHttpResponse; | ||||
| @@ -73,6 +73,7 @@ public class WxCpServiceImpl extends AbstractWxCpService<CloseableHttpClient, Ht | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void initHttp() { | public void initHttp() { | ||||
| ApacheHttpClientBuilder apacheHttpClientBuilder = this.configStorage | ApacheHttpClientBuilder apacheHttpClientBuilder = this.configStorage | ||||
| .getApacheHttpClientBuilder(); | .getApacheHttpClientBuilder(); | ||||
| @@ -91,4 +92,5 @@ public class WxCpServiceImpl extends AbstractWxCpService<CloseableHttpClient, Ht | |||||
| this.httpClient = apacheHttpClientBuilder.build(); | this.httpClient = apacheHttpClientBuilder.build(); | ||||
| } | } | ||||
| } | } | ||||
| @@ -19,6 +19,7 @@ public class WxCpServiceImpl extends AbstractWxCpService<HttpConnectionProvider, | |||||
| @Override | @Override | ||||
| public ProxyInfo getRequestHttpProxy() { | public ProxyInfo getRequestHttpProxy() { | ||||
| return httpProxy; | return httpProxy; | ||||
| } | } | ||||
| @Override | @Override | ||||
| @@ -56,10 +57,12 @@ public class WxCpServiceImpl extends AbstractWxCpService<HttpConnectionProvider, | |||||
| @Override | @Override | ||||
| public void initHttp() { | public void initHttp() { | ||||
| if (this.configStorage.getHttpProxyHost() != null && this.configStorage.getHttpProxyPort() > 0) { | if (this.configStorage.getHttpProxyHost() != null && this.configStorage.getHttpProxyPort() > 0) { | ||||
| httpProxy = new ProxyInfo(ProxyInfo.ProxyType.HTTP, configStorage.getHttpProxyHost(), configStorage.getHttpProxyPort(), configStorage.getHttpProxyUsername(), configStorage.getHttpProxyPassword()); | httpProxy = new ProxyInfo(ProxyInfo.ProxyType.HTTP, configStorage.getHttpProxyHost(), configStorage.getHttpProxyPort(), configStorage.getHttpProxyUsername(), configStorage.getHttpProxyPassword()); | ||||
| } | } | ||||
| httpClient = JoddHttp.httpConnectionProvider; | httpClient = JoddHttp.httpConnectionProvider; | ||||
| } | } | ||||
| } | } | ||||
| @@ -61,6 +61,10 @@ public class WxCpMessageGsonAdapter implements JsonSerializer<WxCpMessage> { | |||||
| messageJson.add("voice", voice); | messageJson.add("voice", voice); | ||||
| } | } | ||||
| if (StringUtils.isNotBlank(message.getSafe())) { | |||||
| messageJson.addProperty("safe", message.getSafe()); | |||||
| } | |||||
| if (WxConsts.CUSTOM_MSG_VIDEO.equals(message.getMsgType())) { | if (WxConsts.CUSTOM_MSG_VIDEO.equals(message.getMsgType())) { | ||||
| JsonObject video = new JsonObject(); | JsonObject video = new JsonObject(); | ||||
| video.addProperty("media_id", message.getMediaId()); | video.addProperty("media_id", message.getMediaId()); | ||||
| @@ -6,7 +6,7 @@ | |||||
| <parent> | <parent> | ||||
| <groupId>com.github.binarywang</groupId> | <groupId>com.github.binarywang</groupId> | ||||
| <artifactId>weixin-java-parent</artifactId> | <artifactId>weixin-java-parent</artifactId> | ||||
| <version>2.6.0</version> | |||||
| <version>2.7.0-SNAPSHOT</version> | |||||
| </parent> | </parent> | ||||
| <artifactId>weixin-java-mp</artifactId> | <artifactId>weixin-java-mp</artifactId> | ||||
| <name>WeiXin Java Tools - MP</name> | <name>WeiXin Java Tools - MP</name> | ||||
| @@ -350,4 +350,5 @@ public interface WxMpService { | |||||
| */ | */ | ||||
| void initHttp(); | void initHttp(); | ||||
| } | } | ||||
| @@ -1,5 +1,6 @@ | |||||
| package me.chanjar.weixin.mp.api.impl.apache; | package me.chanjar.weixin.mp.api.impl.apache; | ||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.util.concurrent.locks.Lock; | import java.util.concurrent.locks.Lock; | ||||
| @@ -71,11 +72,13 @@ public class WxMpServiceImpl extends AbstractWxMpService<CloseableHttpClient,Htt | |||||
| + this.getWxMpConfigStorage().getSecret(); | + this.getWxMpConfigStorage().getSecret(); | ||||
| try { | try { | ||||
| HttpGet httpGet = new HttpGet(url); | HttpGet httpGet = new HttpGet(url); | ||||
| if (this.getRequestHttpProxy() != null) { | if (this.getRequestHttpProxy() != null) { | ||||
| RequestConfig config = RequestConfig.custom().setProxy(this.getRequestHttpProxy()).build(); | RequestConfig config = RequestConfig.custom().setProxy(this.getRequestHttpProxy()).build(); | ||||
| httpGet.setConfig(config); | httpGet.setConfig(config); | ||||
| } | } | ||||
| try (CloseableHttpResponse response = getRequestHttpClient().execute(httpGet)) { | try (CloseableHttpResponse response = getRequestHttpClient().execute(httpGet)) { | ||||
| String resultContent = new BasicResponseHandler().handleResponse(response); | String resultContent = new BasicResponseHandler().handleResponse(response); | ||||
| WxError error = WxError.fromJson(resultContent); | WxError error = WxError.fromJson(resultContent); | ||||
| if (error.getErrorCode() != 0) { | if (error.getErrorCode() != 0) { | ||||
| @@ -96,4 +99,5 @@ public class WxMpServiceImpl extends AbstractWxMpService<CloseableHttpClient,Htt | |||||
| } | } | ||||
| return this.getWxMpConfigStorage().getAccessToken(); | return this.getWxMpConfigStorage().getAccessToken(); | ||||
| } | } | ||||
| } | } | ||||
| @@ -1,6 +1,5 @@ | |||||
| package me.chanjar.weixin.mp.api.impl.jodd; | package me.chanjar.weixin.mp.api.impl.jodd; | ||||
| import jodd.http.*; | import jodd.http.*; | ||||
| import jodd.http.net.SocketHttpConnectionProvider; | import jodd.http.net.SocketHttpConnectionProvider; | ||||
| import me.chanjar.weixin.common.bean.WxAccessToken; | import me.chanjar.weixin.common.bean.WxAccessToken; | ||||
| @@ -30,6 +29,7 @@ public class WxMpServiceImpl extends AbstractWxMpService<HttpConnectionProvider, | |||||
| @Override | @Override | ||||
| public void initHttp() { | public void initHttp() { | ||||
| WxMpConfigStorage configStorage = this.getWxMpConfigStorage(); | WxMpConfigStorage configStorage = this.getWxMpConfigStorage(); | ||||
| if (configStorage.getHttpProxyHost() != null && configStorage.getHttpProxyPort() > 0) { | if (configStorage.getHttpProxyHost() != null && configStorage.getHttpProxyPort() > 0) { | ||||
| @@ -40,7 +40,6 @@ public class WxMpServiceImpl extends AbstractWxMpService<HttpConnectionProvider, | |||||
| } | } | ||||
| @Override | @Override | ||||
| public String getAccessToken(boolean forceRefresh) throws WxErrorException { | public String getAccessToken(boolean forceRefresh) throws WxErrorException { | ||||
| Lock lock = this.getWxMpConfigStorage().getAccessTokenLock(); | Lock lock = this.getWxMpConfigStorage().getAccessTokenLock(); | ||||
| @@ -57,9 +56,11 @@ public class WxMpServiceImpl extends AbstractWxMpService<HttpConnectionProvider, | |||||
| + this.getWxMpConfigStorage().getSecret(); | + this.getWxMpConfigStorage().getSecret(); | ||||
| HttpRequest request = HttpRequest.get(url); | HttpRequest request = HttpRequest.get(url); | ||||
| if (this.getRequestHttpProxy() != null) { | if (this.getRequestHttpProxy() != null) { | ||||
| SocketHttpConnectionProvider provider = new SocketHttpConnectionProvider(); | SocketHttpConnectionProvider provider = new SocketHttpConnectionProvider(); | ||||
| provider.useProxy(getRequestHttpProxy()); | provider.useProxy(getRequestHttpProxy()); | ||||
| request.withConnectionProvider(provider); | request.withConnectionProvider(provider); | ||||
| } | } | ||||
| HttpResponse response = request.send(); | HttpResponse response = request.send(); | ||||
| @@ -77,4 +78,5 @@ public class WxMpServiceImpl extends AbstractWxMpService<HttpConnectionProvider, | |||||
| } | } | ||||
| return this.getWxMpConfigStorage().getAccessToken(); | return this.getWxMpConfigStorage().getAccessToken(); | ||||
| } | } | ||||
| } | } | ||||
| @@ -10,7 +10,9 @@ import me.chanjar.weixin.common.util.http.AbstractRequestExecutor; | |||||
| import me.chanjar.weixin.common.util.http.RequestExecutor; | import me.chanjar.weixin.common.util.http.RequestExecutor; | ||||
| import me.chanjar.weixin.common.util.http.RequestHttp; | import me.chanjar.weixin.common.util.http.RequestHttp; | ||||
| import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | ||||
| import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | ||||
| import me.chanjar.weixin.common.util.json.WxGsonBuilder; | import me.chanjar.weixin.common.util.json.WxGsonBuilder; | ||||
| import okhttp3.*; | import okhttp3.*; | ||||
| @@ -57,6 +59,7 @@ public class MaterialDeleteRequestExecutor extends AbstractRequestExecutor<Boole | |||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public Boolean executeJodd(HttpConnectionProvider provider, ProxyInfo proxyInfo, String uri, String materialId) throws WxErrorException, IOException { | public Boolean executeJodd(HttpConnectionProvider provider, ProxyInfo proxyInfo, String uri, String materialId) throws WxErrorException, IOException { | ||||
| HttpRequest request = HttpRequest.post(uri); | HttpRequest request = HttpRequest.post(uri); | ||||
| @@ -108,5 +111,4 @@ public class MaterialDeleteRequestExecutor extends AbstractRequestExecutor<Boole | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -10,7 +10,9 @@ import me.chanjar.weixin.common.util.http.AbstractRequestExecutor; | |||||
| import me.chanjar.weixin.common.util.http.RequestExecutor; | import me.chanjar.weixin.common.util.http.RequestExecutor; | ||||
| import me.chanjar.weixin.common.util.http.RequestHttp; | import me.chanjar.weixin.common.util.http.RequestHttp; | ||||
| import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | ||||
| import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | ||||
| import me.chanjar.weixin.common.util.json.WxGsonBuilder; | import me.chanjar.weixin.common.util.json.WxGsonBuilder; | ||||
| import me.chanjar.weixin.mp.bean.material.WxMpMaterialNews; | import me.chanjar.weixin.mp.bean.material.WxMpMaterialNews; | ||||
| import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | ||||
| @@ -57,6 +59,7 @@ public class MaterialNewsInfoRequestExecutor extends AbstractRequestExecutor<WxM | |||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public WxMpMaterialNews executeJodd(HttpConnectionProvider httpclient, ProxyInfo httpProxy, String uri, String materialId) throws WxErrorException, IOException { | public WxMpMaterialNews executeJodd(HttpConnectionProvider httpclient, ProxyInfo httpProxy, String uri, String materialId) throws WxErrorException, IOException { | ||||
| HttpRequest request = HttpRequest.post(uri); | HttpRequest request = HttpRequest.post(uri); | ||||
| @@ -102,6 +105,7 @@ public class MaterialNewsInfoRequestExecutor extends AbstractRequestExecutor<WxM | |||||
| Response response = client.newCall(request).execute(); | Response response = client.newCall(request).execute(); | ||||
| String responseContent = response.body().toString(); | String responseContent = response.body().toString(); | ||||
| WxError error = WxError.fromJson(responseContent); | WxError error = WxError.fromJson(responseContent); | ||||
| if (error.getErrorCode() != 0) { | if (error.getErrorCode() != 0) { | ||||
| throw new WxErrorException(error); | throw new WxErrorException(error); | ||||
| @@ -10,7 +10,9 @@ import me.chanjar.weixin.common.util.http.AbstractRequestExecutor; | |||||
| import me.chanjar.weixin.common.util.http.RequestExecutor; | import me.chanjar.weixin.common.util.http.RequestExecutor; | ||||
| import me.chanjar.weixin.common.util.http.RequestHttp; | import me.chanjar.weixin.common.util.http.RequestHttp; | ||||
| import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | ||||
| import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | ||||
| import me.chanjar.weixin.common.util.json.WxGsonBuilder; | import me.chanjar.weixin.common.util.json.WxGsonBuilder; | ||||
| import me.chanjar.weixin.mp.bean.material.WxMpMaterial; | import me.chanjar.weixin.mp.bean.material.WxMpMaterial; | ||||
| import me.chanjar.weixin.mp.bean.material.WxMpMaterialUploadResult; | import me.chanjar.weixin.mp.bean.material.WxMpMaterialUploadResult; | ||||
| @@ -10,7 +10,9 @@ import me.chanjar.weixin.common.util.http.AbstractRequestExecutor; | |||||
| import me.chanjar.weixin.common.util.http.RequestExecutor; | import me.chanjar.weixin.common.util.http.RequestExecutor; | ||||
| import me.chanjar.weixin.common.util.http.RequestHttp; | import me.chanjar.weixin.common.util.http.RequestHttp; | ||||
| import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | ||||
| import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | ||||
| import me.chanjar.weixin.common.util.json.WxGsonBuilder; | import me.chanjar.weixin.common.util.json.WxGsonBuilder; | ||||
| import me.chanjar.weixin.mp.bean.material.WxMediaImgUploadResult; | import me.chanjar.weixin.mp.bean.material.WxMediaImgUploadResult; | ||||
| import me.chanjar.weixin.mp.bean.material.WxMpMaterialVideoInfoResult; | import me.chanjar.weixin.mp.bean.material.WxMpMaterialVideoInfoResult; | ||||
| @@ -6,6 +6,7 @@ import jodd.http.HttpResponse; | |||||
| import jodd.http.ProxyInfo; | import jodd.http.ProxyInfo; | ||||
| import me.chanjar.weixin.common.bean.result.WxError; | import me.chanjar.weixin.common.bean.result.WxError; | ||||
| import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
| import me.chanjar.weixin.common.util.http.AbstractRequestExecutor; | import me.chanjar.weixin.common.util.http.AbstractRequestExecutor; | ||||
| import me.chanjar.weixin.common.util.http.RequestExecutor; | import me.chanjar.weixin.common.util.http.RequestExecutor; | ||||
| import me.chanjar.weixin.common.util.http.RequestHttp; | import me.chanjar.weixin.common.util.http.RequestHttp; | ||||
| @@ -95,6 +96,7 @@ public class MaterialVoiceAndImageDownloadRequestExecutor extends AbstractReques | |||||
| Response response = client.newCall(request).execute(); | Response response = client.newCall(request).execute(); | ||||
| try (InputStream inputStream = new ByteArrayInputStream(response.body().bytes())) { | try (InputStream inputStream = new ByteArrayInputStream(response.body().bytes())) { | ||||
| // 下载媒体文件出错 | // 下载媒体文件出错 | ||||
| byte[] responseContent = IOUtils.toByteArray(inputStream); | byte[] responseContent = IOUtils.toByteArray(inputStream); | ||||
| String responseContentString = new String(responseContent, "UTF-8"); | String responseContentString = new String(responseContent, "UTF-8"); | ||||
| @@ -4,7 +4,9 @@ import jodd.http.HttpConnectionProvider; | |||||
| import jodd.http.HttpRequest; | import jodd.http.HttpRequest; | ||||
| import jodd.http.HttpResponse; | import jodd.http.HttpResponse; | ||||
| import jodd.http.ProxyInfo; | import jodd.http.ProxyInfo; | ||||
| import jodd.util.MimeTypes; | import jodd.util.MimeTypes; | ||||
| import me.chanjar.weixin.common.bean.result.WxError; | import me.chanjar.weixin.common.bean.result.WxError; | ||||
| import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | ||||
| import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
| @@ -13,7 +15,9 @@ import me.chanjar.weixin.common.util.http.AbstractRequestExecutor; | |||||
| import me.chanjar.weixin.common.util.http.RequestExecutor; | import me.chanjar.weixin.common.util.http.RequestExecutor; | ||||
| import me.chanjar.weixin.common.util.http.RequestHttp; | import me.chanjar.weixin.common.util.http.RequestHttp; | ||||
| import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | ||||
| import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | ||||
| import me.chanjar.weixin.mp.bean.material.WxMediaImgUploadResult; | import me.chanjar.weixin.mp.bean.material.WxMediaImgUploadResult; | ||||
| import okhttp3.*; | import okhttp3.*; | ||||
| @@ -38,7 +42,6 @@ import java.util.UUID; | |||||
| */ | */ | ||||
| public class MediaImgUploadRequestExecutor extends AbstractRequestExecutor<WxMediaImgUploadResult, File> { | public class MediaImgUploadRequestExecutor extends AbstractRequestExecutor<WxMediaImgUploadResult, File> { | ||||
| @Override | @Override | ||||
| public WxMediaImgUploadResult executeJodd(HttpConnectionProvider provider, ProxyInfo proxyInfo, String uri, File data) throws WxErrorException, IOException { | public WxMediaImgUploadResult executeJodd(HttpConnectionProvider provider, ProxyInfo proxyInfo, String uri, File data) throws WxErrorException, IOException { | ||||
| if (data == null) { | if (data == null) { | ||||
| @@ -99,6 +102,7 @@ public class MediaImgUploadRequestExecutor extends AbstractRequestExecutor<WxMed | |||||
| @Override | @Override | ||||
| public WxMediaImgUploadResult executeApache(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, | public WxMediaImgUploadResult executeApache(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, | ||||
| File data) throws WxErrorException, IOException { | File data) throws WxErrorException, IOException { | ||||
| if (data == null) { | if (data == null) { | ||||
| throw new WxErrorException(WxError.newBuilder().setErrorMsg("文件对象为空").build()); | throw new WxErrorException(WxError.newBuilder().setErrorMsg("文件对象为空").build()); | ||||
| } | } | ||||
| @@ -8,11 +8,13 @@ import jodd.util.MimeTypes; | |||||
| import me.chanjar.weixin.common.bean.result.WxError; | import me.chanjar.weixin.common.bean.result.WxError; | ||||
| import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
| import me.chanjar.weixin.common.util.fs.FileUtils; | import me.chanjar.weixin.common.util.fs.FileUtils; | ||||
| import me.chanjar.weixin.common.util.http.AbstractRequestExecutor; | import me.chanjar.weixin.common.util.http.AbstractRequestExecutor; | ||||
| import me.chanjar.weixin.common.util.http.RequestHttp; | import me.chanjar.weixin.common.util.http.RequestHttp; | ||||
| import me.chanjar.weixin.common.util.http.apache.InputStreamResponseHandler; | import me.chanjar.weixin.common.util.http.apache.InputStreamResponseHandler; | ||||
| import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | ||||
| import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | ||||
| import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket; | import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket; | ||||
| import okhttp3.*; | import okhttp3.*; | ||||
| @@ -101,6 +103,7 @@ public class QrCodeRequestExecutor extends AbstractRequestExecutor<File, WxMpQrC | |||||
| @Override | @Override | ||||
| public File executeApache(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, | public File executeApache(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, | ||||
| WxMpQrCodeTicket ticket) throws WxErrorException, IOException { | WxMpQrCodeTicket ticket) throws WxErrorException, IOException { | ||||
| if (ticket != null) { | if (ticket != null) { | ||||
| if (uri.indexOf('?') == -1) { | if (uri.indexOf('?') == -1) { | ||||
| uri += '?'; | uri += '?'; | ||||
| @@ -4,6 +4,8 @@ import me.chanjar.weixin.common.bean.result.WxError; | |||||
| import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
| import me.chanjar.weixin.common.util.http.RequestExecutor; | import me.chanjar.weixin.common.util.http.RequestExecutor; | ||||
| import me.chanjar.weixin.mp.api.impl.apache.WxMpServiceImpl; | |||||
| import org.testng.annotations.DataProvider; | import org.testng.annotations.DataProvider; | ||||
| import org.testng.annotations.Test; | import org.testng.annotations.Test; | ||||
| @@ -7,6 +7,8 @@ import me.chanjar.weixin.common.util.xml.XStreamInitializer; | |||||
| import me.chanjar.weixin.mp.api.WxMpConfigStorage; | import me.chanjar.weixin.mp.api.WxMpConfigStorage; | ||||
| import me.chanjar.weixin.mp.api.WxMpService; | import me.chanjar.weixin.mp.api.WxMpService; | ||||
| import me.chanjar.weixin.mp.api.impl.apache.WxMpServiceImpl; | |||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.io.InputStream; | import java.io.InputStream; | ||||
| import java.util.concurrent.locks.ReentrantLock; | import java.util.concurrent.locks.ReentrantLock; | ||||
| @@ -6,6 +6,8 @@ import me.chanjar.weixin.mp.api.WxMpMessageHandler; | |||||
| import me.chanjar.weixin.mp.api.WxMpMessageRouter; | import me.chanjar.weixin.mp.api.WxMpMessageRouter; | ||||
| import me.chanjar.weixin.mp.api.WxMpService; | import me.chanjar.weixin.mp.api.WxMpService; | ||||
| import me.chanjar.weixin.mp.api.impl.apache.WxMpServiceImpl; | |||||
| import org.eclipse.jetty.server.Server; | import org.eclipse.jetty.server.Server; | ||||
| import org.eclipse.jetty.servlet.ServletHandler; | import org.eclipse.jetty.servlet.ServletHandler; | ||||
| import org.eclipse.jetty.servlet.ServletHolder; | import org.eclipse.jetty.servlet.ServletHolder; | ||||
| @@ -5,7 +5,7 @@ | |||||
| <parent> | <parent> | ||||
| <artifactId>weixin-java-parent</artifactId> | <artifactId>weixin-java-parent</artifactId> | ||||
| <groupId>com.github.binarywang</groupId> | <groupId>com.github.binarywang</groupId> | ||||
| <version>2.6.0</version> | |||||
| <version>2.7.0-SNAPSHOT</version> | |||||
| </parent> | </parent> | ||||
| <modelVersion>4.0.0</modelVersion> | <modelVersion>4.0.0</modelVersion> | ||||
| @@ -188,17 +188,37 @@ public class WxPayServiceImpl implements WxPayService { | |||||
| } | } | ||||
| Map<String, String> payInfo = new HashMap<>(); | Map<String, String> payInfo = new HashMap<>(); | ||||
| payInfo.put("appId", getConfig().getAppId()); | |||||
| // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。 | |||||
| // 但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 | |||||
| payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); | |||||
| payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis())); | |||||
| payInfo.put("package", "prepay_id=" + prepayId); | |||||
| payInfo.put("signType", "MD5"); | |||||
| if ("NATIVE".equals(request.getTradeType())) { | if ("NATIVE".equals(request.getTradeType())) { | ||||
| payInfo.put("codeUrl", unifiedOrderResult.getCodeURL()); | payInfo.put("codeUrl", unifiedOrderResult.getCodeURL()); | ||||
| } else if ("APP".equals(request.getTradeType())) { | |||||
| // APP支付绑定的是微信开放平台上的账号,APPID为开放平台上绑定APP后发放的参数 | |||||
| String appId = getConfig().getAppId(); | |||||
| Map<String, String> configMap = new HashMap<>(); | |||||
| // 此map用于参与调起sdk支付的二次签名,格式全小写,timestamp只能是10位,格式固定,切勿修改 | |||||
| String partnerid = getConfig().getMchId(); | |||||
| configMap.put("prepayid", prepayId); | |||||
| configMap.put("partnerid", partnerid); | |||||
| configMap.put("package", "Sign=WXPay"); | |||||
| configMap.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000)); | |||||
| configMap.put("noncestr", String.valueOf(System.currentTimeMillis())); | |||||
| configMap.put("appid", appId); | |||||
| // 此map用于客户端与微信服务器交互 | |||||
| payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); | |||||
| payInfo.put("prepayId", prepayId); | |||||
| payInfo.put("partnerId", partnerid); | |||||
| payInfo.put("appId", appId); | |||||
| payInfo.put("packageValue", "Sign=WXPay"); | |||||
| payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); | |||||
| payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis())); | |||||
| } else if ("JSAPI".equals(request.getTradeType())) { | |||||
| payInfo.put("appId", unifiedOrderResult.getAppid()); | |||||
| // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 | |||||
| payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); | |||||
| payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis())); | |||||
| payInfo.put("package", "prepay_id=" + prepayId); | |||||
| payInfo.put("signType", "MD5"); | |||||
| payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); | |||||
| } | } | ||||
| payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); | |||||
| return payInfo; | return payInfo; | ||||
| } | } | ||||