mirror of
https://gitee.com/binary/weixin-java-tools.git
synced 2026-03-10 00:13:40 +08:00
Merge remote-tracking branch 'wechat/develop' into develop
This commit is contained in:
6
pom.xml
6
pom.xml
@@ -6,7 +6,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.github.binarywang</groupId>
|
<groupId>com.github.binarywang</groupId>
|
||||||
<artifactId>wx-java</artifactId>
|
<artifactId>wx-java</artifactId>
|
||||||
<version>3.9.0</version>
|
<version>3.9.1.B</version>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<name>WxJava - Weixin/Wechat Java SDK</name>
|
<name>WxJava - Weixin/Wechat Java SDK</name>
|
||||||
<description>微信开发Java SDK</description>
|
<description>微信开发Java SDK</description>
|
||||||
@@ -172,7 +172,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.slf4j</groupId>
|
<groupId>org.slf4j</groupId>
|
||||||
<artifactId>slf4j-api</artifactId>
|
<artifactId>slf4j-api</artifactId>
|
||||||
<version>1.7.24</version>
|
<version>1.7.30</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.thoughtworks.xstream</groupId>
|
<groupId>com.thoughtworks.xstream</groupId>
|
||||||
@@ -268,7 +268,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.data</groupId>
|
<groupId>org.springframework.data</groupId>
|
||||||
<artifactId>spring-data-redis</artifactId>
|
<artifactId>spring-data-redis</artifactId>
|
||||||
<version>1.8.23.RELEASE</version>
|
<version>2.3.3.RELEASE</version>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.github.binarywang</groupId>
|
<groupId>com.github.binarywang</groupId>
|
||||||
<artifactId>wx-java</artifactId>
|
<artifactId>wx-java</artifactId>
|
||||||
<version>3.9.0</version>
|
<version>3.9.1.B</version>
|
||||||
</parent>
|
</parent>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<artifactId>wx-java-spring-boot-starters</artifactId>
|
<artifactId>wx-java-spring-boot-starters</artifactId>
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
<description>WxJava 各个模块的 Spring Boot Starter</description>
|
<description>WxJava 各个模块的 Spring Boot Starter</description>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<spring.boot.version>2.1.4.RELEASE</spring.boot.version>
|
<spring.boot.version>2.3.3.RELEASE</spring.boot.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<modules>
|
<modules>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>wx-java-spring-boot-starters</artifactId>
|
<artifactId>wx-java-spring-boot-starters</artifactId>
|
||||||
<groupId>com.github.binarywang</groupId>
|
<groupId>com.github.binarywang</groupId>
|
||||||
<version>3.9.0</version>
|
<version>3.9.1.B</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>wx-java-spring-boot-starters</artifactId>
|
<artifactId>wx-java-spring-boot-starters</artifactId>
|
||||||
<groupId>com.github.binarywang</groupId>
|
<groupId>com.github.binarywang</groupId>
|
||||||
<version>3.9.0</version>
|
<version>3.9.1.B</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>wx-java-spring-boot-starters</artifactId>
|
<artifactId>wx-java-spring-boot-starters</artifactId>
|
||||||
<groupId>com.github.binarywang</groupId>
|
<groupId>com.github.binarywang</groupId>
|
||||||
<version>3.9.0</version>
|
<version>3.9.1.B</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>wx-java-spring-boot-starters</artifactId>
|
<artifactId>wx-java-spring-boot-starters</artifactId>
|
||||||
<groupId>com.github.binarywang</groupId>
|
<groupId>com.github.binarywang</groupId>
|
||||||
<version>3.9.0</version>
|
<version>3.9.1.B</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.github.binarywang</groupId>
|
<groupId>com.github.binarywang</groupId>
|
||||||
<artifactId>wx-java</artifactId>
|
<artifactId>wx-java</artifactId>
|
||||||
<version>3.9.0</version>
|
<version>3.9.1.B</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>weixin-graal</artifactId>
|
<artifactId>weixin-graal</artifactId>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.github.binarywang</groupId>
|
<groupId>com.github.binarywang</groupId>
|
||||||
<artifactId>wx-java</artifactId>
|
<artifactId>wx-java</artifactId>
|
||||||
<version>3.9.0</version>
|
<version>3.9.1.B</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>weixin-java-common</artifactId>
|
<artifactId>weixin-java-common</artifactId>
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.slf4j</groupId>
|
<groupId>org.slf4j</groupId>
|
||||||
<artifactId>jcl-over-slf4j</artifactId>
|
<artifactId>jcl-over-slf4j</artifactId>
|
||||||
<version>1.7.24</version>
|
<version>1.7.30</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import com.google.common.collect.Lists;
|
|||||||
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 jodd.util.MathUtil;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -151,4 +152,50 @@ public class GsonHelper {
|
|||||||
public static JsonArray getAsJsonArray(JsonElement element) {
|
public static JsonArray getAsJsonArray(JsonElement element) {
|
||||||
return element == null ? null : element.getAsJsonArray();
|
return element == null ? null : element.getAsJsonArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 快速构建JsonObject对象,批量添加一堆属性
|
||||||
|
*
|
||||||
|
* @param keyOrValue 包含key或value的数组
|
||||||
|
* @return JsonObject对象.
|
||||||
|
*/
|
||||||
|
public static JsonObject buildJsonObject(Object... keyOrValue) {
|
||||||
|
JsonObject result = new JsonObject();
|
||||||
|
put(result, keyOrValue);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量向JsonObject对象中添加属性
|
||||||
|
*
|
||||||
|
* @param jsonObject 原始JsonObject对象
|
||||||
|
* @param keyOrValue 包含key或value的数组
|
||||||
|
*/
|
||||||
|
public static void put(JsonObject jsonObject, Object... keyOrValue) {
|
||||||
|
if (MathUtil.isOdd(keyOrValue.length)) {
|
||||||
|
throw new RuntimeException("参数个数必须为偶数");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < keyOrValue.length / 2; i++) {
|
||||||
|
final Object key = keyOrValue[2 * i];
|
||||||
|
final Object value = keyOrValue[2 * i + 1];
|
||||||
|
if (value == null) {
|
||||||
|
jsonObject.add(key.toString(), null);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value instanceof Boolean) {
|
||||||
|
jsonObject.addProperty(key.toString(), (Boolean) value);
|
||||||
|
} else if (value instanceof Character) {
|
||||||
|
jsonObject.addProperty(key.toString(), (Character) value);
|
||||||
|
} else if (value instanceof Number) {
|
||||||
|
jsonObject.addProperty(key.toString(), (Number) value);
|
||||||
|
} else if (value instanceof JsonElement) {
|
||||||
|
jsonObject.add(key.toString(), (JsonElement) value);
|
||||||
|
} else {
|
||||||
|
jsonObject.addProperty(key.toString(), value.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ package me.chanjar.weixin.common.util.locks;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.springframework.dao.DataAccessException;
|
|
||||||
import org.springframework.data.redis.connection.RedisConnection;
|
|
||||||
import org.springframework.data.redis.connection.RedisStringCommands;
|
import org.springframework.data.redis.connection.RedisStringCommands;
|
||||||
import org.springframework.data.redis.core.RedisCallback;
|
import org.springframework.data.redis.core.RedisCallback;
|
||||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
@@ -76,13 +74,10 @@ public class RedisTemplateSimpleDistributedLock implements Lock {
|
|||||||
}
|
}
|
||||||
final byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
|
final byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
|
||||||
final byte[] valueBytes = value.getBytes(StandardCharsets.UTF_8);
|
final byte[] valueBytes = value.getBytes(StandardCharsets.UTF_8);
|
||||||
List<Object> redisResults = redisTemplate.executePipelined(new RedisCallback<String>() {
|
List<Object> redisResults = redisTemplate.executePipelined((RedisCallback<String>) connection -> {
|
||||||
@Override
|
connection.set(keyBytes, valueBytes, Expiration.milliseconds(leaseMilliseconds), RedisStringCommands.SetOption.SET_IF_ABSENT);
|
||||||
public String doInRedis(RedisConnection connection) throws DataAccessException {
|
connection.get(keyBytes);
|
||||||
connection.set(keyBytes, valueBytes, Expiration.milliseconds(leaseMilliseconds), RedisStringCommands.SetOption.SET_IF_ABSENT);
|
return null;
|
||||||
connection.get(keyBytes);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
Object currentLockSecret = redisResults.size() > 1 ? redisResults.get(1) : redisResults.get(0);
|
Object currentLockSecret = redisResults.size() > 1 ? redisResults.get(1) : redisResults.get(0);
|
||||||
return currentLockSecret != null && currentLockSecret.toString().equals(value);
|
return currentLockSecret != null && currentLockSecret.toString().equals(value);
|
||||||
|
|||||||
@@ -0,0 +1,139 @@
|
|||||||
|
package me.chanjar.weixin.common.util.json;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GsonHelper 的单元测试.
|
||||||
|
*
|
||||||
|
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||||
|
* @date 2020-09-04
|
||||||
|
*/
|
||||||
|
public class GsonHelperTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIsNull() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIsNotNull() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetLong() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetPrimitiveLong() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetInteger() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetPrimitiveInteger() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetDouble() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetPrimitiveDouble() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetFloat() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetPrimitiveFloat() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetBoolean() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetString() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAsString() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAsLong() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAsPrimitiveLong() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAsInteger() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAsPrimitiveInt() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAsBoolean() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAsPrimitiveBool() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAsDouble() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAsPrimitiveDouble() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAsFloat() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAsPrimitiveFloat() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetIntArray() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetStringArray() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetLongArray() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAsJsonArray() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBuildSimpleJsonObject() {
|
||||||
|
try {
|
||||||
|
GsonHelper.buildJsonObject(1, 2, 3);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
assertThat(e.getMessage()).isEqualTo("参数个数必须为偶数");
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println(GsonHelper.buildJsonObject(1, 2));
|
||||||
|
System.out.println(GsonHelper.buildJsonObject(1, null));
|
||||||
|
System.out.println(GsonHelper.buildJsonObject("int", 1, "float", 2.1f, "double", 2.5));
|
||||||
|
System.out.println(GsonHelper.buildJsonObject("boolean", true, "string", "1av"));
|
||||||
|
System.out.println(GsonHelper.buildJsonObject(1, true, "jsonElement", new JsonObject()));
|
||||||
|
System.out.println(GsonHelper.buildJsonObject("num", 2, "string", "cde", "char", 'a', "bool", true));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.github.binarywang</groupId>
|
<groupId>com.github.binarywang</groupId>
|
||||||
<artifactId>wx-java</artifactId>
|
<artifactId>wx-java</artifactId>
|
||||||
<version>3.9.0</version>
|
<version>3.9.1.B</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>weixin-java-cp</artifactId>
|
<artifactId>weixin-java-cp</artifactId>
|
||||||
|
|||||||
@@ -86,6 +86,9 @@ public class WxCpUser implements Serializable {
|
|||||||
|
|
||||||
@Data
|
@Data
|
||||||
@Accessors(chain = true)
|
@Accessors(chain = true)
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
public static class Attr {
|
public static class Attr {
|
||||||
/**
|
/**
|
||||||
* 属性类型: 0-文本 1-网页
|
* 属性类型: 0-文本 1-网页
|
||||||
|
|||||||
@@ -58,6 +58,14 @@ public class WxCpUserExternalGroupChatInfo extends WxCpBaseResp {
|
|||||||
|
|
||||||
@SerializedName("join_time")
|
@SerializedName("join_time")
|
||||||
private Long joinTime;
|
private Long joinTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 外部联系人在微信开放平台的唯一身份标识(微信unionid)
|
||||||
|
* 通过此字段企业可将外部联系人与公众号/小程序用户关联起来
|
||||||
|
* 仅当群成员类型是微信用户(包括企业成员未添加好友),且企业或第三方服务商绑定了微信开发者ID有此字段
|
||||||
|
*/
|
||||||
|
@SerializedName("unionid")
|
||||||
|
private String unionId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 入群方式。
|
* 入群方式。
|
||||||
|
|||||||
@@ -276,11 +276,11 @@ public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSeri
|
|||||||
o.addProperty("main_department", user.getMainDepartment());
|
o.addProperty("main_department", user.getMainDepartment());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user.getExtAttrs().size() > 0) {
|
if (!user.getExtAttrs().isEmpty()) {
|
||||||
JsonArray attrsJsonArray = new JsonArray();
|
JsonArray attrsJsonArray = new JsonArray();
|
||||||
for (WxCpUser.Attr attr : user.getExtAttrs()) {
|
for (WxCpUser.Attr attr : user.getExtAttrs()) {
|
||||||
JsonObject attrJson = new JsonObject();
|
JsonObject attrJson = GsonHelper.buildJsonObject("type", attr.getType(),
|
||||||
|
"name", attr.getName());
|
||||||
attrsJsonArray.add(attrJson);
|
attrsJsonArray.add(attrJson);
|
||||||
|
|
||||||
if (attr.getType() == null) {
|
if (attr.getType() == null) {
|
||||||
@@ -290,19 +290,12 @@ public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSeri
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (attr.getType()) {
|
switch (attr.getType()) {
|
||||||
case 0: {
|
case 0:
|
||||||
JsonObject text = new JsonObject();
|
attrJson.add("text", GsonHelper.buildJsonObject("value", attr.getTextValue()));
|
||||||
text.addProperty("value", attr.getTextValue());
|
|
||||||
attrJson.add("text", text);
|
|
||||||
break;
|
break;
|
||||||
}
|
case 1:
|
||||||
case 1: {
|
attrJson.add("web", GsonHelper.buildJsonObject("url", attr.getWebUrl(), "title", attr.getWebTitle()));
|
||||||
JsonObject web = new JsonObject();
|
|
||||||
web.addProperty("url", attr.getWebUrl());
|
|
||||||
web.addProperty("title", attr.getWebTitle());
|
|
||||||
attrJson.add("web", web);
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
default: //ignored
|
default: //ignored
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -322,12 +315,11 @@ public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSeri
|
|||||||
attrsJson.addProperty(EXTERNAL_CORP_NAME, user.getExternalCorpName());
|
attrsJson.addProperty(EXTERNAL_CORP_NAME, user.getExternalCorpName());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user.getExternalAttrs().size() > 0) {
|
if (!user.getExternalAttrs().isEmpty()) {
|
||||||
JsonArray attrsJsonArray = new JsonArray();
|
JsonArray attrsJsonArray = new JsonArray();
|
||||||
for (WxCpUser.ExternalAttribute attr : user.getExternalAttrs()) {
|
for (WxCpUser.ExternalAttribute attr : user.getExternalAttrs()) {
|
||||||
JsonObject attrJson = new JsonObject();
|
JsonObject attrJson = GsonHelper.buildJsonObject("type", attr.getType(),
|
||||||
attrJson.addProperty("type", attr.getType());
|
"name", attr.getName());
|
||||||
attrJson.addProperty("name", attr.getName());
|
|
||||||
|
|
||||||
attrsJsonArray.add(attrJson);
|
attrsJsonArray.add(attrJson);
|
||||||
|
|
||||||
@@ -336,27 +328,16 @@ public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSeri
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (attr.getType()) {
|
switch (attr.getType()) {
|
||||||
case 0: {
|
case 0:
|
||||||
JsonObject text = new JsonObject();
|
attrJson.add("text", GsonHelper.buildJsonObject("value", attr.getValue()));
|
||||||
text.addProperty("value", attr.getValue());
|
|
||||||
attrJson.add("text", text);
|
|
||||||
break;
|
break;
|
||||||
}
|
case 1:
|
||||||
case 1: {
|
attrJson.add("web", GsonHelper.buildJsonObject("url", attr.getUrl(), "title", attr.getTitle()));
|
||||||
JsonObject web = new JsonObject();
|
|
||||||
web.addProperty("url", attr.getUrl());
|
|
||||||
web.addProperty("title", attr.getTitle());
|
|
||||||
attrJson.add("web", web);
|
|
||||||
break;
|
break;
|
||||||
}
|
case 2:
|
||||||
case 2: {
|
attrJson.add("miniprogram", GsonHelper.buildJsonObject("appid", attr.getAppid(),
|
||||||
JsonObject miniprogram = new JsonObject();
|
"pagepath", attr.getPagePath(), "title", attr.getTitle()));
|
||||||
miniprogram.addProperty("appid", attr.getAppid());
|
|
||||||
miniprogram.addProperty("pagepath", attr.getPagePath());
|
|
||||||
miniprogram.addProperty("title", attr.getTitle());
|
|
||||||
attrJson.add("miniprogram", miniprogram);
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
default://忽略
|
default://忽略
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ public class WxCpUserGsonAdapterTest {
|
|||||||
assertThat(user).isNotNull();
|
assertThat(user).isNotNull();
|
||||||
|
|
||||||
assertThat(user.getOrders()).isNotEmpty();
|
assertThat(user.getOrders()).isNotEmpty();
|
||||||
assertThat(user.getOrders().length).isEqualTo(2);
|
assertThat(user.getOrders()).hasSize(2);
|
||||||
assertThat(user.getOrders()[0]).isEqualTo(1);
|
assertThat(user.getOrders()[0]).isEqualTo(1);
|
||||||
assertThat(user.getOrders()[1]).isEqualTo(2);
|
assertThat(user.getOrders()[1]).isEqualTo(2);
|
||||||
|
|
||||||
@@ -140,6 +140,12 @@ public class WxCpUserGsonAdapterTest {
|
|||||||
public void testSerialize() {
|
public void testSerialize() {
|
||||||
WxCpUser user = new WxCpUser();
|
WxCpUser user = new WxCpUser();
|
||||||
user.setOrders(new Integer[]{1, 2});
|
user.setOrders(new Integer[]{1, 2});
|
||||||
|
user.addExtAttr(WxCpUser.Attr.builder()
|
||||||
|
.type(0)
|
||||||
|
.name("文本名称")
|
||||||
|
.textValue("文本")
|
||||||
|
.build());
|
||||||
|
|
||||||
user.addExternalAttr(WxCpUser.ExternalAttribute.builder()
|
user.addExternalAttr(WxCpUser.ExternalAttribute.builder()
|
||||||
.type(0)
|
.type(0)
|
||||||
.name("文本名称")
|
.name("文本名称")
|
||||||
@@ -159,7 +165,9 @@ public class WxCpUserGsonAdapterTest {
|
|||||||
.title("my miniprogram")
|
.title("my miniprogram")
|
||||||
.build());
|
.build());
|
||||||
|
|
||||||
assertThat(user.toJson()).isEqualTo("{\"order\":[1,2],\"external_profile\":{\"external_attr\":" +
|
assertThat(user.toJson()).isEqualTo("{\"order\":[1,2]," +
|
||||||
|
"\"extattr\":{\"attrs\":[{\"type\":0,\"name\":\"文本名称\",\"text\":{\"value\":\"文本\"}}]}," +
|
||||||
|
"\"external_profile\":{\"external_attr\":" +
|
||||||
"[{\"type\":0,\"name\":\"文本名称\",\"text\":{\"value\":\"文本\"}}," +
|
"[{\"type\":0,\"name\":\"文本名称\",\"text\":{\"value\":\"文本\"}}," +
|
||||||
"{\"type\":1,\"name\":\"网页名称\",\"web\":{\"url\":\"http://www.test.com\",\"title\":\"标题\"}}," +
|
"{\"type\":1,\"name\":\"网页名称\",\"web\":{\"url\":\"http://www.test.com\",\"title\":\"标题\"}}," +
|
||||||
"{\"type\":2,\"name\":\"测试app\"," +
|
"{\"type\":2,\"name\":\"测试app\"," +
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.github.binarywang</groupId>
|
<groupId>com.github.binarywang</groupId>
|
||||||
<artifactId>wx-java</artifactId>
|
<artifactId>wx-java</artifactId>
|
||||||
<version>3.9.0</version>
|
<version>3.9.1.B</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>weixin-java-miniapp</artifactId>
|
<artifactId>weixin-java-miniapp</artifactId>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.github.binarywang</groupId>
|
<groupId>com.github.binarywang</groupId>
|
||||||
<artifactId>wx-java</artifactId>
|
<artifactId>wx-java</artifactId>
|
||||||
<version>3.9.0</version>
|
<version>3.9.1.B</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>weixin-java-mp</artifactId>
|
<artifactId>weixin-java-mp</artifactId>
|
||||||
|
|||||||
@@ -1,18 +1,5 @@
|
|||||||
package me.chanjar.weixin.mp.api;
|
package me.chanjar.weixin.mp.api;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.ExecutionException;
|
|
||||||
import java.util.concurrent.ExecutorService;
|
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
import java.util.concurrent.Future;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import me.chanjar.weixin.common.api.WxErrorExceptionHandler;
|
import me.chanjar.weixin.common.api.WxErrorExceptionHandler;
|
||||||
import me.chanjar.weixin.common.api.WxMessageDuplicateChecker;
|
import me.chanjar.weixin.common.api.WxMessageDuplicateChecker;
|
||||||
import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker;
|
import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker;
|
||||||
@@ -23,6 +10,18 @@ import me.chanjar.weixin.common.session.WxSessionManager;
|
|||||||
import me.chanjar.weixin.common.util.LogExceptionHandler;
|
import me.chanjar.weixin.common.util.LogExceptionHandler;
|
||||||
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
|
||||||
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <pre>
|
* <pre>
|
||||||
@@ -183,7 +182,7 @@ public class WxMpMessageRouter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (matchRules.size() == 0) {
|
if (matchRules.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,11 +192,8 @@ public class WxMpMessageRouter {
|
|||||||
// 返回最后一个非异步的rule的执行结果
|
// 返回最后一个非异步的rule的执行结果
|
||||||
if (rule.isAsync()) {
|
if (rule.isAsync()) {
|
||||||
futures.add(
|
futures.add(
|
||||||
this.executorService.submit(new Runnable() {
|
this.executorService.submit(() -> {
|
||||||
@Override
|
rule.service(wxMessage, context, mpService, WxMpMessageRouter.this.sessionManager, WxMpMessageRouter.this.exceptionHandler);
|
||||||
public void run() {
|
|
||||||
rule.service(wxMessage, context, mpService, WxMpMessageRouter.this.sessionManager, WxMpMessageRouter.this.exceptionHandler);
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
@@ -208,35 +204,34 @@ public class WxMpMessageRouter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (futures.size() > 0) {
|
if (futures.isEmpty()) {
|
||||||
this.executorService.submit(new Runnable() {
|
return res;
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
for (Future<?> future : futures) {
|
|
||||||
try {
|
|
||||||
future.get();
|
|
||||||
WxMpMessageRouter.this.log.debug("End session access: async=true, sessionId={}", wxMessage.getFromUser());
|
|
||||||
// 异步操作结束,session访问结束
|
|
||||||
sessionEndAccess(wxMessage);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
WxMpMessageRouter.this.log.error("Error happened when wait task finish", e);
|
|
||||||
Thread.currentThread().interrupt();
|
|
||||||
} catch (ExecutionException e) {
|
|
||||||
WxMpMessageRouter.this.log.error("Error happened when wait task finish", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.executorService.submit(() -> {
|
||||||
|
for (Future<?> future : futures) {
|
||||||
|
try {
|
||||||
|
future.get();
|
||||||
|
WxMpMessageRouter.this.log.debug("End session access: async=true, sessionId={}", wxMessage.getFromUser());
|
||||||
|
// 异步操作结束,session访问结束
|
||||||
|
sessionEndAccess(wxMessage);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
WxMpMessageRouter.this.log.error("Error happened when wait task finish", e);
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
} catch (ExecutionException e) {
|
||||||
|
WxMpMessageRouter.this.log.error("Error happened when wait task finish", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
public WxMpXmlOutMessage route(final WxMpXmlMessage wxMessage) {
|
public WxMpXmlOutMessage route(final WxMpXmlMessage wxMessage) {
|
||||||
return this.route(wxMessage, new HashMap<String, Object>(2));
|
return this.route(wxMessage, new HashMap<>(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
public WxMpXmlOutMessage route(String appid, final WxMpXmlMessage wxMessage) {
|
public WxMpXmlOutMessage route(String appid, final WxMpXmlMessage wxMessage) {
|
||||||
return this.route(appid, wxMessage, new HashMap<String, Object>(2));
|
return this.route(appid, wxMessage, new HashMap<>(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isMsgDuplicated(WxMpXmlMessage wxMessage) {
|
private boolean isMsgDuplicated(WxMpXmlMessage wxMessage) {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.github.binarywang</groupId>
|
<groupId>com.github.binarywang</groupId>
|
||||||
<artifactId>wx-java</artifactId>
|
<artifactId>wx-java</artifactId>
|
||||||
<version>3.9.0</version>
|
<version>3.9.1.B</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>weixin-java-open</artifactId>
|
<artifactId>weixin-java-open</artifactId>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.github.binarywang</groupId>
|
<groupId>com.github.binarywang</groupId>
|
||||||
<artifactId>wx-java</artifactId>
|
<artifactId>wx-java</artifactId>
|
||||||
<version>3.9.0</version>
|
<version>3.9.1.B</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import com.github.binarywang.wxpay.exception.WxPayException;
|
|||||||
import com.github.binarywang.wxpay.service.EntPayService;
|
import com.github.binarywang.wxpay.service.EntPayService;
|
||||||
import com.github.binarywang.wxpay.service.WxPayService;
|
import com.github.binarywang.wxpay.service.WxPayService;
|
||||||
import com.github.binarywang.wxpay.util.SignUtils;
|
import com.github.binarywang.wxpay.util.SignUtils;
|
||||||
import org.apache.commons.codec.binary.Base64;
|
|
||||||
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
|
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
|
||||||
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
||||||
import org.bouncycastle.openssl.PEMParser;
|
import org.bouncycastle.openssl.PEMParser;
|
||||||
@@ -22,6 +21,7 @@ import java.nio.file.Files;
|
|||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.security.PublicKey;
|
import java.security.PublicKey;
|
||||||
import java.security.Security;
|
import java.security.Security;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <pre>
|
* <pre>
|
||||||
@@ -168,7 +168,7 @@ public class EntPayServiceImpl implements EntPayService {
|
|||||||
|
|
||||||
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
|
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
|
||||||
byte[] encrypt = cipher.doFinal(srcString.getBytes(StandardCharsets.UTF_8));
|
byte[] encrypt = cipher.doFinal(srcString.getBytes(StandardCharsets.UTF_8));
|
||||||
return Base64.encodeBase64String(encrypt);
|
return Base64.getEncoder().encodeToString(encrypt);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new WxPayException("加密出错", e);
|
throw new WxPayException("加密出错", e);
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package com.github.binarywang.wxpay.service.impl;
|
|||||||
import com.github.binarywang.wxpay.bean.WxPayApiData;
|
import com.github.binarywang.wxpay.bean.WxPayApiData;
|
||||||
import com.github.binarywang.wxpay.exception.WxPayException;
|
import com.github.binarywang.wxpay.exception.WxPayException;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import jodd.util.Base64;
|
|
||||||
import me.chanjar.weixin.common.util.json.GsonParser;
|
import me.chanjar.weixin.common.util.json.GsonParser;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.http.HttpEntity;
|
import org.apache.http.HttpEntity;
|
||||||
@@ -29,6 +28,7 @@ import org.apache.http.util.EntityUtils;
|
|||||||
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLContext;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <pre>
|
* <pre>
|
||||||
@@ -48,7 +48,7 @@ public class WxPayServiceApacheHttpImpl extends BaseWxPayServiceImpl {
|
|||||||
try (CloseableHttpClient httpClient = httpClientBuilder.build()) {
|
try (CloseableHttpClient httpClient = httpClientBuilder.build()) {
|
||||||
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
|
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
|
||||||
final byte[] bytes = EntityUtils.toByteArray(response.getEntity());
|
final byte[] bytes = EntityUtils.toByteArray(response.getEntity());
|
||||||
final String responseData = Base64.encodeToString(bytes);
|
final String responseData = Base64.getEncoder().encodeToString(bytes);
|
||||||
this.log.info("\n【请求地址】:{}\n【请求数据】:{}\n【响应数据(Base64编码后)】:{}", url, requestStr, responseData);
|
this.log.info("\n【请求地址】:{}\n【请求数据】:{}\n【响应数据(Base64编码后)】:{}", url, requestStr, responseData);
|
||||||
wxApiData.set(new WxPayApiData(url, requestStr, responseData, null));
|
wxApiData.set(new WxPayApiData(url, requestStr, responseData, null));
|
||||||
return bytes;
|
return bytes;
|
||||||
|
|||||||
@@ -1,11 +1,5 @@
|
|||||||
package com.github.binarywang.wxpay.service.impl;
|
package com.github.binarywang.wxpay.service.impl;
|
||||||
|
|
||||||
import java.net.URI;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import javax.net.ssl.SSLContext;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import com.github.binarywang.wxpay.bean.WxPayApiData;
|
import com.github.binarywang.wxpay.bean.WxPayApiData;
|
||||||
import com.github.binarywang.wxpay.exception.WxPayException;
|
import com.github.binarywang.wxpay.exception.WxPayException;
|
||||||
import jodd.http.HttpConnectionProvider;
|
import jodd.http.HttpConnectionProvider;
|
||||||
@@ -15,9 +9,14 @@ import jodd.http.ProxyInfo;
|
|||||||
import jodd.http.ProxyInfo.ProxyType;
|
import jodd.http.ProxyInfo.ProxyType;
|
||||||
import jodd.http.net.SSLSocketHttpConnectionProvider;
|
import jodd.http.net.SSLSocketHttpConnectionProvider;
|
||||||
import jodd.http.net.SocketHttpConnectionProvider;
|
import jodd.http.net.SocketHttpConnectionProvider;
|
||||||
import jodd.util.Base64;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.http.client.methods.HttpPost;
|
import org.apache.http.client.methods.HttpPost;
|
||||||
|
|
||||||
|
import javax.net.ssl.SSLContext;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 微信支付请求实现类,jodd-http实现.
|
* 微信支付请求实现类,jodd-http实现.
|
||||||
* Created by Binary Wang on 2016/7/28.
|
* Created by Binary Wang on 2016/7/28.
|
||||||
@@ -30,7 +29,7 @@ public class WxPayServiceJoddHttpImpl extends BaseWxPayServiceImpl {
|
|||||||
try {
|
try {
|
||||||
HttpRequest request = this.buildHttpRequest(url, requestStr, useKey);
|
HttpRequest request = this.buildHttpRequest(url, requestStr, useKey);
|
||||||
byte[] responseBytes = request.send().bodyBytes();
|
byte[] responseBytes = request.send().bodyBytes();
|
||||||
final String responseString = Base64.encodeToString(responseBytes);
|
final String responseString = Base64.getEncoder().encodeToString(responseBytes);
|
||||||
this.log.info("\n【请求地址】:{}\n【请求数据】:{}\n【响应数据(Base64编码后)】:{}", url, requestStr, responseString);
|
this.log.info("\n【请求地址】:{}\n【请求数据】:{}\n【响应数据(Base64编码后)】:{}", url, requestStr, responseString);
|
||||||
if (this.getConfig().isIfSaveApiData()) {
|
if (this.getConfig().isIfSaveApiData()) {
|
||||||
wxApiData.set(new WxPayApiData(url, requestStr, responseString, null));
|
wxApiData.set(new WxPayApiData(url, requestStr, responseString, null));
|
||||||
|
|||||||
Reference in New Issue
Block a user