Skip to content

Commit 44f6186

Browse files
committed
#515 小程序新增获取微信用户绑定手机号信息的解密方法
1 parent 0a55dc5 commit 44f6186

File tree

4 files changed

+63
-11
lines changed

4 files changed

+63
-11
lines changed

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaUserService.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cn.binarywang.wx.miniapp.api;
22

33
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
4+
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
45
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
56
import me.chanjar.weixin.common.exception.WxErrorException;
67

@@ -27,6 +28,15 @@ public interface WxMaUserService {
2728
*/
2829
WxMaUserInfo getUserInfo(String sessionKey, String encryptedData, String ivStr);
2930

31+
/**
32+
* 解密用户手机号信息.
33+
*
34+
* @param sessionKey 会话密钥
35+
* @param encryptedData 消息密文
36+
* @param ivStr 加密算法的初始向量
37+
*/
38+
WxMaPhoneNumberInfo getPhoneNoInfo(String sessionKey, String encryptedData, String ivStr);
39+
3040
/**
3141
* 验证用户信息完整性.
3242
*

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImpl.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
package cn.binarywang.wx.miniapp.api.impl;
22

3-
import java.util.HashMap;
4-
import java.util.Map;
5-
63
import org.apache.commons.codec.digest.DigestUtils;
74

85
import cn.binarywang.wx.miniapp.api.WxMaService;
96
import cn.binarywang.wx.miniapp.api.WxMaUserService;
107
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
8+
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
119
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
12-
import cn.binarywang.wx.miniapp.config.WxMaConfig;
1310
import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils;
14-
import com.google.common.base.Joiner;
1511
import me.chanjar.weixin.common.exception.WxErrorException;
1612

1713
/**
@@ -34,6 +30,11 @@ public WxMaUserInfo getUserInfo(String sessionKey, String encryptedData, String
3430
return WxMaUserInfo.fromJson(WxMaCryptUtils.decrypt(sessionKey, encryptedData, ivStr));
3531
}
3632

33+
@Override
34+
public WxMaPhoneNumberInfo getPhoneNoInfo(String sessionKey, String encryptedData, String ivStr) {
35+
return WxMaPhoneNumberInfo.fromJson(WxMaCryptUtils.decrypt(sessionKey, encryptedData, ivStr));
36+
}
37+
3738
@Override
3839
public boolean checkUserInfo(String sessionKey, String rawData, String signature) {
3940
final String generatedSignature = DigestUtils.sha1Hex(rawData + sessionKey);
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package cn.binarywang.wx.miniapp.bean;
2+
3+
import java.io.Serializable;
4+
5+
import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
6+
import lombok.Data;
7+
8+
/**
9+
* 微信用户绑定的手机号相关信息
10+
* @author <a href="https://github.com/binarywang">Binary Wang</a>
11+
*/
12+
@Data
13+
public class WxMaPhoneNumberInfo implements Serializable {
14+
private static final long serialVersionUID = 6719822331555402137L;
15+
16+
private String phoneNumber;
17+
private String purePhoneNumber;
18+
private String countryCode;
19+
private Watermark watermark;
20+
21+
public static WxMaPhoneNumberInfo fromJson(String json) {
22+
return WxMaGsonBuilder.create().fromJson(json, WxMaPhoneNumberInfo.class);
23+
}
24+
25+
@Data
26+
public static class Watermark {
27+
private String timestamp;
28+
private String appid;
29+
}
30+
}

weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImplTest.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package cn.binarywang.wx.miniapp.api.impl;
22

3+
import org.testng.annotations.*;
4+
35
import cn.binarywang.wx.miniapp.api.WxMaService;
6+
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
47
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
58
import cn.binarywang.wx.miniapp.test.ApiTestModule;
69
import com.google.inject.Inject;
7-
import org.testng.annotations.Guice;
8-
import org.testng.annotations.Test;
910

10-
import static org.testng.Assert.assertNotNull;
11-
import static org.testng.Assert.assertTrue;
11+
import static org.testng.Assert.*;
1212

1313
/**
1414
* 测试用户相关的接口
@@ -28,7 +28,7 @@ public void testGetSessionKey() throws Exception {
2828
}
2929

3030
@Test
31-
public void testGetUserInfo() throws Exception {
31+
public void testGetUserInfo() {
3232
WxMaUserInfo userInfo = this.wxService.getUserService().getUserInfo("tiihtNczf5v6AKRyjwEUhQ==",
3333
"CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew==",
3434
"r7BXXKkLb8qrSNn05n0qiA==");
@@ -37,10 +37,21 @@ public void testGetUserInfo() throws Exception {
3737
}
3838

3939
@Test
40-
public void testCheckUserInfo() throws Exception {
40+
public void testCheckUserInfo() {
4141
assertTrue(this.wxService.getUserService().checkUserInfo("HyVFkGl5F5OQWJZZaNzBBg==",
4242
"{\"nickName\":\"Band\",\"gender\":1,\"language\":\"zh_CN\",\"city\":\"Guangzhou\",\"province\":\"Guangdong\",\"country\":\"CN\",\"avatarUrl\":\"http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0\"}",
4343
"75e81ceda165f4ffa64f4068af58c64b8f54b88c"));
4444
}
4545

46+
/**
47+
* TODO 测试数据有问题,需要替换为正确的数据
48+
*/
49+
@Test
50+
public void testGetPhoneNoInfo() {
51+
WxMaPhoneNumberInfo phoneNoInfo = this.wxService.getUserService().getPhoneNoInfo("tiihtNczf5v6AKRyjwEUhQ==",
52+
"CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew==",
53+
"r7BXXKkLb8qrSNn05n0qiA==");
54+
assertNotNull(phoneNoInfo);
55+
System.out.println(phoneNoInfo.toString());
56+
}
4657
}

0 commit comments

Comments
 (0)