diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/service/WxOAuth2Service.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/service/WxOAuth2Service.java
index 97a74d2c6..5a53de010 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/service/WxOAuth2Service.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/service/WxOAuth2Service.java
@@ -14,11 +14,11 @@ public interface WxOAuth2Service {
   /**
    * 
    * 构造oauth2授权的url连接.
-   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=网页授权获取用户基本信息
+   * 详情请见: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
    * 
    *
    * @param redirectUri 用户授权完成后的重定向链接,无需urlencode, 方法内会进行encode
-   * @param scope       scope
+   * @param scope       scope,静默:snsapi_base, 带信息授权:snsapi_userinfo
    * @param state       state
    * @return url
    */
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/service/WxOAuth2ServiceDecorator.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/service/WxOAuth2ServiceDecorator.java
new file mode 100644
index 000000000..a495dbf82
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/service/WxOAuth2ServiceDecorator.java
@@ -0,0 +1,16 @@
+package me.chanjar.weixin.common.service;
+
+import lombok.AllArgsConstructor;
+import lombok.experimental.Delegate;
+
+/**
+ * 微信 oauth2服务 装饰器
+ *
+ * @author 广州跨界
+ */
+@AllArgsConstructor
+public class WxOAuth2ServiceDecorator implements WxOAuth2Service {
+
+  @Delegate
+  private final WxOAuth2Service wxOAuth2Service;
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpGuideTagService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpGuideTagService.java
index 554815b70..b2bb76d78 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpGuideTagService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpGuideTagService.java
@@ -7,6 +7,8 @@ import me.chanjar.weixin.mp.bean.guide.WxMpGuideTagInfo;
 import java.util.List;
 
 /**
+ * 微信导购助手(现在叫对话能力)标签相关接口.
+ *
  * @author 广州跨界-宋心成
  * @date 2021/5/13/013
  */
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGuideTagServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGuideTagServiceImpl.java
index 1bde21e9b..2747cbdae 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGuideTagServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGuideTagServiceImpl.java
@@ -106,7 +106,7 @@ public class WxMpGuideTagServiceImpl implements WxMpGuideTagService {
     body.put(ACCOUNT, account);
     body.put(OPENID, openid);
     body.put("push_count", pushCount);
-    body.put("tag_value", value);
+    body.put("tag_values", value);
     String returnString = this.mpService.post(WxMpApiUrl.Guide.QUERY_GUIDE_BUYER_BY_TAG, body);
     return WxGsonBuilder.create().fromJson(GsonParser.parse(returnString).getAsJsonArray("openid_list"),
       new TypeToken>() {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
index b0faef7a6..26dc2ba7f 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
@@ -1,8 +1,9 @@
 package me.chanjar.weixin.open.api;
 
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.open.bean.WxOpenCreateResult;
 import me.chanjar.weixin.open.bean.WxOpenGetResult;
 import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate;
@@ -330,7 +331,10 @@ public interface WxOpenComponentService {
    * @param code  the code
    * @return the wx mp o auth 2 access token
    * @throws WxErrorException the wx error exception
+   * @see WxMpService#getOAuth2Service()
+   * @deprecated 2021-05-21: 已修正公众号相关接口,请使用:WxOpenCommpentService.getWxMpServiceByAppid(mpAppId).getOAuth2Service().getAccessToken(code)
    */
+  @Deprecated
   WxOAuth2AccessToken oauth2getAccessToken(String appid, String code) throws WxErrorException;
 
   /**
@@ -362,7 +366,10 @@ public interface WxOpenComponentService {
    * @param scope       the scope
    * @param state       the state
    * @return the string
+   * @see WxMpService#getOAuth2Service()
+   * @deprecated 2021-05-21: 已修正公众号相关接口,请使用:WxOpenCommpentService.getWxMpServiceByAppid(mpAppId).getOAuth2Service().buildAuthorizationUrl(redirectUri, scope, state)
    */
+  @Deprecated
   String oauth2buildAuthorizationUrl(String appid, String redirectUri, String scope, String state);
 
   /**
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMpOAuth2ServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMpOAuth2ServiceImpl.java
new file mode 100644
index 000000000..406e36348
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMpOAuth2ServiceImpl.java
@@ -0,0 +1,61 @@
+package me.chanjar.weixin.open.api.impl;
+
+import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.service.WxOAuth2Service;
+import me.chanjar.weixin.common.service.WxOAuth2ServiceDecorator;
+import me.chanjar.weixin.common.util.http.URIUtil;
+import me.chanjar.weixin.mp.config.WxMpConfigStorage;
+import me.chanjar.weixin.open.api.WxOpenComponentService;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 微信 第三方平台对于公众号 oauth2 的实现类
+ *
+ * @author 广州跨界
+ */
+public class WxOpenMpOAuth2ServiceImpl extends WxOAuth2ServiceDecorator {
+
+  private final WxOpenComponentService wxOpenComponentService;
+  private final WxMpConfigStorage wxMpConfigStorage;
+
+
+  public WxOpenMpOAuth2ServiceImpl(WxOpenComponentService wxOpenComponentService, WxOAuth2Service wxOAuth2Service, WxMpConfigStorage wxMpConfigStorage) {
+    super(wxOAuth2Service);
+    this.wxOpenComponentService = wxOpenComponentService;
+    this.wxMpConfigStorage = wxMpConfigStorage;
+  }
+
+  /**
+   * 第三方平台代公众号发起网页授权
+   * 文档地址:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/Before_Develop/Official_Accounts/official_account_website_authorization.html
+   *
+   * @param code 微信授权code
+   * @return 微信用户信息
+   * @throws WxErrorException 如果微信接口调用失败将抛出此异常
+   */
+  @Override
+  public WxOAuth2AccessToken getAccessToken(String code) throws WxErrorException {
+    String url = String.format(
+      WxOpenComponentService.OAUTH2_ACCESS_TOKEN_URL,
+      wxMpConfigStorage.getAppId(),
+      code,
+      wxOpenComponentService.getWxOpenConfigStorage().getComponentAppId()
+    );
+    String responseContent = wxOpenComponentService.get(url);
+    return WxOAuth2AccessToken.fromJson(responseContent);
+  }
+
+  @Override
+  public String buildAuthorizationUrl(String redirectUri, String scope, String state) {
+    return String.format(
+      WxOpenComponentService.CONNECT_OAUTH2_AUTHORIZE_URL,
+      wxMpConfigStorage.getAppId(),
+      URIUtil.encodeURIComponent(redirectUri),
+      scope,
+      StringUtils.trimToEmpty(state),
+      wxOpenComponentService.getWxOpenConfigStorage().getComponentAppId()
+    );
+  }
+}
+
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMpServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMpServiceImpl.java
index 19e103fa2..8e5531153 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMpServiceImpl.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMpServiceImpl.java
@@ -10,7 +10,6 @@ import me.chanjar.weixin.open.api.WxOpenMpService;
 import me.chanjar.weixin.open.bean.mp.FastRegisterResult;
 
 import java.net.URLEncoder;
-import java.util.HashMap;
 import java.util.Objects;
 
 /**
@@ -22,9 +21,11 @@ public class WxOpenMpServiceImpl extends WxMpServiceImpl implements WxOpenMpServ
   private String appId;
 
   public WxOpenMpServiceImpl(WxOpenComponentService wxOpenComponentService, String appId, WxMpConfigStorage wxMpConfigStorage) {
+//    wxOpenComponentService.oauth2getAccessToken(appId)
     this.wxOpenComponentService = wxOpenComponentService;
     this.appId = appId;
     this.wxMpConfigStorage = wxMpConfigStorage;
+    setOAuth2Service(new WxOpenMpOAuth2ServiceImpl(wxOpenComponentService, getOAuth2Service(), wxMpConfigStorage));
     initHttp();
   }
 
diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenMpOAuth2ServiceImplTest.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenMpOAuth2ServiceImplTest.java
new file mode 100644
index 000000000..aab7af27d
--- /dev/null
+++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenMpOAuth2ServiceImplTest.java
@@ -0,0 +1,29 @@
+package me.chanjar.weixin.open.api.impl;
+
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.open.api.WxOpenMpService;
+import me.chanjar.weixin.open.test.ApiTestModule;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+@Guice(modules = ApiTestModule.class)
+public class WxOpenMpOAuth2ServiceImplTest {
+
+  @Inject
+  protected WxOpenMpService wxOpenMpService;
+
+
+  @Test
+  public void buildAuthorizationUrl() {
+    String url = wxOpenMpService.getOAuth2Service().buildAuthorizationUrl("https://t.aaxp.cn/api/base/mp/showCode", "snsapi_userinfo", "");
+    System.out.println(url);
+  }
+
+  @Test
+  public void getAccessToken() throws WxErrorException {
+    WxOAuth2AccessToken result = wxOpenMpService.getOAuth2Service().getAccessToken("041crm0005iFJL1b2l400I0s0k4crm0z");
+    System.out.println(result);
+  }
+}
diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/test/ApiTestModule.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/test/ApiTestModule.java
new file mode 100644
index 000000000..8a3c3b946
--- /dev/null
+++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/test/ApiTestModule.java
@@ -0,0 +1,64 @@
+package me.chanjar.weixin.open.test;
+
+import com.google.inject.Binder;
+import com.google.inject.Module;
+import com.thoughtworks.xstream.XStream;
+import me.chanjar.weixin.common.error.WxRuntimeException;
+import me.chanjar.weixin.common.util.xml.XStreamInitializer;
+import me.chanjar.weixin.open.api.WxOpenMaService;
+import me.chanjar.weixin.open.api.WxOpenMpService;
+import me.chanjar.weixin.open.api.WxOpenService;
+import me.chanjar.weixin.open.api.impl.WxOpenServiceImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public class ApiTestModule implements Module {
+  private final Logger log = LoggerFactory.getLogger(this.getClass());
+  private static final String TEST_CONFIG_XML = "test-config.xml";
+
+  @Override
+  public void configure(Binder binder) {
+    try (InputStream inputStream = ClassLoader.getSystemResourceAsStream(TEST_CONFIG_XML)) {
+      if (inputStream == null) {
+        throw new WxRuntimeException("测试配置文件【" + TEST_CONFIG_XML + "】未找到,请参照test-config-sample.xml文件生成");
+      }
+
+      TestConfigStorage config = this.fromXml(TestConfigStorage.class, inputStream);
+      WxOpenService service = new WxOpenServiceImpl();
+
+      service.setWxOpenConfigStorage(config);
+
+      binder.bind(TestConfigStorage.class).toInstance(config);
+      binder.bind(WxOpenService.class).toInstance(service);
+
+      if (config.getTestMpAppId() != null && !config.getTestMpAppId().isEmpty()) {
+        //如果配置了测试公众号,则构建公众号服务依赖
+        binder.bind(WxOpenMpService.class).toInstance(service.getWxOpenComponentService().getWxMpServiceByAppid(config.getTestMpAppId()));
+      } else {
+        log.warn("建议参照参照 test-config-sample.xml 配置测试公众号");
+      }
+
+      if (config.getTestMaAppId() != null && !config.getTestMaAppId().isEmpty()) {
+        //如果配置了测试小程序,则构建小程序服务依赖
+        binder.bind(WxOpenMaService.class).toInstance(service.getWxOpenComponentService().getWxMaServiceByAppid(config.getTestMaAppId()));
+      } else {
+        log.warn("建议参照参照 test-config-sample.xml 配置测试小程序");
+      }
+
+    } catch (IOException e) {
+      this.log.error(e.getMessage(), e);
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  private  T fromXml(Class clazz, InputStream is) {
+    XStream xstream = XStreamInitializer.getInstance();
+    xstream.alias("xml", clazz);
+    xstream.processAnnotations(clazz);
+    return (T) xstream.fromXML(is);
+  }
+
+}
diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/test/TestConfigStorage.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/test/TestConfigStorage.java
new file mode 100644
index 000000000..52e4fa8aa
--- /dev/null
+++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/test/TestConfigStorage.java
@@ -0,0 +1,16 @@
+package me.chanjar.weixin.open.test;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.Getter;
+import lombok.Setter;
+import me.chanjar.weixin.open.api.impl.WxOpenInMemoryConfigStorage;
+
+@Getter
+@Setter
+@XStreamAlias("xml")
+public class TestConfigStorage extends WxOpenInMemoryConfigStorage {
+
+  private String testMpAppId;
+
+  private String testMaAppId;
+}
diff --git a/weixin-java-open/src/test/resources/test-config.sample.xml b/weixin-java-open/src/test/resources/test-config.sample.xml
index 896969e43..f0130d0c8 100644
--- a/weixin-java-open/src/test/resources/test-config.sample.xml
+++ b/weixin-java-open/src/test/resources/test-config.sample.xml
@@ -1,7 +1,10 @@
 
   第三方平台appID
   第三方平台appsecret
+  第三方平台appsecret
+  微信服务器推送过来的ticket
   第三方平台Token
   第三方平台EncodingAESKey
-  测试APPID
+  测试公众号
+  测试小程序