@Override
  public void verify(final UChannel channel, String extension, final ISDKVerifyListener callback) {

    try {

      JSONObject json = JSONObject.fromObject(extension);
      final String uid = json.getString("uid");
      final String username = json.getString("nickname");

      Map<String, String> params = new HashMap<String, String>();
      params.put("appid", channel.getCpAppID());
      params.put("uid", uid);

      StringBuilder sb = new StringBuilder();
      sb.append(channel.getCpAppID()).append(channel.getCpAppKey()).append(uid);
      String sign = EncryptUtils.sha1(sb.toString());

      params.put("sign", sign.toUpperCase());

      String url = channel.getChannelAuthUrl();

      UHttpAgent.getInstance()
          .get(
              url,
              params,
              new UHttpFutureCallback() {
                @Override
                public void completed(String result) {

                  try {

                    Log.e("The auth result is " + result);

                    if ("SUCCESS".equals(result)) {

                      callback.onSuccess(new SDKVerifyResult(true, uid, username, ""));
                      return;
                    }

                  } catch (Exception e) {
                    e.printStackTrace();
                  }

                  callback.onFailed(
                      channel.getMaster().getSdkName()
                          + " verify failed. the post result is "
                          + result);
                }

                @Override
                public void failed(String e) {

                  callback.onFailed(channel.getMaster().getSdkName() + " verify failed. " + e);
                }
              });

    } catch (Exception e) {
      e.printStackTrace();
      callback.onFailed(
          channel.getMaster().getSdkName()
              + " verify execute failed. the exception is "
              + e.getMessage());
    }
  }
  @Action("getToken")
  public void getLoginToken() {

    Log.d("getToken...");

    try {

      final UGame game = gameManager.queryGame(this.appID);
      if (game == null) {
        renderState(StateCode.CODE_GAME_NONE, null);
        return;
      }

      final UChannel channel = channelManager.queryChannel(this.channelID);
      if (channel == null) {

        renderState(StateCode.CODE_CHANNEL_NONE, null);
        return;
      }

      if (channel.getAppID() != this.appID) {
        renderState(StateCode.CODE_CHANNEL_NOT_MATCH, null);
        return;
      }

      UChannelMaster master = channel.getMaster();
      if (master == null) {
        renderState(StateCode.CODE_CHANNEL_NONE, null);
        return;
      }

      StringBuilder sb = new StringBuilder();
      sb.append("appID=")
          .append(this.appID)
          .append("channelID=")
          .append(this.channelID)
          .append("extension=")
          .append(this.extension)
          .append(game.getAppkey());

      if (!userManager.isSignOK(sb.toString(), sign)) {
        Log.e("the sign is invalid. sign:" + sign);
        renderState(StateCode.CODE_SIGN_ERROR, null);
        return;
      }

      ISDKScript verifier = SDKCacheManager.getInstance().getSDKScript(channel);

      if (verifier == null) {
        Log.e("the ISDKScript is not found . channelID:" + channelID);
        renderState(StateCode.CODE_VERIFY_FAILED, null);
        return;
      }

      Log.d("The auth url is " + channel.getChannelAuthUrl());
      Log.d("channel is " + channel.getChannelID() + ";extension is " + extension);

      verifier.verify(
          channel,
          extension,
          new ISDKVerifyListener() {
            @Override
            public void onSuccess(SDKVerifyResult sdkResult) {

              try {
                Log.d("user verify success. result:" + sdkResult.getUserID());
                if (sdkResult.isSuccess() && !StringUtils.isEmpty(sdkResult.getUserID())) {

                  UUser user =
                      userManager.getUserByCpID(
                          channel.getAppID(), channel.getChannelID(), sdkResult.getUserID());

                  if (user == null) {
                    user = userManager.generateUser(channel, sdkResult);
                  } else {
                    user.setChannelUserName(
                        sdkResult.getUserName() == null ? "" : sdkResult.getUserName());
                    user.setChannelUserNick(
                        sdkResult.getNickName() == null ? "" : sdkResult.getNickName());
                    user.setLastLoginTime(new Date().getTime() + "");
                  }

                  user.setToken(UGenerator.generateToken(user, game.getAppSecret()));

                  userManager.saveUser(user);

                  JSONObject data = new JSONObject();
                  data.put("userID", user.getId());
                  data.put("sdkUserID", user.getChannelUserID());
                  data.put("username", user.getName());
                  data.put("sdkUserName", user.getChannelUserName());
                  data.put("token", user.getToken());
                  data.put("extension", sdkResult.getExtension());
                  data.put("timestamp", user.getLastLoginTime());
                  renderState(StateCode.CODE_SUCCESS, data);

                } else {
                  renderState(StateCode.CODE_AUTH_FAILED, null);
                }

              } catch (Exception e) {
                renderState(StateCode.CODE_AUTH_FAILED, null);
                e.printStackTrace();
              }
            }

            @Override
            public void onFailed(String errorMsg) {
              Log.e("The user verify failed. errorMsg:" + errorMsg);
              renderState(StateCode.CODE_AUTH_FAILED, null);
            }
          });

    } catch (Exception e) {
      Log.e(e.getMessage());
      renderState(StateCode.CODE_AUTH_FAILED, null);
    }
  }