Skip to content

Commit 5dcd06b

Browse files
007gzsbinarywang
authored andcommitted
#420 开放平台模块增加小程序相关接口
1 parent 519d5a5 commit 5dcd06b

10 files changed

+123
-19
lines changed

weixin-java-open/pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@
3131
<artifactId>weixin-java-mp</artifactId>
3232
<version>${project.version}</version>
3333
</dependency>
34+
<dependency>
35+
<groupId>com.github.binarywang</groupId>
36+
<artifactId>weixin-java-miniapp</artifactId>
37+
<version>${project.version}</version>
38+
</dependency>
3439

3540
<dependency>
3641
<groupId>org.jodd</groupId>

weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package me.chanjar.weixin.open.api;
22

3-
import me.chanjar.weixin.common.bean.result.WxError;
3+
import cn.binarywang.wx.miniapp.api.WxMaService;
4+
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
45
import me.chanjar.weixin.common.exception.WxErrorException;
56
import me.chanjar.weixin.mp.api.WxMpService;
67
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
@@ -35,8 +36,10 @@ public interface WxOpenComponentService {
3536
*/
3637
String OAUTH2_REFRESH_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/component/refresh_token?appid=%s&grant_type=refresh_token&refresh_token=%s&component_appid=%s";
3738

38-
WxMpService getWxMpServiceByAppid(String appid);
39+
String MINIAPP_JSCODE_2_SESSION = "https://api.weixin.qq.com/sns/component/jscode2session?appid=%s&js_code=%s&grant_type=authorization_code&component_appid=%s";
3940

41+
WxMpService getWxMpServiceByAppid(String appid);
42+
WxMaService getWxMaServiceByAppid(String appid);
4043
WxOpenConfigStorage getWxOpenConfigStorage();
4144

4245
boolean checkSignature(String timestamp, String nonce, String signature);
@@ -49,7 +52,6 @@ public interface WxOpenComponentService {
4952
String getPreAuthUrl(String redirectURI) throws WxErrorException;
5053

5154
String route(WxOpenXmlMessage wxMessage) throws WxErrorException;
52-
5355
/**
5456
* 使用授权码换取公众号或小程序的接口调用凭据和授权信息
5557
*/
@@ -68,7 +70,7 @@ public interface WxOpenComponentService {
6870
/**
6971
* 设置授权方的选项信息
7072
*/
71-
WxError setAuthorizerOption(String authorizerAppid, String optionName, String optionValue) throws WxErrorException;
73+
void setAuthorizerOption(String authorizerAppid, String optionName, String optionValue) throws WxErrorException;
7274

7375
String getAuthorizerAccessToken(String appid, boolean forceRefresh) throws WxErrorException;
7476

@@ -79,5 +81,6 @@ public interface WxOpenComponentService {
7981
WxMpOAuth2AccessToken oauth2refreshAccessToken(String appid, String refreshToken) throws WxErrorException;
8082

8183
String oauth2buildAuthorizationUrl(String appid, String redirectURI, String scope, String state);
84+
WxMaJscode2SessionResult miniappJscode2Session(String appid, String jsCode, String appId) throws WxErrorException;
8285

8386
}

weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenConfigStorage.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package me.chanjar.weixin.open.api;
22

3+
import cn.binarywang.wx.miniapp.config.WxMaConfig;
34
import me.chanjar.weixin.mp.api.WxMpConfigStorage;
45
import me.chanjar.weixin.open.bean.WxOpenAuthorizerAccessToken;
56
import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken;
@@ -36,6 +37,7 @@ public interface WxOpenConfigStorage {
3637
void updateComponentAccessTokent(WxOpenComponentAccessToken componentAccessToken);
3738

3839
WxMpConfigStorage getWxMpConfigStorage(String appId);
40+
WxMaConfig getWxMaConfig(String appId);
3941

4042
/**
4143
* 应该是线程安全的

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

+29-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package me.chanjar.weixin.open.api.impl;
22

3+
import cn.binarywang.wx.miniapp.api.WxMaService;
4+
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
35
import com.google.gson.JsonObject;
4-
import me.chanjar.weixin.common.bean.result.WxError;
56
import me.chanjar.weixin.common.exception.WxErrorException;
67
import me.chanjar.weixin.common.util.crypto.SHA1;
78
import me.chanjar.weixin.common.util.http.URIUtil;
@@ -30,7 +31,10 @@
3031
* @author <a href="https://github.com/007gzs">007</a>
3132
*/
3233
public class WxOpenComponentServiceImpl implements WxOpenComponentService {
34+
35+
private static final Map<String, WxMaService> WX_OPEN_MA_SERVICE_MAP = new Hashtable<>();
3336
private static final Map<String, WxMpService> WX_OPEN_MP_SERVICE_MAP = new Hashtable<>();
37+
3438
protected final Logger log = LoggerFactory.getLogger(this.getClass());
3539
private WxOpenService wxOpenService;
3640

@@ -54,6 +58,20 @@ public WxMpService getWxMpServiceByAppid(String appId) {
5458
return wxMpService;
5559
}
5660

61+
@Override
62+
public WxMaService getWxMaServiceByAppid(String appId) {
63+
WxMaService wxMaService = WX_OPEN_MA_SERVICE_MAP.get(appId);
64+
if (wxMaService == null) {
65+
synchronized (WX_OPEN_MA_SERVICE_MAP) {
66+
wxMaService = WX_OPEN_MA_SERVICE_MAP.get(appId);
67+
if (wxMaService == null) {
68+
wxMaService = new WxOpenMaServiceImpl(this, appId, getWxOpenConfigStorage().getWxMaConfig(appId));
69+
WX_OPEN_MA_SERVICE_MAP.put(appId, wxMaService);
70+
}
71+
}
72+
}
73+
return wxMaService;
74+
}
5775
public WxOpenService getWxOpenService() {
5876
return wxOpenService;
5977
}
@@ -137,7 +155,7 @@ public String route(final WxOpenXmlMessage wxMessage) throws WxErrorException {
137155
}
138156
return "success";
139157
}
140-
return null;
158+
return "";
141159
}
142160

143161
@Override
@@ -169,14 +187,13 @@ public WxOpenAuthorizerOptionResult getAuthorizerOption(String authorizerAppid,
169187
}
170188

171189
@Override
172-
public WxError setAuthorizerOption(String authorizerAppid, String optionName, String optionValue) throws WxErrorException {
190+
public void setAuthorizerOption(String authorizerAppid, String optionName, String optionValue) throws WxErrorException {
173191
JsonObject jsonObject = new JsonObject();
174192
jsonObject.addProperty("component_appid", getWxOpenConfigStorage().getComponentAppId());
175193
jsonObject.addProperty("authorizer_appid", authorizerAppid);
176194
jsonObject.addProperty("option_name", optionName);
177195
jsonObject.addProperty("option_value", optionValue);
178-
String responseContent = post(API_SET_AUTHORIZER_OPTION_URL, jsonObject.toString());
179-
return WxGsonBuilder.create().fromJson(responseContent, WxError.class);
196+
post(API_SET_AUTHORIZER_OPTION_URL, jsonObject.toString());
180197
}
181198

182199
@Override
@@ -220,4 +237,11 @@ public String oauth2buildAuthorizationUrl(String appId, String redirectURI, Stri
220237
appId, URIUtil.encodeURIComponent(redirectURI), scope, StringUtils.trimToEmpty(state), getWxOpenConfigStorage().getComponentAppId());
221238
}
222239

240+
@Override
241+
public WxMaJscode2SessionResult miniappJscode2Session(String appid, String jsCode, String appId) throws WxErrorException {
242+
String url = String.format(MINIAPP_JSCODE_2_SESSION, appId, jsCode, getWxOpenConfigStorage().getComponentAppId());
243+
String responseContent = get(url);
244+
return WxMaJscode2SessionResult.fromJson(responseContent);
245+
}
246+
223247
}

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

+19-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package me.chanjar.weixin.open.api.impl;
22

33

4+
import cn.binarywang.wx.miniapp.config.WxMaConfig;
45
import me.chanjar.weixin.common.bean.WxAccessToken;
56
import me.chanjar.weixin.common.util.ToStringUtils;
67
import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder;
@@ -101,7 +102,12 @@ public void updateComponentAccessTokent(WxOpenComponentAccessToken componentAcce
101102

102103
@Override
103104
public WxMpConfigStorage getWxMpConfigStorage(String appId) {
104-
return new WxOpenMpConfigStorage(this, appId);
105+
return new WxOpenInnerConfigStorage(this, appId);
106+
}
107+
108+
@Override
109+
public WxMaConfig getWxMaConfig(String appId) {
110+
return new WxOpenInnerConfigStorage(this, appId);
105111
}
106112

107113
@Override
@@ -222,14 +228,13 @@ private static class Token {
222228
private String token;
223229
private Long expiresTime;
224230
}
225-
226-
private static class WxOpenMpConfigStorage implements WxMpConfigStorage {
231+
private static class WxOpenInnerConfigStorage implements WxMpConfigStorage, WxMaConfig {
227232
private WxOpenConfigStorage wxOpenConfigStorage;
228233
private String appId;
229234
private Lock accessTokenLock = new ReentrantLock();
230235
private Lock jsapiTicketLock = new ReentrantLock();
231236
private Lock cardApiTicketLock = new ReentrantLock();
232-
private WxOpenMpConfigStorage(WxOpenConfigStorage wxOpenConfigStorage, String appId) {
237+
private WxOpenInnerConfigStorage(WxOpenConfigStorage wxOpenConfigStorage, String appId) {
233238
this.wxOpenConfigStorage = wxOpenConfigStorage;
234239
this.appId = appId;
235240
}
@@ -259,6 +264,11 @@ public synchronized void updateAccessToken(String accessToken, int expiresInSeco
259264
wxOpenConfigStorage.updateAuthorizerAccessToken(appId, accessToken, expiresInSeconds);
260265
}
261266

267+
@Override
268+
public String getAppid() {
269+
return this.appId;
270+
}
271+
262272
@Override
263273
public void expireAccessToken() {
264274
wxOpenConfigStorage.expireAuthorizerAccessToken(appId);
@@ -343,6 +353,11 @@ public String getAesKey() {
343353
return wxOpenConfigStorage.getComponentAesKey();
344354
}
345355

356+
@Override
357+
public String getMsgDataFormat() {
358+
return null;
359+
}
360+
346361
@Override
347362
public String getOauth2redirectUri() {
348363
return null;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package me.chanjar.weixin.open.api.impl;
2+
3+
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
4+
import cn.binarywang.wx.miniapp.config.WxMaConfig;
5+
import me.chanjar.weixin.common.exception.WxErrorException;
6+
import me.chanjar.weixin.mp.api.WxMpConfigStorage;
7+
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
8+
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
9+
import me.chanjar.weixin.open.api.WxOpenComponentService;
10+
11+
/**
12+
* @author <a href="https://github.com/007gzs">007</a>
13+
*/
14+
/* package */ class WxOpenMaServiceImpl extends WxMaServiceImpl {
15+
private WxOpenComponentService wxOpenComponentService;
16+
private WxMaConfig wxMaConfig;
17+
private String appId;
18+
19+
public WxOpenMaServiceImpl(WxOpenComponentService wxOpenComponentService, String appId, WxMaConfig wxMaConfig) {
20+
this.wxOpenComponentService = wxOpenComponentService;
21+
this.appId = appId;
22+
this.wxMaConfig = wxMaConfig;
23+
initHttp();
24+
}
25+
26+
@Override
27+
public WxMaConfig getWxMaConfig() {
28+
return wxMaConfig;
29+
}
30+
31+
@Override
32+
public String getAccessToken(boolean forceRefresh) throws WxErrorException {
33+
return wxOpenComponentService.getAuthorizerAccessToken(appId, forceRefresh);
34+
}
35+
36+
}

weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/auth/WxOpenAuthorizerInfo.java

-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ public class WxOpenAuthorizerInfo implements Serializable {
2323
private Map<String, Integer> businessInfo;
2424
private String alias;
2525
private String qrcodeUrl;
26-
2726
/**
2827
* 账号介绍
2928
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package me.chanjar.weixin.open.bean.auth;
2+
3+
import lombok.Data;
4+
import org.apache.commons.lang3.tuple.Pair;
5+
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
@Data
10+
public class WxOpenMiniProgramInfo {
11+
private Map<String, List<String>> network;
12+
private List<Pair<String, String>> categories;
13+
private Integer visitStatus;
14+
}

weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenAuthorizerInfoResult.java

+3
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,7 @@ public class WxOpenAuthorizerInfoResult implements Serializable {
1515

1616
private WxOpenAuthorizationInfo authorizationInfo;
1717
private WxOpenAuthorizerInfo authorizerInfo;
18+
public boolean isMiniProgram(){
19+
return authorizerInfo != null && authorizerInfo.getMiniProgramInfo() != null;
20+
}
1821
}

weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenAuthorizerInfoGsonAdapter.java

+8-5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public WxOpenAuthorizerInfo deserialize(JsonElement jsonElement, Type type, Json
2323
authorizationInfo.setPrincipalName(GsonHelper.getString(jsonObject, "principal_name"));
2424
authorizationInfo.setAlias(GsonHelper.getString(jsonObject, "alias"));
2525
authorizationInfo.setQrcodeUrl(GsonHelper.getString(jsonObject, "qrcode_url"));
26+
authorizationInfo.setSignature(GsonHelper.getString(jsonObject, "signature"));
27+
2628
if (jsonObject.has("service_type_info")) {
2729
authorizationInfo.setServiceTypeInfo(GsonHelper.getInteger(jsonObject.getAsJsonObject("service_type_info"), "id"));
2830
}
@@ -33,11 +35,12 @@ public WxOpenAuthorizerInfo deserialize(JsonElement jsonElement, Type type, Json
3335
new TypeToken<Map<String, Integer>>() {
3436
}.getType());
3537
authorizationInfo.setBusinessInfo(businessInfo);
36-
37-
WxOpenAuthorizerInfo.MiniProgramInfo miniProgramInfo = WxOpenGsonBuilder.create().fromJson(jsonObject.get("MiniProgramInfo"),
38-
new TypeToken<WxOpenAuthorizerInfo.MiniProgramInfo>() {
39-
}.getType());
40-
authorizationInfo.setMiniProgramInfo(miniProgramInfo);
38+
if (jsonObject.has("MiniProgramInfo")) {
39+
WxOpenAuthorizerInfo.MiniProgramInfo miniProgramInfo = WxOpenGsonBuilder.create().fromJson(jsonObject.get("MiniProgramInfo"),
40+
new TypeToken<WxOpenAuthorizerInfo.MiniProgramInfo>() {
41+
}.getType());
42+
authorizationInfo.setMiniProgramInfo(miniProgramInfo);
43+
}
4144
return authorizationInfo;
4245
}
4346
}

0 commit comments

Comments
 (0)