| @@ -1,10 +1,9 @@ | |||||
| package me.chanjar.weixin.common.util.crypto; | package me.chanjar.weixin.common.util.crypto; | ||||
| import org.apache.commons.codec.digest.DigestUtils; | |||||
| import java.security.NoSuchAlgorithmException; | |||||
| import java.util.Arrays; | import java.util.Arrays; | ||||
| import org.apache.commons.codec.digest.DigestUtils; | |||||
| /** | /** | ||||
| * Created by Daniel Qian on 14/10/19. | * Created by Daniel Qian on 14/10/19. | ||||
| */ | */ | ||||
| @@ -13,7 +12,7 @@ public class SHA1 { | |||||
| /** | /** | ||||
| * 串接arr参数,生成sha1 digest | * 串接arr参数,生成sha1 digest | ||||
| */ | */ | ||||
| public static String gen(String... arr) throws NoSuchAlgorithmException { | |||||
| public static String gen(String... arr) { | |||||
| Arrays.sort(arr); | Arrays.sort(arr); | ||||
| StringBuilder sb = new StringBuilder(); | StringBuilder sb = new StringBuilder(); | ||||
| for (String a : arr) { | for (String a : arr) { | ||||
| @@ -25,7 +24,7 @@ public class SHA1 { | |||||
| /** | /** | ||||
| * 用&串接arr参数,生成sha1 digest | * 用&串接arr参数,生成sha1 digest | ||||
| */ | */ | ||||
| public static String genWithAmple(String... arr) throws NoSuchAlgorithmException { | |||||
| public static String genWithAmple(String... arr) { | |||||
| Arrays.sort(arr); | Arrays.sort(arr); | ||||
| StringBuilder sb = new StringBuilder(); | StringBuilder sb = new StringBuilder(); | ||||
| for (int i = 0; i < arr.length; i++) { | for (int i = 0; i < arr.length; i++) { | ||||
| @@ -17,11 +17,16 @@ | |||||
| */ | */ | ||||
| package me.chanjar.weixin.common.util.crypto; | package me.chanjar.weixin.common.util.crypto; | ||||
| import org.apache.commons.codec.binary.Base64; | |||||
| import org.apache.commons.codec.digest.DigestUtils; | |||||
| import org.w3c.dom.Document; | |||||
| import org.w3c.dom.Element; | |||||
| import org.xml.sax.InputSource; | |||||
| import java.io.StringReader; | |||||
| import java.nio.charset.Charset; | |||||
| import java.util.ArrayList; | |||||
| import java.util.Arrays; | |||||
| import java.util.Collections; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import java.util.Random; | |||||
| import java.util.SortedMap; | |||||
| import java.util.TreeMap; | |||||
| import javax.crypto.Cipher; | import javax.crypto.Cipher; | ||||
| import javax.crypto.spec.IvParameterSpec; | import javax.crypto.spec.IvParameterSpec; | ||||
| @@ -29,10 +34,12 @@ import javax.crypto.spec.SecretKeySpec; | |||||
| import javax.xml.parsers.DocumentBuilder; | import javax.xml.parsers.DocumentBuilder; | ||||
| import javax.xml.parsers.DocumentBuilderFactory; | import javax.xml.parsers.DocumentBuilderFactory; | ||||
| import javax.xml.parsers.ParserConfigurationException; | import javax.xml.parsers.ParserConfigurationException; | ||||
| import java.io.StringReader; | |||||
| import java.nio.charset.Charset; | |||||
| import java.security.NoSuchAlgorithmException; | |||||
| import java.util.*; | |||||
| import org.apache.commons.codec.binary.Base64; | |||||
| import org.apache.commons.codec.digest.DigestUtils; | |||||
| import org.w3c.dom.Document; | |||||
| import org.w3c.dom.Element; | |||||
| import org.xml.sax.InputSource; | |||||
| public class WxCryptUtil { | public class WxCryptUtil { | ||||
| @@ -130,13 +137,9 @@ public class WxCryptUtil { | |||||
| String timeStamp = Long.toString(System.currentTimeMillis() / 1000l); | String timeStamp = Long.toString(System.currentTimeMillis() / 1000l); | ||||
| String nonce = genRandomStr(); | String nonce = genRandomStr(); | ||||
| try { | |||||
| String signature = SHA1.gen(this.token, timeStamp, nonce, encryptedXml); | |||||
| String result = generateXml(encryptedXml, signature, timeStamp, nonce); | |||||
| return result; | |||||
| } catch (NoSuchAlgorithmException e) { | |||||
| throw new RuntimeException(e); | |||||
| } | |||||
| String signature = SHA1.gen(this.token, timeStamp, nonce, encryptedXml); | |||||
| String result = generateXml(encryptedXml, signature, timeStamp, nonce); | |||||
| return result; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -205,14 +208,10 @@ public class WxCryptUtil { | |||||
| // 提取密文 | // 提取密文 | ||||
| String cipherText = extractEncryptPart(encryptedXml); | String cipherText = extractEncryptPart(encryptedXml); | ||||
| try { | |||||
| // 验证安全签名 | |||||
| String signature = SHA1.gen(this.token, timeStamp, nonce, cipherText); | |||||
| if (!signature.equals(msgSignature)) { | |||||
| throw new RuntimeException("加密消息签名校验失败"); | |||||
| } | |||||
| } catch (NoSuchAlgorithmException e) { | |||||
| throw new RuntimeException(e); | |||||
| // 验证安全签名 | |||||
| String signature = SHA1.gen(this.token, timeStamp, nonce, cipherText); | |||||
| if (!signature.equals(msgSignature)) { | |||||
| throw new RuntimeException("加密消息签名校验失败"); | |||||
| } | } | ||||
| // 解密 | // 解密 | ||||
| @@ -277,7 +276,7 @@ public class WxCryptUtil { | |||||
| * | * | ||||
| * @param number | * @param number | ||||
| */ | */ | ||||
| private byte[] number2BytesInNetworkOrder(int number) { | |||||
| private static byte[] number2BytesInNetworkOrder(int number) { | |||||
| byte[] orderBytes = new byte[4]; | byte[] orderBytes = new byte[4]; | ||||
| orderBytes[3] = (byte) (number & 0xFF); | orderBytes[3] = (byte) (number & 0xFF); | ||||
| orderBytes[2] = (byte) (number >> 8 & 0xFF); | orderBytes[2] = (byte) (number >> 8 & 0xFF); | ||||
| @@ -291,7 +290,7 @@ public class WxCryptUtil { | |||||
| * | * | ||||
| * @param bytesInNetworkOrder | * @param bytesInNetworkOrder | ||||
| */ | */ | ||||
| private int bytesNetworkOrder2Number(byte[] bytesInNetworkOrder) { | |||||
| private static int bytesNetworkOrder2Number(byte[] bytesInNetworkOrder) { | |||||
| int sourceNumber = 0; | int sourceNumber = 0; | ||||
| for (int i = 0; i < 4; i++) { | for (int i = 0; i < 4; i++) { | ||||
| sourceNumber <<= 8; | sourceNumber <<= 8; | ||||
| @@ -303,7 +302,7 @@ public class WxCryptUtil { | |||||
| /** | /** | ||||
| * 随机生成16位字符串 | * 随机生成16位字符串 | ||||
| */ | */ | ||||
| private String genRandomStr() { | |||||
| private static String genRandomStr() { | |||||
| String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; | String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; | ||||
| Random random = new Random(); | Random random = new Random(); | ||||
| StringBuffer sb = new StringBuffer(); | StringBuffer sb = new StringBuffer(); | ||||
| @@ -323,8 +322,8 @@ public class WxCryptUtil { | |||||
| * @param nonce 随机字符串 | * @param nonce 随机字符串 | ||||
| * @return 生成的xml字符串 | * @return 生成的xml字符串 | ||||
| */ | */ | ||||
| private String generateXml(String encrypt, String signature, String timestamp, | |||||
| String nonce) { | |||||
| private static String generateXml(String encrypt, String signature, | |||||
| String timestamp, String nonce) { | |||||
| String format = "<xml>\n" + "<Encrypt><![CDATA[%1$s]]></Encrypt>\n" | String format = "<xml>\n" + "<Encrypt><![CDATA[%1$s]]></Encrypt>\n" | ||||
| + "<MsgSignature><![CDATA[%2$s]]></MsgSignature>\n" | + "<MsgSignature><![CDATA[%2$s]]></MsgSignature>\n" | ||||
| + "<TimeStamp>%3$s</TimeStamp>\n" + "<Nonce><![CDATA[%4$s]]></Nonce>\n" | + "<TimeStamp>%3$s</TimeStamp>\n" + "<Nonce><![CDATA[%4$s]]></Nonce>\n" | ||||
| @@ -17,37 +17,25 @@ public class FileUtils { | |||||
| * @param tmpDirFile 临时文件夹目录 | * @param tmpDirFile 临时文件夹目录 | ||||
| */ | */ | ||||
| public static File createTmpFile(InputStream inputStream, String name, String ext, File tmpDirFile) throws IOException { | public static File createTmpFile(InputStream inputStream, String name, String ext, File tmpDirFile) throws IOException { | ||||
| FileOutputStream fos = null; | |||||
| try { | |||||
| File tmpFile; | |||||
| if (tmpDirFile == null) { | |||||
| tmpFile = File.createTempFile(name, '.' + ext); | |||||
| } else { | |||||
| tmpFile = File.createTempFile(name, '.' + ext, tmpDirFile); | |||||
| } | |||||
| tmpFile.deleteOnExit(); | |||||
| fos = new FileOutputStream(tmpFile); | |||||
| File tmpFile; | |||||
| if (tmpDirFile == null) { | |||||
| tmpFile = File.createTempFile(name, '.' + ext); | |||||
| } else { | |||||
| tmpFile = File.createTempFile(name, '.' + ext, tmpDirFile); | |||||
| } | |||||
| tmpFile.deleteOnExit(); | |||||
| try (FileOutputStream fos = new FileOutputStream(tmpFile)) { | |||||
| int read = 0; | int read = 0; | ||||
| byte[] bytes = new byte[1024 * 100]; | byte[] bytes = new byte[1024 * 100]; | ||||
| while ((read = inputStream.read(bytes)) != -1) { | while ((read = inputStream.read(bytes)) != -1) { | ||||
| fos.write(bytes, 0, read); | fos.write(bytes, 0, read); | ||||
| } | } | ||||
| fos.flush(); | fos.flush(); | ||||
| return tmpFile; | return tmpFile; | ||||
| } finally { | |||||
| if (inputStream != null) { | |||||
| try { | |||||
| inputStream.close(); | |||||
| } catch (IOException e) { | |||||
| } | |||||
| } | |||||
| if (fos != null) { | |||||
| try { | |||||
| fos.close(); | |||||
| } catch (IOException e) { | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -1,6 +1,8 @@ | |||||
| package me.chanjar.weixin.common.util.http; | package me.chanjar.weixin.common.util.http; | ||||
| import me.chanjar.weixin.common.util.StringUtils; | |||||
| import java.io.IOException; | |||||
| import java.util.concurrent.TimeUnit; | |||||
| import org.apache.http.annotation.NotThreadSafe; | import org.apache.http.annotation.NotThreadSafe; | ||||
| import org.apache.http.auth.AuthScope; | import org.apache.http.auth.AuthScope; | ||||
| import org.apache.http.auth.UsernamePasswordCredentials; | import org.apache.http.auth.UsernamePasswordCredentials; | ||||
| @@ -21,8 +23,7 @@ import org.apache.http.impl.client.HttpClients; | |||||
| import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; | import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; | ||||
| import org.apache.http.protocol.HttpContext; | import org.apache.http.protocol.HttpContext; | ||||
| import java.io.IOException; | |||||
| import java.util.concurrent.TimeUnit; | |||||
| import me.chanjar.weixin.common.util.StringUtils; | |||||
| /** | /** | ||||
| * httpclient 连接管理器 | * httpclient 连接管理器 | ||||
| @@ -107,6 +108,7 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { | |||||
| .register("https", this.sslConnectionSocketFactory) | .register("https", this.sslConnectionSocketFactory) | ||||
| .build(); | .build(); | ||||
| @SuppressWarnings("resource") | |||||
| PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); | PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); | ||||
| connectionManager.setMaxTotal(this.maxTotalConn); | connectionManager.setMaxTotal(this.maxTotalConn); | ||||
| connectionManager.setDefaultMaxPerRoute(this.maxConnPerHost); | connectionManager.setDefaultMaxPerRoute(this.maxConnPerHost); | ||||
| @@ -1,15 +1,14 @@ | |||||
| package me.chanjar.weixin.common.util.http; | package me.chanjar.weixin.common.util.http; | ||||
| import org.apache.http.HttpHost; | |||||
| import org.apache.http.impl.client.CloseableHttpClient; | |||||
| 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.http.net.SocketHttpConnectionProvider; | import jodd.http.net.SocketHttpConnectionProvider; | ||||
| 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 org.apache.http.HttpHost; | |||||
| import org.apache.http.impl.client.CloseableHttpClient; | |||||
| import java.io.IOException; | |||||
| /** | /** | ||||
| * 简单的GET请求执行器,请求的参数是String, 返回的结果也是String | * 简单的GET请求执行器,请求的参数是String, 返回的结果也是String | ||||
| @@ -20,7 +19,7 @@ public class JoddGetRequestExecutor implements RequestExecutor<String, String> { | |||||
| @Override | @Override | ||||
| public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, | public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, | ||||
| String queryParam) throws WxErrorException, IOException { | |||||
| String queryParam) throws WxErrorException { | |||||
| if (queryParam != null) { | if (queryParam != null) { | ||||
| if (uri.indexOf('?') == -1) { | if (uri.indexOf('?') == -1) { | ||||
| uri += '?'; | uri += '?'; | ||||
| @@ -1,15 +1,14 @@ | |||||
| package me.chanjar.weixin.common.util.http; | package me.chanjar.weixin.common.util.http; | ||||
| import org.apache.http.HttpHost; | |||||
| import org.apache.http.impl.client.CloseableHttpClient; | |||||
| 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.http.net.SocketHttpConnectionProvider; | import jodd.http.net.SocketHttpConnectionProvider; | ||||
| 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 org.apache.http.HttpHost; | |||||
| import org.apache.http.impl.client.CloseableHttpClient; | |||||
| import java.io.IOException; | |||||
| /** | /** | ||||
| * 简单的POST请求执行器,请求的参数是String, 返回的结果也是String | * 简单的POST请求执行器,请求的参数是String, 返回的结果也是String | ||||
| @@ -20,7 +19,7 @@ public class JoddPostRequestExecutor implements RequestExecutor<String, String> | |||||
| @Override | @Override | ||||
| public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, | public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, | ||||
| String postEntity) throws WxErrorException, IOException { | |||||
| String postEntity) throws WxErrorException { | |||||
| SocketHttpConnectionProvider provider = new SocketHttpConnectionProvider(); | SocketHttpConnectionProvider provider = new SocketHttpConnectionProvider(); | ||||
| if (httpProxy != null) { | if (httpProxy != null) { | ||||
| @@ -1,9 +1,11 @@ | |||||
| package me.chanjar.weixin.common.util.http; | package me.chanjar.weixin.common.util.http; | ||||
| import me.chanjar.weixin.common.bean.result.WxError; | |||||
| import me.chanjar.weixin.common.exception.WxErrorException; | |||||
| import me.chanjar.weixin.common.util.StringUtils; | |||||
| import me.chanjar.weixin.common.util.fs.FileUtils; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| import java.io.InputStream; | |||||
| import java.util.regex.Matcher; | |||||
| import java.util.regex.Pattern; | |||||
| import org.apache.http.Header; | import org.apache.http.Header; | ||||
| import org.apache.http.HttpHost; | import org.apache.http.HttpHost; | ||||
| import org.apache.http.client.config.RequestConfig; | import org.apache.http.client.config.RequestConfig; | ||||
| @@ -12,11 +14,10 @@ import org.apache.http.client.methods.HttpGet; | |||||
| import org.apache.http.entity.ContentType; | import org.apache.http.entity.ContentType; | ||||
| import org.apache.http.impl.client.CloseableHttpClient; | import org.apache.http.impl.client.CloseableHttpClient; | ||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| import java.io.InputStream; | |||||
| import java.util.regex.Matcher; | |||||
| import java.util.regex.Pattern; | |||||
| import me.chanjar.weixin.common.bean.result.WxError; | |||||
| import me.chanjar.weixin.common.exception.WxErrorException; | |||||
| import me.chanjar.weixin.common.util.StringUtils; | |||||
| import me.chanjar.weixin.common.util.fs.FileUtils; | |||||
| /** | /** | ||||
| * 下载媒体文件请求执行器,请求的参数是String, 返回的结果是File | * 下载媒体文件请求执行器,请求的参数是String, 返回的结果是File | ||||
| @@ -52,7 +53,9 @@ public class MediaDownloadRequestExecutor implements RequestExecutor<File, Strin | |||||
| httpGet.setConfig(config); | httpGet.setConfig(config); | ||||
| } | } | ||||
| try (CloseableHttpResponse response = httpclient.execute(httpGet)) { | |||||
| try (CloseableHttpResponse response = httpclient.execute(httpGet); | |||||
| InputStream inputStream = InputStreamResponseHandler.INSTANCE | |||||
| .handleResponse(response)) { | |||||
| Header[] contentTypeHeader = response.getHeaders("Content-Type"); | Header[] contentTypeHeader = response.getHeaders("Content-Type"); | ||||
| if (contentTypeHeader != null && contentTypeHeader.length > 0) { | if (contentTypeHeader != null && contentTypeHeader.length > 0) { | ||||
| @@ -62,8 +65,6 @@ public class MediaDownloadRequestExecutor implements RequestExecutor<File, Strin | |||||
| throw new WxErrorException(WxError.fromJson(responseContent)); | throw new WxErrorException(WxError.fromJson(responseContent)); | ||||
| } | } | ||||
| } | } | ||||
| InputStream inputStream = InputStreamResponseHandler.INSTANCE.handleResponse(response); | |||||
| // 视频文件不支持下载 | // 视频文件不支持下载 | ||||
| String fileName = getFileName(response); | String fileName = getFileName(response); | ||||
| if (StringUtils.isBlank(fileName)) { | if (StringUtils.isBlank(fileName)) { | ||||
| @@ -106,7 +106,7 @@ public class SessionTest { | |||||
| } | } | ||||
| @Test(dataProvider = "getSessionManager") | @Test(dataProvider = "getSessionManager") | ||||
| public void testMaxActive(WxSessionManager sessionManager) throws InterruptedException { | |||||
| public void testMaxActive(WxSessionManager sessionManager) { | |||||
| InternalSessionManager ism = (InternalSessionManager) sessionManager; | InternalSessionManager ism = (InternalSessionManager) sessionManager; | ||||
| ism.setMaxActiveSessions(2); | ism.setMaxActiveSessions(2); | ||||
| @@ -118,7 +118,7 @@ public class SessionTest { | |||||
| } | } | ||||
| @Test(dataProvider = "getSessionManager", expectedExceptions = TooManyActiveSessionsException.class) | @Test(dataProvider = "getSessionManager", expectedExceptions = TooManyActiveSessionsException.class) | ||||
| public void testMaxActive2(WxSessionManager sessionManager) throws InterruptedException { | |||||
| public void testMaxActive2(WxSessionManager sessionManager) { | |||||
| InternalSessionManager ism = (InternalSessionManager) sessionManager; | InternalSessionManager ism = (InternalSessionManager) sessionManager; | ||||
| ism.setMaxActiveSessions(2); | ism.setMaxActiveSessions(2); | ||||
| @@ -1,6 +1,5 @@ | |||||
| package me.chanjar.weixin.mp.api.impl; | package me.chanjar.weixin.mp.api.impl; | ||||
| import java.security.NoSuchAlgorithmException; | |||||
| import java.util.Arrays; | import java.util.Arrays; | ||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| @@ -111,16 +110,12 @@ public class WxMpCardServiceImpl implements WxMpCardService { | |||||
| signParam[optionalSignParam.length] = String.valueOf(timestamp); | signParam[optionalSignParam.length] = String.valueOf(timestamp); | ||||
| signParam[optionalSignParam.length + 1] = nonceStr; | signParam[optionalSignParam.length + 1] = nonceStr; | ||||
| signParam[optionalSignParam.length + 2] = cardApiTicket; | signParam[optionalSignParam.length + 2] = cardApiTicket; | ||||
| try { | |||||
| String signature = SHA1.gen(signParam); | |||||
| WxCardApiSignature cardApiSignature = new WxCardApiSignature(); | |||||
| cardApiSignature.setTimestamp(timestamp); | |||||
| cardApiSignature.setNonceStr(nonceStr); | |||||
| cardApiSignature.setSignature(signature); | |||||
| return cardApiSignature; | |||||
| } catch (NoSuchAlgorithmException e) { | |||||
| throw new WxErrorException(WxError.newBuilder().setErrorMsg(e.getMessage()).build()); | |||||
| } | |||||
| String signature = SHA1.gen(signParam); | |||||
| WxCardApiSignature cardApiSignature = new WxCardApiSignature(); | |||||
| cardApiSignature.setTimestamp(timestamp); | |||||
| cardApiSignature.setNonceStr(nonceStr); | |||||
| cardApiSignature.setSignature(signature); | |||||
| return cardApiSignature; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -1,9 +1,23 @@ | |||||
| package me.chanjar.weixin.mp.api.impl; | package me.chanjar.weixin.mp.api.impl; | ||||
| import java.io.IOException; | |||||
| import org.apache.http.HttpHost; | |||||
| 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.conn.ssl.DefaultHostnameVerifier; | |||||
| import org.apache.http.conn.ssl.SSLConnectionSocketFactory; | |||||
| 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.JsonArray; | ||||
| import com.google.gson.JsonElement; | import com.google.gson.JsonElement; | ||||
| import com.google.gson.JsonObject; | import com.google.gson.JsonObject; | ||||
| import com.google.gson.JsonParser; | import com.google.gson.JsonParser; | ||||
| import me.chanjar.weixin.common.bean.WxAccessToken; | import me.chanjar.weixin.common.bean.WxAccessToken; | ||||
| import me.chanjar.weixin.common.bean.WxJsapiSignature; | import me.chanjar.weixin.common.bean.WxJsapiSignature; | ||||
| import me.chanjar.weixin.common.bean.result.WxError; | import me.chanjar.weixin.common.bean.result.WxError; | ||||
| @@ -12,23 +26,37 @@ import me.chanjar.weixin.common.session.StandardSessionManager; | |||||
| import me.chanjar.weixin.common.session.WxSessionManager; | import me.chanjar.weixin.common.session.WxSessionManager; | ||||
| import me.chanjar.weixin.common.util.RandomUtils; | import me.chanjar.weixin.common.util.RandomUtils; | ||||
| import me.chanjar.weixin.common.util.crypto.SHA1; | import me.chanjar.weixin.common.util.crypto.SHA1; | ||||
| import me.chanjar.weixin.common.util.http.*; | |||||
| import me.chanjar.weixin.mp.api.*; | |||||
| import me.chanjar.weixin.mp.bean.*; | |||||
| import me.chanjar.weixin.mp.bean.result.*; | |||||
| import org.apache.http.HttpHost; | |||||
| 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.conn.ssl.DefaultHostnameVerifier; | |||||
| import org.apache.http.conn.ssl.SSLConnectionSocketFactory; | |||||
| import org.apache.http.impl.client.BasicResponseHandler; | |||||
| import org.apache.http.impl.client.CloseableHttpClient; | |||||
| import org.slf4j.Logger; | |||||
| import org.slf4j.LoggerFactory; | |||||
| import java.io.IOException; | |||||
| import java.security.NoSuchAlgorithmException; | |||||
| import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder; | |||||
| import me.chanjar.weixin.common.util.http.DefaultApacheHttpClientBuilder; | |||||
| 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.mp.api.WxMpCardService; | |||||
| import me.chanjar.weixin.mp.api.WxMpConfigStorage; | |||||
| import me.chanjar.weixin.mp.api.WxMpDataCubeService; | |||||
| import me.chanjar.weixin.mp.api.WxMpGroupService; | |||||
| import me.chanjar.weixin.mp.api.WxMpKefuService; | |||||
| import me.chanjar.weixin.mp.api.WxMpMaterialService; | |||||
| import me.chanjar.weixin.mp.api.WxMpMenuService; | |||||
| import me.chanjar.weixin.mp.api.WxMpPayService; | |||||
| import me.chanjar.weixin.mp.api.WxMpQrcodeService; | |||||
| import me.chanjar.weixin.mp.api.WxMpService; | |||||
| import me.chanjar.weixin.mp.api.WxMpUserService; | |||||
| import me.chanjar.weixin.mp.bean.WxMpCustomMessage; | |||||
| import me.chanjar.weixin.mp.bean.WxMpIndustry; | |||||
| import me.chanjar.weixin.mp.bean.WxMpMassGroupMessage; | |||||
| import me.chanjar.weixin.mp.bean.WxMpMassNews; | |||||
| import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage; | |||||
| import me.chanjar.weixin.mp.bean.WxMpMassPreviewMessage; | |||||
| import me.chanjar.weixin.mp.bean.WxMpMassVideo; | |||||
| import me.chanjar.weixin.mp.bean.WxMpSemanticQuery; | |||||
| import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpUser; | |||||
| public class WxMpServiceImpl implements WxMpService { | public class WxMpServiceImpl implements WxMpService { | ||||
| @@ -159,23 +187,15 @@ public class WxMpServiceImpl implements WxMpService { | |||||
| long timestamp = System.currentTimeMillis() / 1000; | long timestamp = System.currentTimeMillis() / 1000; | ||||
| String noncestr = RandomUtils.getRandomStr(); | String noncestr = RandomUtils.getRandomStr(); | ||||
| String jsapiTicket = getJsapiTicket(false); | String jsapiTicket = getJsapiTicket(false); | ||||
| try { | |||||
| String signature = SHA1.genWithAmple( | |||||
| "jsapi_ticket=" + jsapiTicket, | |||||
| "noncestr=" + noncestr, | |||||
| "timestamp=" + timestamp, | |||||
| "url=" + url | |||||
| ); | |||||
| WxJsapiSignature jsapiSignature = new WxJsapiSignature(); | |||||
| jsapiSignature.setAppid(this.wxMpConfigStorage.getAppId()); | |||||
| jsapiSignature.setTimestamp(timestamp); | |||||
| jsapiSignature.setNoncestr(noncestr); | |||||
| jsapiSignature.setUrl(url); | |||||
| jsapiSignature.setSignature(signature); | |||||
| return jsapiSignature; | |||||
| } catch (NoSuchAlgorithmException e) { | |||||
| throw new RuntimeException(e); | |||||
| } | |||||
| String signature = SHA1.genWithAmple("jsapi_ticket=" + jsapiTicket, | |||||
| "noncestr=" + noncestr, "timestamp=" + timestamp, "url=" + url); | |||||
| WxJsapiSignature jsapiSignature = new WxJsapiSignature(); | |||||
| jsapiSignature.setAppid(this.wxMpConfigStorage.getAppId()); | |||||
| jsapiSignature.setTimestamp(timestamp); | |||||
| jsapiSignature.setNoncestr(noncestr); | |||||
| jsapiSignature.setUrl(url); | |||||
| jsapiSignature.setSignature(signature); | |||||
| return jsapiSignature; | |||||
| } | } | ||||
| @Override | @Override | ||||