public async Task <int> ExecSendMsgAsync(string accessToken, string data, int s)
        {
            LogHelper.Info("WeChatAppAuthorizeController->ExecSendMsgAsync");
            try
            {
                var a = await ThreadSleepAsync(s);

                accessToken = WeChatAppDecrypt.GetToken();
                //反序列化结果
                WechatToken    tokenModel = JsonConvert.DeserializeObject <WechatToken>(accessToken);
                string         url        = string.Format("https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token={0}", tokenModel.access_token);
                HttpWebRequest hwr        = WebRequest.Create(url) as HttpWebRequest;
                hwr.Method      = "POST";
                hwr.ContentType = "application/x-www-form-urlencoded";
                byte[] payload;
                payload           = System.Text.Encoding.UTF8.GetBytes(data); //通过UTF-8编码
                hwr.ContentLength = payload.Length;
                Stream writer = hwr.GetRequestStream();
                writer.Write(payload, 0, payload.Length);
                writer.Close();
                var    result = hwr.GetResponse() as HttpWebResponse; //此句是获得上面URl返回的数据
                string strMsg = WebResponseGet(result);
                LogHelper.Debug("strMsgAsync:" + strMsg);
            }
            catch (Exception e)
            {
                LogHelper.Debug("strMsgAsyncError:" + e.Message);
            };
            return(1);
        }
        /// <inheritdoc />
        public async Task <WechatToken> GetWechatToken(string wechatCode)
        {
            if (wechatCode == null)
            {
                throw new ArgumentNullException(nameof(wechatCode));
            }

            var url = string.Format(
                "https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type={3}",
                _options.AppId, _options.AppSecret, wechatCode, "authorization_code");

            HttpResponseMessage response;

            try
            {
                response = await GetApiResponse(url);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "尝试访问微信 API 时发生异常:{0}: {1}", ex.GetType(), ex.Message);
                throw;
            }

            if (!response.IsSuccessStatusCode)
            {
                _logger.LogError("微信 API 返回非 2XX 的 HTTP 状态码:{0}", response.StatusCode);
                // TODO: 更改下面的异常类型
                throw new Exception($"微信 API 返回了非 2XX 的 HTTP 状态码:{response.StatusCode}");
            }

            string responseBody;

            try
            {
                responseBody = await response.Content.ReadAsStringAsync();
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "尝试读取微信 API 响应时发生异常:{0}: {1}", ex.GetType(), ex.Message);
                throw;
            }

            var responseJson = JObject.Parse(responseBody);
            var errorCode    = responseJson["errcode"]?.Value <int>();

            if (errorCode != null && errorCode != 0)
            {
                var errorMessage = (string)responseJson["errmsg"];
                throw new WechatApiException(errorCode.Value, errorMessage);
            }

            return(WechatToken.FromWechatJson(responseJson));
        }
Пример #3
0
        private WechatToken CreateMockToken()
        {
            var mockJsonObject = new JObject();

            mockJsonObject["access_token"]  = MockAccessToken;
            mockJsonObject["expires_in"]    = MockExpireTime;
            mockJsonObject["refresh_token"] = MockRefreshToken;
            mockJsonObject["openid"]        = GenerateMockOpenId();
            mockJsonObject["scope"]         = MockScopes;

            return(WechatToken.FromWechatJson(mockJsonObject));
        }
        /// <inheritdoc />
        public Task <WechatToken> GetWechatToken(string wechatCode)
        {
            if (wechatCode == null)
            {
                throw new ArgumentNullException(nameof(wechatCode));
            }

            var mockJsonObject = new JObject();

            mockJsonObject["access_token"]  = string.Empty;
            mockJsonObject["expires_in"]    = 30 * 24 * 60 * 60;
            mockJsonObject["refresh_token"] = string.Empty;
            mockJsonObject["openid"]        = wechatCode;
            mockJsonObject["scope"]         = string.Empty;

            return(Task.FromResult(WechatToken.FromWechatJson(mockJsonObject)));
        }
Пример #5
0
        public void ReadFromValidWechatJsonStringInvalidNoUnionId()
        {
            var json = "{" +
                       "\"access_token\": \"ACCESS_TOKEN\"," +
                       "\"expires_in\": 7200, " +
                       "\"refresh_token\": \"REFRESH_TOKEN\", " +
                       "\"openid\": \"OPENID\", " +
                       "\"scope\": \"SCOPE1,SCOPE2\"," +
                       "}";
            var token = WechatToken.FromWechatJson(json);

            Assert.Equal("ACCESS_TOKEN", token.AccessToken);
            Assert.True(Math.Abs((token.ExpireTime - DateTime.Now).TotalSeconds - 7200) < 10);
            Assert.Equal("REFRESH_TOKEN", token.RefreshToken);
            Assert.Equal("OPENID", token.OpenId);
            Assert.Equal(new string[] { "SCOPE1", "SCOPE2" }, token.Scopes);
            Assert.Null(token.UnionId);
        }
Пример #6
0
        public void ReadFromInvalidWechatJsonString()
        {
            var json = "{ \"errcode\": 40029, \"errmsg\": \"invalid code\" }";

            Assert.ThrowsAny <Exception>(() => WechatToken.FromWechatJson(json));
        }
Пример #7
0
 public void ReadFromWechatJsonNull()
 {
     Assert.Throws <ArgumentNullException>(() => WechatToken.FromWechatJson((string)null));
     Assert.Throws <ArgumentNullException>(() => WechatToken.FromWechatJson((JObject)null));
 }
Пример #8
0
 /// <summary>
 /// 初始化 <see cref="AuthenticationToken"/> 类的新实例。
 /// </summary>
 /// <param name="userId">用户ID。</param>
 /// <param name="isAdmin">用户是否拥有管理员权限。</param>
 /// <param name="wechatToken">用于与微信 API 交互的 Token。</param>
 public AuthenticationToken(int userId, bool isAdmin, WechatToken wechatToken)
 {
     UserId      = userId;
     IsAdmin     = isAdmin;
     WechatToken = wechatToken;
 }