Пример #1
0
        /// <summary>
        /// get token
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="passWord"></param>
        /// <returns></returns>
        public string GetToken(AuthorizationInput input)
        {
            //校验用户信息是否正确,如果正确则返回签名信息
            var sigin = JsonWebToken.Encode(input, key, JwtHashAlgorithm.HS384);

            return(sigin);
        }
Пример #2
0
        public async Task <IActionResult> Authorize(AuthorizationRequest request)
        {
            AuthorizationInput input = new AuthorizationInput
            {
                Card = new CreditCard
                {
                    CardNumber  = request.CardNumber,
                    CVV         = request.CVV,
                    ExpiryMonth = request.ExpiryMonth,
                    ExpiryYear  = request.ExpiryYear
                },
                Amount   = request.Amount,
                Currency = request.Currency
            };
            AuthorizationOutput serviceResponse = await _service.AuthorizeTransaction(input);

            AuthorizeResponse response = new AuthorizeResponse
            {
                AmountAvailable = serviceResponse.TransactionOutput.AmountAvailable,
                Currency        = serviceResponse.TransactionOutput.Currency,
                Error           = serviceResponse.TransactionOutput.Error,
                Id      = serviceResponse.AuthorizationId,
                Success = serviceResponse.TransactionOutput.Success
            };

            return(Ok(response));
        }
Пример #3
0
        private async Task <BankAuthorizationResponse> GetAuthorizationFromBank(AuthorizationInput authorizationInput)
        {
            ByteArrayContent    byteContent = GetAuthorizationRequestByteContent(authorizationInput);
            HttpResponseMessage response    = await _client.PostAsync(bankApiAddress + "authorize", byteContent);

            var responseContent = await response.Content.ReadAsAsync <BankAuthorizationResponse>();

            return(responseContent);
        }
Пример #4
0
        public ApiResponseBase GetToken(AuthorizationInput input)
        {
            var result = new ApiResponse()
            {
                Data = _authorizationCenter.GetToken(input)
            };

            return(result);
        }
Пример #5
0
        /// <inheritdoc />
        public ThirdPartyAuthorizeResult Authorize(AuthorizationInput input)
        {
            var tokenRequest = "https://api.weibo.com/oauth2/access_token" +
                               $"?client_id={AppId}&client_secret={AppSecret}&grant_type=authorization_code" +
                               $"&redirect_uri={RedirectUri}&code={input.Code}";
            var tokenResult = HttpRequester.Request(tokenRequest,
                                                    new HttpRequester.RequestOptions
            {
                Method = HttpRequester.HttpMethod.Post
            });
            var authorizeResult = JsonConvert.DeserializeObject <AuthorizeResult>(tokenResult);
            var accessToken     = authorizeResult.access_token;

            var uidRequest = "https://api.weibo.com/2/account/get_uid.json" +
                             $"?access_token={accessToken}";
            var uidResult = HttpRequester.Request(uidRequest, new HttpRequester.RequestOptions());
            var uid       = (string)JsonConvert.DeserializeObject <dynamic>(uidResult).uid;

            var thirdPartyUser = _thirdPartyUserRepository
                                 .GetAll()
                                 .FirstOrDefault(u => u.OpenId == uid);

            if (thirdPartyUser == null)
            {
                var userRequest = "https://api.weibo.com/2/users/show.json"
                                  + $"?access_token={accessToken}&uid={uid}";

                var userResult = HttpRequester.Request(userRequest, new HttpRequester.RequestOptions());
                var user       = JsonConvert.DeserializeObject <UserInfo>(userResult);
                thirdPartyUser = new ThirdPartyUser
                {
                    OpenId      = uid,
                    AccessToken = accessToken,
                    Name        = user.name,
                    NickName    = user.screen_name,
                    ThirdParty  = "Weibo"
                };
                _thirdPartyUserRepository.Insert(thirdPartyUser);
                CurrentUnitOfWork.SaveChanges();
            }
            thirdPartyUser.AccessToken = accessToken;
            CurrentUnitOfWork.SaveChanges();
            return(new ThirdPartyAuthorizeResult
            {
                ThirdPartyUser = new ThirdPartyUserOutput
                {
                    UserId = thirdPartyUser.UserId,
                    Name = thirdPartyUser.NickName,
                    NickName = thirdPartyUser.NickName
                },
                Token = $"OpenId={uid}&date={DateTime.Now:yyyy-MM-dd HH:mm:ss}&type=Weibo".EncryptQueryString(),
                Success = thirdPartyUser.UserId > 0,
                RequireCreateNewUser = thirdPartyUser.UserId == 0
            });
Пример #6
0
        private static ByteArrayContent GetAuthorizationRequestByteContent(AuthorizationInput authorizationInput)
        {
            dynamic authorizationRequest = new
            {
                cardNumber = authorizationInput.Card.CardNumber,
                amount     = authorizationInput.Amount
            };
            ByteArrayContent byteContent = GetByteContentFromDynamicObject(authorizationRequest);

            return(byteContent);
        }
Пример #7
0
        /// <inheritdoc />
        public ThirdPartyAuthorizeResult Authorize(AuthorizationInput input)
        {
            IAopClient client = new DefaultAopClient("https://openapi.alipay.com/gateway.do",
                                                     AppId, AppPrivateKey, "json", "1.0", "RSA2", AppPublicKey, "utf-8", false);
            AlipaySystemOauthTokenRequest tokenRequest = new AlipaySystemOauthTokenRequest
            {
                Code      = input.Code,
                GrantType = "authorization_code"
            };
            AlipaySystemOauthTokenResponse tokenResponse = client.Execute(tokenRequest);

            if (tokenResponse.IsError)
            {
                throw new UserFriendlyException("认证失败,请重试");
            }

            var thirdPartyUser = _thirdPartyUserRepository
                                 .GetAll()
                                 .FirstOrDefault(u => u.OpenId == tokenResponse.UserId);

            if (thirdPartyUser == null)
            {
                AlipayUserUserinfoShareRequest  userRequest  = new AlipayUserUserinfoShareRequest();
                AlipayUserUserinfoShareResponse userResponse = client.Execute(userRequest, tokenResponse.AccessToken);
                if (userResponse.IsError)
                {
                    throw new UserFriendlyException("认证失败,请重试");
                }
                thirdPartyUser = new ThirdPartyUser
                {
                    OpenId      = tokenResponse.UserId,
                    AccessToken = tokenResponse.AccessToken,
                    Name        = userResponse.RealName,
                    NickName    = userResponse.NickName,
                    ThirdParty  = "Alipay"
                };
                _thirdPartyUserRepository.Insert(thirdPartyUser);
                CurrentUnitOfWork.SaveChanges();
            }
            thirdPartyUser.AccessToken = tokenResponse.UserId;
            CurrentUnitOfWork.SaveChanges();
            return(new ThirdPartyAuthorizeResult
            {
                ThirdPartyUser = new ThirdPartyUserOutput
                {
                    UserId = thirdPartyUser.UserId,
                    Name = thirdPartyUser.NickName,
                    NickName = thirdPartyUser.NickName
                },
                Token = $"OpenId={tokenResponse.UserId}&date={DateTime.Now:yyyy-MM-dd HH:mm:ss}&type=Alipay".EncryptQueryString(),
                Success = thirdPartyUser.UserId > 0,
                RequireCreateNewUser = thirdPartyUser.UserId == 0
            });
Пример #8
0
        /// <inheritdoc />
        public ThirdPartyAuthorizeResult Authorize(AuthorizationInput input)
        {
            var tokenRequest = "https://api.weixin.qq.com/sns/oauth2/access_token" +
                               $"?appid={AppId}&secret={AppSecret}&code={input.Code}&grant_type=authorization_code";
            var tokenResult     = HttpRequester.Request(tokenRequest, new HttpRequester.RequestOptions());
            var authorizeResult = JsonConvert.DeserializeObject <AuthorizeResult>(tokenResult);
            var accessToken     = authorizeResult.access_token;
            var openId          = authorizeResult.openid;

            if (openId == null)
            {
                return(new ThirdPartyAuthorizeResult {
                    Success = false
                });
            }
            var thirdPartyUser = _thirdPartyUserRepository
                                 .GetAll()
                                 .FirstOrDefault(u => u.OpenId == openId);

            if (thirdPartyUser == null)
            {
                var userRequest = "https://api.weixin.qq.com/sns/userinfo" +
                                  $"?access_token={accessToken}&openid={openId}";
                var userResult = HttpRequester.Request(userRequest, new HttpRequester.RequestOptions());
                var user       = JsonConvert.DeserializeObject <UserInfo>(userResult);
                thirdPartyUser = new ThirdPartyUser
                {
                    OpenId      = openId,
                    AccessToken = accessToken,
                    Name        = user.nickname,
                    NickName    = user.nickname,
                    ThirdParty  = "Weixin"
                };
                _thirdPartyUserRepository.Insert(thirdPartyUser);
                CurrentUnitOfWork.SaveChanges();
            }
            thirdPartyUser.AccessToken = accessToken;
            CurrentUnitOfWork.SaveChanges();
            return(new ThirdPartyAuthorizeResult
            {
                ThirdPartyUser = new ThirdPartyUserOutput
                {
                    UserId = thirdPartyUser.UserId,
                    Name = thirdPartyUser.NickName,
                    NickName = thirdPartyUser.NickName
                },
                Token = $"OpenId={openId}&date={DateTime.Now:yyyy-MM-dd HH:mm:ss}&type=Weixin".EncryptQueryString(),
                Success = thirdPartyUser.UserId > 0,
                RequireCreateNewUser = thirdPartyUser.UserId == 0
            });
Пример #9
0
        private static bool CardNumberIsValid(AuthorizationInput authorizationInput, out string cardNumber)
        {
            cardNumber = authorizationInput.Card.CardNumber;
            if (cardNumber.Any(c => !char.IsDigit(c) && c != ' '))
            {
                return(false);
            }
            CreditCardDetector detector = new CreditCardDetector(authorizationInput.Card.CardNumber);

            if (detector.IsValid())
            {
                cardNumber = detector.CardNumber;
                return(true);
            }
            return(false);
        }
Пример #10
0
        /// <inheritdoc />
        public ThirdPartyAuthorizeResult Authorize(AuthorizationInput input)
        {
            var tokenRequest = "https://graph.qq.com/oauth2.0/token" +
                               $"?grant_type=authorization_code&client_id={AppId}&client_secret={AppKey}" +
                               $"&code={input.Code}&redirect_uri={RedirectUri}";
            var tokenResult   = HttpRequester.Request(tokenRequest, new HttpRequester.RequestOptions());
            var accessToken   = ParseAccessToken(tokenResult);
            var openIdRequest = "https://graph.qq.com/oauth2.0/me" +
                                $"?access_token={accessToken}";
            var openIdResult   = HttpRequester.Request(openIdRequest, new HttpRequester.RequestOptions());
            var openId         = ParseOpenId(openIdResult);
            var thirdPartyUser = _thirdPartyUserRepository
                                 .GetAll()
                                 .FirstOrDefault(u => u.OpenId == openId);

            if (thirdPartyUser == null)
            {
                var userRequest = "https://graph.qq.com/user/get_user_info" +
                                  $"?access_token={accessToken}&oauth_consumer_key={AppId}&openid={openId}";
                var userResult = HttpRequester.Request(userRequest, new HttpRequester.RequestOptions());
                var user       = JsonConvert.DeserializeObject <UserInfo>(userResult);
                thirdPartyUser = new ThirdPartyUser
                {
                    OpenId      = openId,
                    AccessToken = accessToken,
                    NickName    = user.nickname,
                    ThirdParty  = "QQ"
                };
                _thirdPartyUserRepository.Insert(thirdPartyUser);
                CurrentUnitOfWork.SaveChanges();
            }
            thirdPartyUser.AccessToken = accessToken;
            CurrentUnitOfWork.SaveChanges();
            return(new ThirdPartyAuthorizeResult
            {
                ThirdPartyUser = new ThirdPartyUserOutput
                {
                    UserId = thirdPartyUser.UserId,
                    Name = thirdPartyUser.NickName,
                    NickName = thirdPartyUser.NickName
                },
                Token = $"OpenId={openId}&date={DateTime.Now:yyyy-MM-dd HH:mm:ss}&type=QQ".EncryptQueryString(),
                Success = thirdPartyUser.UserId > 0,
                RequireCreateNewUser = thirdPartyUser.UserId == 0
            });
Пример #11
0
        public void AuthorizeTransaction_ServiceAuthorizes_ReturnsAuthorizationId()
        {
            Mock <IPaymentRepository> mockRepository  = GetMockRepository();
            Mock <HttpMessageHandler> mockHttpHandler = GetHttpHandlerMock("{success: true}");
            AuthorizationInput        input           = new AuthorizationInput
            {
                Card = new CreditCard
                {
                    CardNumber = "124142112411241"
                },
                Amount   = 5.00M,
                Currency = "GBP"
            };

            PaymentService service = GetService(mockRepository, mockHttpHandler);

            AuthorizationOutput output = service.AuthorizeTransaction(input).Result;

            Assert.IsNotNull(output.AuthorizationId);
        }
Пример #12
0
        public async Task <AuthorizationOutput> AuthorizeTransaction(AuthorizationInput authorizationInput)
        {
            //Check card number is valid
            bool validCreditCardNumber = CardNumberIsValid(authorizationInput, out string cardNumber);

            if (!validCreditCardNumber)
            {
                AuthorizationOutput authorizationOutput = GetFailedAuthorizationOuput("Invalid credit card");
                return(authorizationOutput);
            }
            authorizationInput.Card.CardNumber = cardNumber;

            //Authorize transaction with bank
            BankAuthorizationResponse bankAuthorization = await GetAuthorizationFromBank(authorizationInput);

            if (bankAuthorization.authorizedAmount == 0)
            {
                string error = "Failed to authorize";
                AuthorizationOutput failedAuthorizationOutput = GetFailedAuthorizationOuput(error);
                return(failedAuthorizationOutput);
            }

            //Add authorization to the database
            Transaction transaction = await _paymentRepository.GetAuthorization(authorizationInput.Amount,
                                                                                authorizationInput.Currency, bankAuthorization.id);

            AuthorizationOutput output = new AuthorizationOutput
            {
                AuthorizationId   = transaction.Id,
                TransactionOutput = new TransactionOutput
                {
                    AmountAvailable = bankAuthorization.authorizedAmount,
                    Currency        = authorizationInput.Currency,
                    Error           = null,
                    Success         = true
                }
            };

            return(output);
        }
Пример #13
0
        public void AuthorizeTransaction_ServiceReturnsInvalid_ReturnsErrorMessage()
        {
            Mock <IPaymentRepository> mockRepository  = GetMockRepository();
            Mock <HttpMessageHandler> mockHttpHandler = GetHttpHandlerMock("{success: false}");
            AuthorizationInput        input           = new AuthorizationInput
            {
                Card = new CreditCard
                {
                    CardNumber = "1412411114124111",
                    ExpiryYear = 2000
                },
                Amount   = 5.00M,
                Currency = "GBP"
            };

            PaymentService service = GetService(mockRepository, mockHttpHandler);

            AuthorizationOutput output = service.AuthorizeTransaction(input).Result;

            Assert.IsNotNull(output.TransactionOutput.Error);
            Assert.IsTrue(output.TransactionOutput.Error.Length > 0);
        }
Пример #14
0
        public async Task <CreateAuthorizationPayload> CreateAuthorizationAsync(
            [Service] IOpenIddictApplicationStore <ApplicationAuthorization> service, AuthorizationInput input,
            CancellationToken cancellationToken)
        {
            var apiResource = input.Adapt <ApplicationAuthorization>();

            await service.CreateAsync(apiResource, cancellationToken);

            return(new CreateAuthorizationPayload
            {
                Authorization = apiResource
            });
        }