Example #1
0
        /// <summary>
        /// 获取可用AccessTokenResult对象
        /// </summary>
        /// <param name="clientId"></param>
        /// <param name="getNewToken">是否强制重新获取新的Token</param>
        /// <param name="sessionType"></param>
        /// <param name="requestUriSchema"></param>
        /// <returns></returns>
        public static async Task <AccessTokenResult> GetAccessTokenResultAsync(
            string clientId,
            bool getNewToken           = false,
            SessionType sessionType    = SessionType.Prod,
            UriSchema requestUriSchema = UriSchema.https)
        {
            if (!CheckRegistered(clientId))
            {
                throw new UnRegisterClientIdException(clientId, string.Format("此clientId({0})尚未注册,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!", clientId));
            }

            var accessTokenBag = TryGetItem(clientId);

            using (Cache.BeginCacheLock(LockResourceName, clientId))//同步锁
            {
                if (getNewToken || accessTokenBag.AccessTokenExpireTime <= DateTime.Now)
                {
                    //已过期,重新获取
                    //var accessTokenResult = await CommonApi.GetAccessTokenAsync(accessTokenBag.ClientId, accessTokenBag.ClientSecret, accessTokenBag.PreAuthCode, accessTokenBag.RedirectUri, sessionType);
                    var accessTokenResult = await Com.Alibaba.Open.OAuthAPIs.OAuthApi.GetAccessTokenAsync(
                        clientId : accessTokenBag.ClientId,
                        clientSecret : accessTokenBag.ClientSecret,
                        preAuthCode : accessTokenBag.PreAuthCode,
                        redirectUrl : accessTokenBag.RedirectUri,
                        sessionType : sessionType,
                        requestSchema : requestUriSchema
                        );

                    accessTokenBag.AccessTokenResult     = accessTokenResult;
                    accessTokenBag.AccessTokenExpireTime = ApiUtility.GetExpireTime(accessTokenBag.AccessTokenResult.expires_in);
                }
            }
            return(accessTokenBag.AccessTokenResult);
        }
Example #2
0
        /// <summary>
        /// 刷新AccessToken
        /// </summary>
        /// <param name="clientId"></param>
        /// <param name="sessionType"></param>
        /// <param name="requestUriSchema"></param>
        /// <returns></returns>
        public static async Task <AccessTokenResult> RefreshAccessTokenResultAsync(
            string clientId,
            SessionType sessionType    = SessionType.Prod,
            UriSchema requestUriSchema = UriSchema.https)
        {
            if (!CheckRegistered(clientId))
            {
                throw new UnRegisterClientIdException(clientId, string.Format("此clientId({0})尚未注册,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!", clientId));
            }

            var accessTokenBag = TryGetItem(clientId);

            using (Cache.BeginCacheLock(LockResourceName, clientId))//同步锁
            {
                //var accessTokenResult = await CommonApi.RefreshAccessTokenAsync(accessTokenBag.ClientId, accessTokenBag.ClientSecret, accessTokenBag.AccessTokenResult.data.refresh_token, sessionType);

                var accessTokenResult = await Com.Alibaba.Open.OAuthAPIs.OAuthApi.RefreshAccessTokenAsync(
                    clientId : accessTokenBag.ClientId,
                    clientSecret : accessTokenBag.ClientSecret,
                    refreshToken : accessTokenBag.AccessTokenResult.refresh_token,
                    sessionType : sessionType,
                    requestSchema : requestUriSchema
                    );

                accessTokenBag.AccessTokenResult.access_token = accessTokenResult.access_token;
                accessTokenBag.AccessTokenResult.expires_in   = accessTokenResult.expires_in;

                accessTokenBag.AccessTokenExpireTime = ApiUtility.GetExpireTime(accessTokenBag.AccessTokenResult.expires_in);
            }
            return(accessTokenBag.AccessTokenResult);
        }
Example #3
0
        /// <summary>
        /// 刷新 AccessToken
        /// </summary>
        /// <param name="clientId"></param>
        /// <param name="sessionType"></param>
        /// <param name="requestUriSchema"></param>
        /// <returns></returns>
        public static AccessTokenResult RefreshAccessTokenResult(
            string clientId,
            SessionType sessionType    = SessionType.Prod,
            UriSchema requestUriSchema = UriSchema.https)
        {
            if (!CheckRegistered(clientId))
            {
                throw new UnRegisterClientIdException(clientId, string.Format("此clientId({0})尚未注册,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!", clientId));
            }

            var accessTokenBag = TryGetItem(clientId);

            using (Cache.BeginCacheLock(LockResourceName, clientId))//同步锁
            {
                //accessTokenBag.AccessTokenResult = CommonApi.RefreshAccessToken(accessTokenBag.ClientId, accessTokenBag.ClientSecret, accessTokenBag.AccessTokenResult.data.refresh_token, sessionType);

                var refreshAccesstoken = Com.Alibaba.Open.OAuthAPIs.OAuthApi.RefreshAccessToken(
                    clientId: accessTokenBag.ClientId,
                    clientSecret: accessTokenBag.ClientSecret,
                    refreshToken: accessTokenBag.AccessTokenResult.refresh_token,
                    sessionType: sessionType,
                    requestSchema: requestUriSchema);

                //Console.WriteLine($"*******AccessTokenContainer.cs  {accessTokenBag.ClientId}  {accessTokenBag.ClientSecret}    {accessTokenBag.AccessTokenResult.refresh_token}  {sessionType} {requestUriSchema.ToString()} ");

                accessTokenBag.AccessTokenResult.access_token = refreshAccesstoken.access_token;
                accessTokenBag.AccessTokenResult.expires_in   = refreshAccesstoken.expires_in;

                accessTokenBag.AccessTokenExpireTime = ApiUtility.GetExpireTime(accessTokenBag.AccessTokenResult.expires_in);
            }

            return(accessTokenBag.AccessTokenResult);
        }
Example #4
0
        /// <summary>
        /// 获取AccessToken
        ///
        /// 范例
        /// https://open.1688.com/api/sysAuth.htm?spm=a260s.8208014.0.0.iacZUD&aamp;ns=cn.alibaba.open
        /// </summary>
        /// <param name="clientId">appKey</param>
        /// <param name="clientSecret">app密钥</param>
        /// <param name="preAuthCode">临时令牌 code</param>
        /// <param name="apiRoot">api 目录 </param>
        /// <param name="apiVersion">api 版本号</param>
        /// <param name="apiNamespace">api 命名空间</param>
        /// <param name="apiName">api 名称</param>
        /// <param name="protocol">调用协议</param>
        /// <param name="redirectUrl">回调地址</param>
        /// <param name="grantType">授权类型</param>
        /// <param name="needRefreshToken">是否需要刷新token</param>
        /// <param name="sessionType">请求环境</param>
        /// <param name="requestSchema">请求协议</param>
        /// <returns></returns>
        public static OAuthAccessTokenResult GetAccessToken(
            string clientId,
            string clientSecret,
            string preAuthCode,
            string apiRoot                = "openapi",
            string apiVersion             = "1",
            string apiNamespace           = "system.oauth2",
            string apiName                = "getToken",
            Com.Alibaba.Protocol protocol = Com.Alibaba.Protocol.http,
            string redirectUrl            = "http://localhost:12305",
            string grantType              = "authorization_code",
            bool needRefreshToken         = true,
            SessionType sessionType       = SessionType.Prod,
            UriSchema requestSchema       = UriSchema.https)
        {
            var url = new StringBuilder();

            url.Append(sessionType == SessionType.Sandbox ? Com.Alibaba.Config.RequestUriRootSandbox.UriSchemaFill(requestSchema) : Com.Alibaba.Config.RequestUriRoot.UriSchemaFill(requestSchema));
            url.Append($"/{apiRoot}/{protocol.ToString()}/{apiVersion}/{apiNamespace}/{apiName}/{clientId}");

            var data = new
            {
                grant_type         = grantType,
                need_refresh_token = needRefreshToken.ToString(),
                client_id          = clientId,     //   Your app's client ID
                client_secret      = clientSecret, //   Your app's client secret
                redirect_uri       = redirectUrl,
                code = preAuthCode                 //    The authorization code you received
            };

            return(CommonJsonSend.Send <OAuthAccessTokenResult>(null, url.ToString(), data, CommonJsonSendType.POST));
        }
Example #5
0
        /// <summary>
        /// Obtaining New Refresh Tokens
        /// 如果当前时间离refreshToken过期时间在30天以内,那么可以调用postponeToken接口换取新的refreshToken;否则会报错
        /// https://open.1688.com/api/sysAuth.htm?spm=a260s.8208020.0.0.ZL0di5&amp;ns=cn.alibaba.open
        ///
        /// </summary>
        /// <param name="clientId"></param>
        /// <param name="clientSecret"></param>
        /// <param name="accessToken"></param>
        /// <param name="refreshToken"></param>
        /// <param name="apiRoot"></param>
        /// <param name="apiVersion"></param>
        /// <param name="apiNamespace"></param>
        /// <param name="apiName"></param>
        /// <param name="protocol"></param>
        /// <param name="sessionType"></param>
        /// <param name="requestSchema"></param>
        /// <returns></returns>
        public static async Task <OAuthAccessTokenResult> RenewRefreshTokenAsync(
            string clientId,
            string clientSecret,
            string accessToken,
            string refreshToken,
            string apiRoot                = "openapi",
            string apiVersion             = "1",
            string apiNamespace           = "system.oauth2",
            string apiName                = "postponeToken",
            Com.Alibaba.Protocol protocol = Com.Alibaba.Protocol.param2,
            SessionType sessionType       = SessionType.Prod,
            UriSchema requestSchema       = UriSchema.https)
        {
            var url = new StringBuilder();

            url.Append(sessionType == SessionType.Sandbox ? Com.Alibaba.Config.RequestUriRootSandbox.UriSchemaFill(requestSchema) : Com.Alibaba.Config.RequestUriRoot.UriSchemaFill(requestSchema));
            url.Append($"/{apiRoot}/{protocol.ToString()}/{apiVersion}/{apiNamespace}/{apiName}/{clientId}");

            var data = new
            {
                client_id     = clientId,     //   Your app's client ID
                client_secret = clientSecret, //   Your app's client secret
                refresh_token = refreshToken, //    The authorization code you received
                access_token  = accessToken
            };

            return(await CommonJsonSend.SendAsync <OAuthAccessTokenResult>(null, url.ToString(), data, CommonJsonSendType.POST));
        }
Example #6
0
 /// <summary>
 /// 获取可用Token
 /// </summary>
 /// <param name="clientId"></param>
 /// <param name="getNewToken"></param>
 /// <param name="sessionType"></param>
 /// <param name="requestUriSchema"></param>
 /// <returns></returns>
 public static string GetAccessToken(
     string clientId,
     bool getNewToken           = false,
     SessionType sessionType    = SessionType.Prod,
     UriSchema requestUriSchema = UriSchema.https)
 {
     return(GetAccessTokenResult(clientId, getNewToken, sessionType, requestUriSchema).access_token);
 }
Example #7
0
        /// <summary>
        /// 【异步方法】获取可用Token
        /// </summary>
        /// <param name="clientId"></param>
        /// <param name="getNewToken"></param>
        /// <param name="sessionType"></param>
        /// <param name="requestUriSchema"></param>
        /// <returns></returns>
        public static async Task <string> GetAccessTokenAsync(
            string clientId,
            bool getNewToken           = false,
            SessionType sessionType    = SessionType.Prod,
            UriSchema requestUriSchema = UriSchema.https)
        {
            var result = await GetAccessTokenResultAsync(clientId, getNewToken, sessionType);

            return(result.access_token);
        }
Example #8
0
 /// <summary>
 /// 【异步方法】使用完整的应用凭证获取Token,如果不存在将自动注册
 ///
 /// 主入口函数
 /// </summary>
 /// <param name="clientId"></param>
 /// <param name="clientSecret"></param>
 /// <param name="preAuthCode"></param>
 /// <param name="redirectUri"></param>
 /// <param name="getNewToken"></param>
 /// <param name="sessionType"></param>
 /// <param name="requestUriSchema"></param>
 /// <returns></returns>
 public static async Task <string> TryGetAccessTokenAsync(
     string clientId,
     string clientSecret,
     string preAuthCode,
     string redirectUri,
     bool getNewToken           = false,
     SessionType sessionType    = SessionType.Prod,
     UriSchema requestUriSchema = UriSchema.https)
 {
     if (!CheckRegistered(clientId) || getNewToken)
     {
         Register(clientId, clientSecret, preAuthCode, redirectUri);
     }
     return(await GetAccessTokenAsync(clientId, getNewToken, sessionType, requestUriSchema));
 }
Example #9
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="inStr"></param>
        /// <param name="uriSchema"></param>
        /// <returns></returns>
        public static string UriSchemaFill(this string inStr, UriSchema uriSchema)
        {
            var retStr = inStr;

            switch (uriSchema)
            {
            case UriSchema.http:
                retStr = Regex.Replace(retStr, @"(?isx)\$\{RequestSchema\}", Convert.ToString(uriSchema));
                break;

            case UriSchema.https:
                retStr = Regex.Replace(retStr, @"(?isx)\$\{RequestSchema\}", Convert.ToString(uriSchema));
                break;

            default:
                break;
            }
            return(retStr);
        }
Example #10
0
        /*此接口不提供异步方法*/
        /// <summary>
        /// 获取验证地址
        /// </summary>
        /// <param name="clientId"></param>
        /// <param name="site"></param>
        /// <param name="redirectUrl">Your app's redirect uri that you specified when you created the app</param>
        /// <param name="state"></param>
        /// <param name="grantType"></param>
        /// <param name="sessionType"></param>
        /// <param name="requestSchema"></param>
        /// <returns></returns>
        public static string GetAuthorizeUrl(
            string clientId,
            string site             = "1688",
            string redirectUrl      = "http://localhost:12305",
            string state            = null,
            string grantType        = "authorization_code",
            SessionType sessionType = SessionType.Prod,
            UriSchema requestSchema = UriSchema.https)
        {
            var url = string.Format("{0}/oauth/authorize?client_id={1}&site={2}&redirect_uri={3}&state={4}"
                                    , sessionType == SessionType.Sandbox ? Com.Alibaba.Config.PreAuthUriRootSandbox.UriSchemaFill(requestSchema) : Com.Alibaba.Config.PreAuthUriRoot.UriSchemaFill(requestSchema)
                                    , clientId.AsUrlData()
                                    , site.AsUrlData()
                                    , redirectUrl.AsUrlData()
                                    , state.AsUrlData()
                                    );

            /* 这一步发送之后,客户会得到授权页面,无论同意或拒绝,都会返回redirectUrl页面。
             * 如果用户同意授权,页面将跳转至 redirect_uri?code={authorization_code}。这里的code用于换取access_token
             * 若用户禁止授权,则重定向后不会带上code参数
             */
            return(url);
        }
Example #11
0
        /// <summary>
        /// 订单列表查看(卖家视角)
        /// </summary>
        /// <param name="clientId"></param>
        /// <param name="clientSecret"></param>
        /// <param name="accessToken"></param>
        /// <param name="reqModelOrderListOnSellerView"></param>
        /// <param name="apiRoot"></param>
        /// <param name="apiVersion"></param>
        /// <param name="apiNamespace"></param>
        /// <param name="apiName"></param>
        /// <param name="protocol"></param>
        /// <param name="sessionType"></param>
        /// <param name="requestSchema"></param>
        /// <param name="validateSignature"></param>
        /// <param name="timeOut"></param>
        /// <returns></returns>
        public static Com.Alibaba.Trade.Entities.OrderListForSellerContainer OrderListOnSellerViewRetrieve(
            string clientId,
            string clientSecret,
            string accessToken,
            Com.Alibaba.Trade.Entities.Request.ReqModelOrderListForSeller reqModelOrderListOnSellerView,
            string apiRoot                = "openapi",
            string apiVersion             = "1",
            string apiNamespace           = "com.alibaba.trade",
            string apiName                = "alibaba.trade.getSellerOrderList",
            Com.Alibaba.Protocol protocol = Com.Alibaba.Protocol.param2,
            SessionType sessionType       = SessionType.Prod,
            UriSchema requestSchema       = UriSchema.https,
            bool validateSignature        = true,
            int timeOut = Config.TIME_OUT)
        {
            var requestPolicy = new Com.Alibaba.Entities.Request.RequestPolicy
            {
                ClientId          = clientId,
                ClientSecret      = clientSecret,
                AccessToken       = accessToken,
                ApiRoot           = apiRoot,
                ApiVersion        = apiVersion,
                ApiNamespace      = apiNamespace,
                ApiName           = apiName,
                Protocol          = protocol,
                SessionType       = sessionType,
                RequestSchema     = requestSchema,
                ValidateSignature = validateSignature
            };

            return(ApiHandlerWrapper.TryCommonApi(token =>
            {
                var result = CommonJsonSend.Send <Com.Alibaba.Trade.Entities.OrderListForSellerContainer>(requestPolicy, reqModelOrderListOnSellerView, timeOut: timeOut);
                return result;
            }, requestPolicy: requestPolicy));
        }