* 微信开放平台:1. WxOpenInRedisConfigStorage 支持 JedisPool/JedisSentinelPool 等 Pool<Jedis> 的子类;2. WxOpenInRedisConfigStorage 增加 keyPrefix 以支持可配置的前缀; * 微信开放平台:增加小程序代码模板库管理 * 小程序:增加代码管理相关 API * 小程序:增加修改服务器地址、成员管理 APImaster
@@ -142,6 +142,13 @@ public interface WxMaService { | |||||
*/ | */ | ||||
WxMaCodeService getCodeService(); | WxMaCodeService getCodeService(); | ||||
/** | |||||
* 小程序修改服务器地址、成员管理 API | |||||
* | |||||
* @return WxMaSettingService | |||||
*/ | |||||
WxMaSettingService getSettingService(); | |||||
/** | /** | ||||
* 初始化http请求对象. | * 初始化http请求对象. | ||||
*/ | */ | ||||
@@ -0,0 +1,65 @@ | |||||
package cn.binarywang.wx.miniapp.api; | |||||
import cn.binarywang.wx.miniapp.bean.WxMaDomainAction; | |||||
import me.chanjar.weixin.common.exception.WxErrorException; | |||||
/** | |||||
* 小程序修改服务器地址、成员管理 API(大部分只能是第三方平台调用) | |||||
* | |||||
* @author <a href="https://github.com/charmingoh">Charming</a> | |||||
* @since 2018-04-27 15:46 | |||||
*/ | |||||
public interface WxMaSettingService { | |||||
/** | |||||
* 修改服务器地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489138143_WPbOO&token=&lang=zh_CN | |||||
* access_token 为 authorizer_access_token | |||||
*/ | |||||
String MODIFY_DOMAIN_URL = "https://api.weixin.qq.com/wxa/modify_domain"; | |||||
String SET_WEB_VIEW_DOMAIN_URL = "https://api.weixin.qq.com/wxa/setwebviewdomain"; | |||||
/** | |||||
* 小程序成员管理:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489140588_nVUgx&token=&lang=zh_CN | |||||
* access_token 为 authorizer_access_token | |||||
*/ | |||||
String BIND_TESTER_URL = "https://api.weixin.qq.com/wxa/bind_tester"; | |||||
String UNBIND_TESTER_URL = "https://api.weixin.qq.com/wxa/unbind_tester"; | |||||
/** | |||||
* 操作服务器域名 | |||||
* | |||||
* @param domainAction 域名操作参数 | |||||
* 除了 webViewDomain,都是有效的 | |||||
* @return 以下字段仅在 get 时返回完整字段 | |||||
* @throws WxErrorException 操作失败时抛出,具体错误码请看文档 | |||||
*/ | |||||
WxMaDomainAction modifyDomain(WxMaDomainAction domainAction) throws WxErrorException; | |||||
/** | |||||
* 设置小程序业务域名(仅供第三方代小程序调用) | |||||
* 授权给第三方的小程序,其业务域名只可以为第三方的服务器, | |||||
* 当小程序通过第三方发布代码上线后,小程序原先自己配置的业务域名将被删除, | |||||
* 只保留第三方平台的域名,所以第三方平台在代替小程序发布代码之前,需要调用接口为小程序添加业务域名。 | |||||
* 提示:需要先将域名登记到第三方平台的小程序业务域名中,才可以调用接口进行配置。 | |||||
* | |||||
* @param domainAction 域名操作参数 | |||||
* 只有 action 和 webViewDomain 是有效的 | |||||
* @return 以下字段仅在 get 时返回完整字段 | |||||
* @throws WxErrorException 操作失败时抛出,具体错误码请看文档 | |||||
*/ | |||||
WxMaDomainAction setWebViewDomain(WxMaDomainAction domainAction) throws WxErrorException; | |||||
/** | |||||
* 绑定微信用户为小程序体验者 | |||||
* | |||||
* @param wechatId 微信号 | |||||
* @throws WxErrorException 失败时抛出,具体错误码请看文档 | |||||
*/ | |||||
void bindTester(String wechatId) throws WxErrorException; | |||||
/** | |||||
* 解除绑定小程序的体验者 | |||||
* | |||||
* @param wechatId 微信号 | |||||
* @throws WxErrorException 失败时抛出,具体错误码请看文档 | |||||
*/ | |||||
void unbindTester(String wechatId) throws WxErrorException; | |||||
} |
@@ -5,6 +5,7 @@ import cn.binarywang.wx.miniapp.api.WxMaMediaService; | |||||
import cn.binarywang.wx.miniapp.api.WxMaMsgService; | import cn.binarywang.wx.miniapp.api.WxMaMsgService; | ||||
import cn.binarywang.wx.miniapp.api.WxMaQrcodeService; | import cn.binarywang.wx.miniapp.api.WxMaQrcodeService; | ||||
import cn.binarywang.wx.miniapp.api.WxMaService; | import cn.binarywang.wx.miniapp.api.WxMaService; | ||||
import cn.binarywang.wx.miniapp.api.WxMaSettingService; | |||||
import cn.binarywang.wx.miniapp.api.WxMaTemplateService; | import cn.binarywang.wx.miniapp.api.WxMaTemplateService; | ||||
import cn.binarywang.wx.miniapp.api.WxMaUserService; | import cn.binarywang.wx.miniapp.api.WxMaUserService; | ||||
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; | import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; | ||||
@@ -52,6 +53,7 @@ public class WxMaServiceImpl implements WxMaService, RequestHttp<CloseableHttpCl | |||||
private WxMaQrcodeService qrCodeService = new WxMaQrcodeServiceImpl(this); | private WxMaQrcodeService qrCodeService = new WxMaQrcodeServiceImpl(this); | ||||
private WxMaTemplateService templateService = new WxMaTemplateServiceImpl(this); | private WxMaTemplateService templateService = new WxMaTemplateServiceImpl(this); | ||||
private WxMaCodeService codeService = new WxMaCodeServiceImpl(this); | private WxMaCodeService codeService = new WxMaCodeServiceImpl(this); | ||||
private WxMaSettingService settingService = new WxMaSettingServiceImpl(this); | |||||
private int retrySleepMillis = 1000; | private int retrySleepMillis = 1000; | ||||
private int maxRetryTimes = 5; | private int maxRetryTimes = 5; | ||||
@@ -296,4 +298,9 @@ public class WxMaServiceImpl implements WxMaService, RequestHttp<CloseableHttpCl | |||||
public WxMaCodeService getCodeService() { | public WxMaCodeService getCodeService() { | ||||
return this.codeService; | return this.codeService; | ||||
} | } | ||||
@Override | |||||
public WxMaSettingService getSettingService() { | |||||
return this.settingService; | |||||
} | |||||
} | } |
@@ -0,0 +1,48 @@ | |||||
package cn.binarywang.wx.miniapp.api.impl; | |||||
import cn.binarywang.wx.miniapp.api.WxMaService; | |||||
import cn.binarywang.wx.miniapp.api.WxMaSettingService; | |||||
import cn.binarywang.wx.miniapp.bean.WxMaDomainAction; | |||||
import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; | |||||
import me.chanjar.weixin.common.exception.WxErrorException; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
/** | |||||
* @author <a href="https://github.com/charmingoh">Charming</a> | |||||
* @since 2018-04-27 15:46 | |||||
*/ | |||||
public class WxMaSettingServiceImpl implements WxMaSettingService { | |||||
private WxMaService wxMaService; | |||||
public WxMaSettingServiceImpl(WxMaService wxMaService) { | |||||
this.wxMaService = wxMaService; | |||||
} | |||||
@Override | |||||
public WxMaDomainAction modifyDomain(WxMaDomainAction domainAction) throws WxErrorException { | |||||
String responseContent = this.wxMaService.post(MODIFY_DOMAIN_URL, domainAction.toJson()); | |||||
return WxMaDomainAction.fromJson(responseContent); | |||||
} | |||||
@Override | |||||
public WxMaDomainAction setWebViewDomain(WxMaDomainAction domainAction) throws WxErrorException { | |||||
String responseContent = this.wxMaService.post(SET_WEB_VIEW_DOMAIN_URL, domainAction.toJson()); | |||||
return WxMaDomainAction.fromJson(responseContent); | |||||
} | |||||
@Override | |||||
public void bindTester(String wechatId) throws WxErrorException { | |||||
Map<String, Object> param = new HashMap<>(1); | |||||
param.put("wechatid", wechatId); | |||||
this.wxMaService.post(BIND_TESTER_URL, WxMaGsonBuilder.create().toJson(param)); | |||||
} | |||||
@Override | |||||
public void unbindTester(String wechatId) throws WxErrorException { | |||||
Map<String, Object> param = new HashMap<>(1); | |||||
param.put("wechatid", wechatId); | |||||
this.wxMaService.post(UNBIND_TESTER_URL, WxMaGsonBuilder.create().toJson(param)); | |||||
} | |||||
} |
@@ -0,0 +1,58 @@ | |||||
package cn.binarywang.wx.miniapp.bean; | |||||
import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; | |||||
import com.google.gson.annotations.SerializedName; | |||||
import lombok.Builder; | |||||
import lombok.Data; | |||||
import java.io.Serializable; | |||||
import java.util.List; | |||||
/** | |||||
* 域名相关操作 | |||||
* | |||||
* @author <a href="https://github.com/charmingoh">Charming</a> | |||||
* @since 2018-04-27 15:45 | |||||
*/ | |||||
@Data | |||||
@Builder | |||||
public class WxMaDomainAction implements Serializable { | |||||
private static final long serialVersionUID = -2898601966852935708L; | |||||
/** | |||||
* add添加, delete删除, set覆盖, get获取。当参数是get时不需要填四个域名字段 | |||||
*/ | |||||
private String action; | |||||
/** | |||||
* request合法域名,当action参数是get时不需要此字段。 | |||||
*/ | |||||
@SerializedName("requestdomain") | |||||
private List<String> requestDomain; | |||||
/** | |||||
* socket合法域名,当action参数是get时不需要此字段。 | |||||
*/ | |||||
@SerializedName("wsrequestdomain") | |||||
private List<String> wsRequestDomain; | |||||
/** | |||||
* uploadFile合法域名,当action参数是get时不需要此字段。 | |||||
*/ | |||||
@SerializedName("uploaddomain") | |||||
private List<String> uploadDomain; | |||||
/** | |||||
* downloadFile合法域名,当action参数是get时不需要此字段。 | |||||
*/ | |||||
@SerializedName("downloaddomain") | |||||
private List<String> downloadDomain; | |||||
/** | |||||
* 小程序业务域名,当action参数是get时不需要此字段。 | |||||
*/ | |||||
@SerializedName("webviewdomain") | |||||
private List<String> webViewDomain; | |||||
public String toJson() { | |||||
return WxMaGsonBuilder.create().toJson(this); | |||||
} | |||||
public static WxMaDomainAction fromJson(String json) { | |||||
return WxMaGsonBuilder.create().fromJson(json, WxMaDomainAction.class); | |||||
} | |||||
} |
@@ -0,0 +1,54 @@ | |||||
package cn.binarywang.wx.miniapp.api.impl; | |||||
import cn.binarywang.wx.miniapp.api.WxMaService; | |||||
import cn.binarywang.wx.miniapp.bean.WxMaDomainAction; | |||||
import cn.binarywang.wx.miniapp.test.ApiTestModule; | |||||
import com.google.inject.Inject; | |||||
import org.testng.annotations.Guice; | |||||
import org.testng.annotations.Test; | |||||
import static org.testng.Assert.assertNotNull; | |||||
/** | |||||
* @author <a href="https://github.com/charmingoh">Charming</a> | |||||
* @since 2018-04-27 15:38 | |||||
*/ | |||||
@Test | |||||
@Guice(modules = ApiTestModule.class) | |||||
public class WxMaSettingServiceImplTest { | |||||
@Inject | |||||
private WxMaService wxService; | |||||
@Test | |||||
public void testModifyDomain() throws Exception { | |||||
WxMaDomainAction domainAction = wxService.getSettingService().modifyDomain(WxMaDomainAction | |||||
.builder() | |||||
.action("get") | |||||
.build()); | |||||
System.out.println(domainAction); | |||||
assertNotNull(domainAction); | |||||
domainAction.setAction("set"); | |||||
WxMaDomainAction result = wxService.getSettingService().modifyDomain(domainAction); | |||||
System.out.println(result); | |||||
} | |||||
@Test | |||||
public void testBindTester() throws Exception { | |||||
wxService.getSettingService().bindTester("WeChatId"); | |||||
} | |||||
@Test | |||||
public void testUnbindTester() throws Exception { | |||||
wxService.getSettingService().unbindTester("WeChatId"); | |||||
} | |||||
@Test | |||||
public void testSetWebViewDomain() throws Exception { | |||||
WxMaDomainAction domainAction = wxService.getSettingService().setWebViewDomain(WxMaDomainAction | |||||
.builder() | |||||
.action("get") | |||||
.build()); | |||||
System.out.println(domainAction); | |||||
} | |||||
} |