Skip to content

Commit 9558378

Browse files
charmingohbinarywang
authored andcommitted
binarywang#578 微信开放平台增加 WxMaUserService 的实现
* 微信开放平台:1. WxOpenInRedisConfigStorage 支持 JedisPool/JedisSentinelPool 等 Pool<Jedis> 的子类;2. WxOpenInRedisConfigStorage 增加 keyPrefix 以支持可配置的前缀; * 微信开放平台:增加小程序代码模板库管理 * 小程序:增加代码管理相关 API * 小程序:增加修改服务器地址、成员管理 API * 小程序:增加数据分析相关 API * 微信开放平台:增加 HTTP proxy 机制 * 微信开放平台:增加 WxMaUserService 的实现
1 parent 499750b commit 9558378

File tree

2 files changed

+78
-5
lines changed

2 files changed

+78
-5
lines changed

weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,32 @@
11
package me.chanjar.weixin.open.api.impl;
22

3+
import cn.binarywang.wx.miniapp.api.WxMaUserService;
34
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
45
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
56
import cn.binarywang.wx.miniapp.config.WxMaConfig;
6-
import com.google.common.base.Joiner;
77
import me.chanjar.weixin.common.exception.WxErrorException;
88
import me.chanjar.weixin.open.api.WxOpenComponentService;
99

10-
import java.util.HashMap;
11-
import java.util.Map;
12-
1310
/**
1411
* @author <a href="https://github.com/007gzs">007</a>
1512
*/
1613
/* package */ class WxOpenMaServiceImpl extends WxMaServiceImpl {
1714
private WxOpenComponentService wxOpenComponentService;
1815
private WxMaConfig wxMaConfig;
1916
private String appId;
17+
private WxMaUserService wxMaUserService;
2018

2119
public WxOpenMaServiceImpl(WxOpenComponentService wxOpenComponentService, String appId, WxMaConfig wxMaConfig) {
2220
this.wxOpenComponentService = wxOpenComponentService;
2321
this.appId = appId;
2422
this.wxMaConfig = wxMaConfig;
2523
initHttp();
24+
this.wxMaUserService = new WxOpenMaUserServiceImpl(wxOpenComponentService, this);
25+
}
26+
27+
@Override
28+
public WxMaUserService getUserService() {
29+
return this.wxMaUserService;
2630
}
2731

2832
@Override
@@ -38,5 +42,4 @@ public WxMaConfig getWxMaConfig() {
3842
public String getAccessToken(boolean forceRefresh) throws WxErrorException {
3943
return wxOpenComponentService.getAuthorizerAccessToken(appId, forceRefresh);
4044
}
41-
4245
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package me.chanjar.weixin.open.api.impl;
2+
3+
import cn.binarywang.wx.miniapp.api.WxMaService;
4+
import cn.binarywang.wx.miniapp.api.WxMaUserService;
5+
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
6+
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
7+
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
8+
import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils;
9+
import com.google.common.base.Joiner;
10+
import me.chanjar.weixin.common.exception.WxErrorException;
11+
import me.chanjar.weixin.open.api.WxOpenComponentService;
12+
import org.apache.commons.codec.digest.DigestUtils;
13+
14+
import java.util.HashMap;
15+
import java.util.Map;
16+
17+
/**
18+
* @author Charming
19+
*/
20+
class WxOpenMaUserServiceImpl implements WxMaUserService {
21+
private static final String COMPONENT_JSCODE_TO_SESSION_URL = "https://api.weixin.qq.com/sns/component/jscode2session";
22+
private WxOpenComponentService wxOpenComponentService;
23+
private WxMaService wxMaService;
24+
25+
public WxOpenMaUserServiceImpl(WxOpenComponentService wxOpenComponentService, WxMaService wxMaService) {
26+
this.wxOpenComponentService = wxOpenComponentService;
27+
this.wxMaService = wxMaService;
28+
}
29+
30+
/**
31+
* 第三方平台开发者的服务器使用登录凭证 code 以及
32+
* 第三方平台的 component_access_token
33+
* 获取 session_key 和 openid。
34+
* 其中 session_key 是对用户数据进行加密签名的密钥。
35+
* 为了自身应用安全,session_key 不应该在网络上传输。
36+
* 文档:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1492585163_FtTNA&token=&lang=zh_CN
37+
*
38+
* @param jsCode 登录时获取的 code
39+
* @return session_key 和 openid
40+
* @throws WxErrorException 发生错误时
41+
*/
42+
@Override
43+
public WxMaJscode2SessionResult getSessionInfo(String jsCode) throws WxErrorException {
44+
Map<String, String> params = new HashMap<>(5);
45+
params.put("appid", wxMaService.getWxMaConfig().getAppid());
46+
params.put("js_code", jsCode);
47+
params.put("grant_type", "authorization_code");
48+
params.put("component_appid", wxOpenComponentService.getWxOpenConfigStorage().getComponentAppId());
49+
params.put("component_access_token", wxOpenComponentService.getComponentAccessToken(false));
50+
51+
String result = this.wxMaService.get(COMPONENT_JSCODE_TO_SESSION_URL, Joiner.on("&").withKeyValueSeparator("=").join(params));
52+
return WxMaJscode2SessionResult.fromJson(result);
53+
}
54+
55+
@Override
56+
public WxMaUserInfo getUserInfo(String sessionKey, String encryptedData, String ivStr) {
57+
return WxMaUserInfo.fromJson(WxMaCryptUtils.decrypt(sessionKey, encryptedData, ivStr));
58+
}
59+
60+
@Override
61+
public WxMaPhoneNumberInfo getPhoneNoInfo(String sessionKey, String encryptedData, String ivStr) {
62+
return WxMaPhoneNumberInfo.fromJson(WxMaCryptUtils.decrypt(sessionKey, encryptedData, ivStr));
63+
}
64+
65+
@Override
66+
public boolean checkUserInfo(String sessionKey, String rawData, String signature) {
67+
final String generatedSignature = DigestUtils.sha1Hex(rawData + sessionKey);
68+
return generatedSignature.equals(signature);
69+
}
70+
}

0 commit comments

Comments
 (0)