Skip to content

Commit 6a9d6c6

Browse files
Copilotbinarywang
andcommitted
修复 RsaCryptoUtil 以支持继承字段的加密
Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com>
1 parent ccd1936 commit 6a9d6c6

File tree

2 files changed

+89
-2
lines changed

2 files changed

+89
-2
lines changed

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/RsaCryptoUtil.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,28 @@ public static void encryptFields(Object encryptObject, X509Certificate certifica
3636
}
3737
}
3838

39+
/**
40+
* 递归获取类的所有字段,包括父类中的字段
41+
*
42+
* @param clazz 要获取字段的类
43+
* @return 所有字段的列表
44+
*/
45+
private static java.util.List<Field> getAllFields(Class<?> clazz) {
46+
java.util.List<Field> fields = new java.util.ArrayList<>();
47+
while (clazz != null) {
48+
Field[] declaredFields = clazz.getDeclaredFields();
49+
for (Field field : declaredFields) {
50+
fields.add(field);
51+
}
52+
clazz = clazz.getSuperclass();
53+
}
54+
return fields;
55+
}
56+
3957
private static void encryptField(Object encryptObject, X509Certificate certificate) throws IllegalAccessException, IllegalBlockSizeException {
4058
Class<?> infoClass = encryptObject.getClass();
41-
Field[] infoFieldArray = infoClass.getDeclaredFields();
42-
for (Field field : infoFieldArray) {
59+
java.util.List<Field> infoFieldList = getAllFields(infoClass);
60+
for (Field field : infoFieldList) {
4361
if (field.isAnnotationPresent(SpecEncrypt.class)) {
4462
//字段使用了@SpecEncrypt进行标识
4563
if (field.getType().getTypeName().equals(JAVA_LANG_STRING)) {

weixin-java-pay/src/test/java/com/github/binarywang/wxpay/v3/util/RsaCryptoUtilTest.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request;
55
import com.github.binarywang.wxpay.exception.WxPayException;
66
import com.github.binarywang.wxpay.v3.SpecEncrypt;
7+
import com.google.gson.annotations.SerializedName;
8+
import lombok.Data;
79
import org.testng.annotations.Test;
810

911
import java.lang.reflect.Field;
@@ -126,4 +128,71 @@ public void testEncryptFieldsWithDirectField() {
126128
assertNotNull(request.getName());
127129
assertEquals(request.getName(), "李四");
128130
}
131+
132+
/**
133+
* 测试类继承场景下的字段加密
134+
* 验证父类中带 @SpecEncrypt 注解的字段是否能被正确找到和加密
135+
*/
136+
@Test
137+
public void testEncryptFieldsWithInheritance() {
138+
// 定义测试用的父类和子类
139+
@Data
140+
class ParentRequest {
141+
@SpecEncrypt
142+
@SerializedName("parent_name")
143+
private String parentName;
144+
}
145+
146+
@Data
147+
@lombok.EqualsAndHashCode(callSuper = false)
148+
class ChildRequest extends ParentRequest {
149+
@SpecEncrypt
150+
@SerializedName("child_name")
151+
private String childName;
152+
}
153+
154+
// 创建子类实例
155+
ChildRequest request = new ChildRequest();
156+
request.setParentName("父类字段");
157+
request.setChildName("子类字段");
158+
159+
// 验证能够找到父类和子类的字段
160+
System.out.println("=== 测试继承场景 ===");
161+
System.out.println("父类字段值: " + request.getParentName());
162+
System.out.println("子类字段值: " + request.getChildName());
163+
164+
// 使用 getDeclaredFields 只能找到子类字段
165+
Field[] childFields = ChildRequest.class.getDeclaredFields();
166+
System.out.println("使用 getDeclaredFields 找到的字段数: " + childFields.length);
167+
168+
// 使用 getAllFields 辅助方法应该能找到父类和子类的所有字段
169+
java.util.List<Field> allFields = getAllFields(ChildRequest.class);
170+
System.out.println("使用 getAllFields 找到的字段数: " + allFields.size());
171+
172+
int annotatedFieldCount = 0;
173+
for (Field field : allFields) {
174+
if (field.isAnnotationPresent(SpecEncrypt.class)) {
175+
annotatedFieldCount++;
176+
System.out.println(" -> 找到带 @SpecEncrypt 注解的字段: " + field.getName());
177+
}
178+
}
179+
180+
// 应该找到2个带注解的字段(parentName 和 childName)
181+
assertTrue(annotatedFieldCount >= 2, "应该能找到至少2个带 @SpecEncrypt 注解的字段");
182+
}
183+
184+
/**
185+
* 辅助方法:递归获取类的所有字段,包括父类中的字段
186+
*/
187+
private java.util.List<Field> getAllFields(Class<?> clazz) {
188+
java.util.List<Field> fields = new ArrayList<>();
189+
while (clazz != null) {
190+
Field[] declaredFields = clazz.getDeclaredFields();
191+
for (Field field : declaredFields) {
192+
fields.add(field);
193+
}
194+
clazz = clazz.getSuperclass();
195+
}
196+
return fields;
197+
}
129198
}

0 commit comments

Comments
 (0)