mirror of
https://gitee.com/binary/weixin-java-tools.git
synced 2025-05-04 12:47:46 +08:00
#578 微信开放平台增加 WxMaUserService 的实现
* 微信开放平台:1. WxOpenInRedisConfigStorage 支持 JedisPool/JedisSentinelPool 等 Pool<Jedis> 的子类;2. WxOpenInRedisConfigStorage 增加 keyPrefix 以支持可配置的前缀; * 微信开放平台:增加小程序代码模板库管理 * 小程序:增加代码管理相关 API * 小程序:增加修改服务器地址、成员管理 API * 小程序:增加数据分析相关 API * 微信开放平台:增加 HTTP proxy 机制 * 微信开放平台:增加 WxMaUserService 的实现
This commit is contained in:
parent
499750b3df
commit
95583789b5
@ -1,15 +1,12 @@
|
||||
package me.chanjar.weixin.open.api.impl;
|
||||
|
||||
import cn.binarywang.wx.miniapp.api.WxMaUserService;
|
||||
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
|
||||
import cn.binarywang.wx.miniapp.config.WxMaConfig;
|
||||
import com.google.common.base.Joiner;
|
||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||
import me.chanjar.weixin.open.api.WxOpenComponentService;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author <a href="https://github.com/007gzs">007</a>
|
||||
*/
|
||||
@ -17,12 +14,19 @@ import java.util.Map;
|
||||
private WxOpenComponentService wxOpenComponentService;
|
||||
private WxMaConfig wxMaConfig;
|
||||
private String appId;
|
||||
private WxMaUserService wxMaUserService;
|
||||
|
||||
public WxOpenMaServiceImpl(WxOpenComponentService wxOpenComponentService, String appId, WxMaConfig wxMaConfig) {
|
||||
this.wxOpenComponentService = wxOpenComponentService;
|
||||
this.appId = appId;
|
||||
this.wxMaConfig = wxMaConfig;
|
||||
initHttp();
|
||||
this.wxMaUserService = new WxOpenMaUserServiceImpl(wxOpenComponentService, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMaUserService getUserService() {
|
||||
return this.wxMaUserService;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -38,5 +42,4 @@ import java.util.Map;
|
||||
public String getAccessToken(boolean forceRefresh) throws WxErrorException {
|
||||
return wxOpenComponentService.getAuthorizerAccessToken(appId, forceRefresh);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,70 @@
|
||||
package me.chanjar.weixin.open.api.impl;
|
||||
|
||||
import cn.binarywang.wx.miniapp.api.WxMaService;
|
||||
import cn.binarywang.wx.miniapp.api.WxMaUserService;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
|
||||
import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils;
|
||||
import com.google.common.base.Joiner;
|
||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||
import me.chanjar.weixin.open.api.WxOpenComponentService;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author Charming
|
||||
*/
|
||||
class WxOpenMaUserServiceImpl implements WxMaUserService {
|
||||
private static final String COMPONENT_JSCODE_TO_SESSION_URL = "https://api.weixin.qq.com/sns/component/jscode2session";
|
||||
private WxOpenComponentService wxOpenComponentService;
|
||||
private WxMaService wxMaService;
|
||||
|
||||
public WxOpenMaUserServiceImpl(WxOpenComponentService wxOpenComponentService, WxMaService wxMaService) {
|
||||
this.wxOpenComponentService = wxOpenComponentService;
|
||||
this.wxMaService = wxMaService;
|
||||
}
|
||||
|
||||
/**
|
||||
* 第三方平台开发者的服务器使用登录凭证 code 以及
|
||||
* 第三方平台的 component_access_token
|
||||
* 获取 session_key 和 openid。
|
||||
* 其中 session_key 是对用户数据进行加密签名的密钥。
|
||||
* 为了自身应用安全,session_key 不应该在网络上传输。
|
||||
* 文档:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1492585163_FtTNA&token=&lang=zh_CN
|
||||
*
|
||||
* @param jsCode 登录时获取的 code
|
||||
* @return session_key 和 openid
|
||||
* @throws WxErrorException 发生错误时
|
||||
*/
|
||||
@Override
|
||||
public WxMaJscode2SessionResult getSessionInfo(String jsCode) throws WxErrorException {
|
||||
Map<String, String> params = new HashMap<>(5);
|
||||
params.put("appid", wxMaService.getWxMaConfig().getAppid());
|
||||
params.put("js_code", jsCode);
|
||||
params.put("grant_type", "authorization_code");
|
||||
params.put("component_appid", wxOpenComponentService.getWxOpenConfigStorage().getComponentAppId());
|
||||
params.put("component_access_token", wxOpenComponentService.getComponentAccessToken(false));
|
||||
|
||||
String result = this.wxMaService.get(COMPONENT_JSCODE_TO_SESSION_URL, Joiner.on("&").withKeyValueSeparator("=").join(params));
|
||||
return WxMaJscode2SessionResult.fromJson(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMaUserInfo getUserInfo(String sessionKey, String encryptedData, String ivStr) {
|
||||
return WxMaUserInfo.fromJson(WxMaCryptUtils.decrypt(sessionKey, encryptedData, ivStr));
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMaPhoneNumberInfo getPhoneNoInfo(String sessionKey, String encryptedData, String ivStr) {
|
||||
return WxMaPhoneNumberInfo.fromJson(WxMaCryptUtils.decrypt(sessionKey, encryptedData, ivStr));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkUserInfo(String sessionKey, String rawData, String signature) {
|
||||
final String generatedSignature = DigestUtils.sha1Hex(rawData + sessionKey);
|
||||
return generatedSignature.equals(signature);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user