/// <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); }
/// <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); }
/// <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); }
/// <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)); }
/// <summary> /// Obtaining New Refresh Tokens /// 如果当前时间离refreshToken过期时间在30天以内,那么可以调用postponeToken接口换取新的refreshToken;否则会报错 /// https://open.1688.com/api/sysAuth.htm?spm=a260s.8208020.0.0.ZL0di5&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)); }
/// <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); }
/// <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); }
/// <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)); }
/// <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); }
/*此接口不提供异步方法*/ /// <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); }
/// <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)); }