From 95583789b5f53d3fe8554009ed44be29f3f70e0b Mon Sep 17 00:00:00 2001 From: Charming Date: Tue, 8 May 2018 10:19:30 +0800 Subject: [PATCH] =?UTF-8?q?#578=20=E5=BE=AE=E4=BF=A1=E5=BC=80=E6=94=BE?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E5=A2=9E=E5=8A=A0=20WxMaUserService=20?= =?UTF-8?q?=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 微信开放平台:1. WxOpenInRedisConfigStorage 支持 JedisPool/JedisSentinelPool 等 Pool 的子类;2. WxOpenInRedisConfigStorage 增加 keyPrefix 以支持可配置的前缀; * 微信开放平台:增加小程序代码模板库管理 * 小程序:增加代码管理相关 API * 小程序:增加修改服务器地址、成员管理 API * 小程序:增加数据分析相关 API * 微信开放平台:增加 HTTP proxy 机制 * 微信开放平台:增加 WxMaUserService 的实现 --- .../open/api/impl/WxOpenMaServiceImpl.java | 13 ++-- .../api/impl/WxOpenMaUserServiceImpl.java | 70 +++++++++++++++++++ 2 files changed, 78 insertions(+), 5 deletions(-) create mode 100755 weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaUserServiceImpl.java diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java index c0645d76..358eadc7 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java @@ -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 007 */ @@ -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); } - } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaUserServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaUserServiceImpl.java new file mode 100755 index 00000000..b7d0aba1 --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaUserServiceImpl.java @@ -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 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); + } +}