예제 #1
0
        /// <summary>
        /// (重)发送入园凭证短信 基础数据验证
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public DataValidResult ValidDataForMessageSendRequest(MessageSendRequest request)
        {
            var orderInfo = request.Body.OrderInfo;
            var result    = new DataValidResult {
                Status = false
            };

            if (string.IsNullOrEmpty(orderInfo.OrderId))
            {
                result.Code    = "117001";
                result.Message = "(重)发送入园凭证短信异常,订单id不能为空";
                return(result);
            }
            if (string.IsNullOrEmpty(orderInfo.phoneNumber))
            {
                result.Code    = "117002";
                result.Message = "(重)发送入园凭证短信异常,重发手机号码不能为空";
                return(result);
            }
            if (!RegexValidation.IsCellPhone(orderInfo.phoneNumber))
            {
                result.Code    = "117003";
                result.Message = "(重)发送入园凭证短信异常,重发手机号码异常";
                return(result);
            }
            result.Status = true;
            return(result);
        }
예제 #2
0
        public async Task <MessageSendResponse> SendMulticast(MessageSendRequest request)
        {
            var message = new MulticastMessage()
            {
                Notification = new Notification()
                {
                    Title = request.NotificationTitle,
                    Body  = request.NotificationBody,
                },
                Tokens = request.Tokens,
            };

            var response = await _firebaseService.SendMulticastAsync(message);

            var returnResponse = new MessageSendResponse()
            {
                Responses = response.Responses.Select(x => new ResponseItem
                {
                    IsSuccess = x.IsSuccess,
                    MessageId = x.MessageId,
                    Exception = x.IsSuccess ? null : new ExceptionItem
                    {
                        Message            = x.Exception.Message,
                        MessagingErrorCode = x.Exception.MessagingErrorCode.HasValue ? (int)x.Exception.MessagingErrorCode : 0
                    }
                }),
                FailureCount = response.FailureCount,
                SuccessCount = response.SuccessCount
            };

            return(returnResponse);
        }
예제 #3
0
        /// <summary>
        /// 发送短信
        /// </summary>
        /// <param name="body"></param>
        /// <returns></returns>
        public static MessageSendResponse SendMessage(MessageSendBody body)
        {
            var request = new MessageSendRequest
            {
                Head = new HeadRequest
                {
                    InvokeTime      = DateTime.Now.ToString("yyyy-MM-dd"),
                    InvokeUser      = key,
                    ProtocolVersion = "V1"
                },
                Body = body
            };
            string url    = apiUrl + "message/send";
            var    result = dooPost(request, url).Result;

            if (!string.IsNullOrEmpty(result.Data))
            {
                return(Base64Helper.Base64EncodeToObject <MessageSendResponse>(result.Data));
            }
            return(new MessageSendResponse {
                Head = new HeadResponse {
                    Describe = "数据格式不正确"
                }
            });
        }
예제 #4
0
        public async Task <IActionResult> MessageSend(MessageSendRequest request)
        {
            var response = await mediator.Send(request);

            logger.LogResponse($"User #{HttpContext.GetCurrentUserId()} sent message to friend #{request.RecipientId}", response.Error);

            return(response.IsSucceeded ? (IActionResult)Ok(response) : BadRequest(response));
        }
예제 #5
0
        private void SendMessage(MessageSendRequest postData)
        {
            RestRequestEx request = new RestRequestEx(
                $"users/xuid({Config.XboxUserId})/outbox", Method.POST);

            request.AddHeaders(Headers);
            request.AddJsonBody(postData, JsonNamingStrategy.CamelCase);

            IRestResponse response = HttpClient.Execute(request);
        }
        private async Task SendMessageAsync(MessageSendRequest postData)
        {
            var request = new HttpRequestMessage(HttpMethod.Post,
                                                 $"users/xuid({Config.XboxUserId})/outbox");

            request.Headers.Add(Headers);
            request.Content = new JsonContent(postData, JsonNamingStrategy.CamelCase);

            var response = await HttpClient.SendAsync(request);
        }
        private PageResult SendMessage(MessageSendRequest request, Tbl_OTABusiness business)
        {
            MessageSendOrderInfo orderInfo = request.Body.OrderInfo;
            MessageSendResponse  result    = new MessageSendResponse
            {
                Head = HeadResult.V1
            };
            var validResult = _orderService.ValidDataForMessageSendRequest(request);

            if (!validResult.Status)
            {
                result.Head.Code     = validResult.Code;
                result.Head.Describe = validResult.Message;
                return(PageDataResult.Data(result, business.Saltcode.ToString()));
            }
            var tbl_Order = _orderService.Get(orderInfo.OrderId);

            if (tbl_Order == null)
            {
                result.Head.Code     = "117004";
                result.Head.Describe = "(重)发送入园凭证短信异常,订单不存在";
                return(PageDataResult.Data(result, business.Saltcode.ToString()));
            }
            var tbl_OrderDetails = _orderDetailService.GetList(tbl_Order.OrderNo);

            if (tbl_OrderDetails.FirstOrDefault(a => a.EticektSendQuantity >= 5) != null)
            {
                result.Head.Code     = "117006";
                result.Head.Describe = "(重)发送入园凭证短信异常,发送次数不能超过5次";
                return(PageDataResult.Data(result, business.Saltcode.ToString()));
            }
            try
            {
                var sendResult = _smsService.Send(tbl_OrderDetails, tbl_Order.Mobile);
                if (sendResult.Status)
                {
                    result.Body = new MessageSendResponseBody
                    {
                        Message = "OK"
                    };
                    result.Head.Code     = "000000";
                    result.Head.Describe = "成功";
                    return(PageDataResult.Data(result, business.Saltcode.ToString()));
                }
                result.Head.Code     = "117005";
                result.Head.Describe = "(重)发送入园凭证短信异常,发送失败";
                return(PageDataResult.Data(result, business.Saltcode.ToString()));
            }
            catch (Exception ex)
            {
                result.Head.Code     = "117005";
                result.Head.Describe = "(重)发送入园凭证短信异常,发送失败";
                return(PageDataResult.Data(result, business.Saltcode.ToString()));
            }
        }
예제 #8
0
        public MessageSendResponse Notice(MessageSendRequest request)
        {
            var apiurl = string.Format(Urls.MessageSend, RequestHelper.GetAccessToken());

            var rtn = RequestHelper.Post <MessageSendResponse>(apiurl, request);

            if (rtn.ErrCode != ErrCodeEnum.OK)
            {
                throw new ApiException(ApiCodeEnum.Error, rtn.ErrMsg);
            }

            return(rtn);
        }
예제 #9
0
        private void OnMessageSend(NetConnection <NetSession> sender, MessageSendRequest message)
        {
            sender.Session.Response.messageSendResponse = new MessageSendResponse();
            Result res = sender.Session.Character.messageManager.OnMessageSend(sender, message);

            Log.Info($@"OnMessageSend Type:{message.Type} 
                        From:{message.messageInfo.FromInfo.Id} To:{message.ToId} 
                        Result:{res}
                        Msg{sender.Session.Response.messageSendResponse.Errormsg}");
            sender.Session.Response.messageSendResponse.Type   = message.Type;
            sender.Session.Response.messageSendResponse.Result = res;
            sender.SendResponse();
        }
        public void CreateMessageSendRequest()
        {
            string expectedXuid     = TestData["MessageSendMessageXuidRequest.json"];
            string expectedGamertag = TestData["MessageSendMessageGtRequest.json"];

            ulong[]            xuids       = new ulong[] { 2580478784034343, 2535771801919068, 2508565379774180 };
            string[]           gamertags   = new string[] { "Gamertag1", "Gamertag2" };
            MessageSendRequest requestXuid = new MessageSendRequest("TestString", xuids);
            MessageSendRequest requestGt   = new MessageSendRequest("TestString", gamertags);
            string             bodyXuid    = NewtonsoftJsonSerializer.Create(JsonNamingStrategy.CamelCase)
                                             .Serialize(requestXuid);
            string bodyGt = NewtonsoftJsonSerializer.Create(JsonNamingStrategy.CamelCase)
                            .Serialize(requestGt);

            Assert.AreEqual(expectedXuid, bodyXuid);
            Assert.AreEqual(expectedGamertag, bodyGt);
        }
예제 #11
0
        /// <summary>
        /// 发送短信
        /// </summary>
        /// <param name="body"></param>
        /// <returns></returns>
        public MessageSendResponse SendMessage(MessageSendBody body)
        {
            var request = new MessageSendRequest
            {
                Head = RequestHead(),
                Body = body
            };
            string url    = _website + "message/send";
            var    result = PostService(request, url);

            if (!string.IsNullOrEmpty(result.Data))
            {
                return(Base64Helper.Base64EncodeToObject <MessageSendResponse>(result.Data));
            }
            return(new MessageSendResponse
            {
                Head = new HeadResponse
                {
                    Code = "900001",
                    Describe = "数据格式不正确"
                }
            });
        }
예제 #12
0
        public void SendMessage(string messageText, ulong[] xuids)
        {
            MessageSendRequest postData = new MessageSendRequest(messageText, xuids);

            SendMessage(postData);
        }
예제 #13
0
        public async Task <ServiceProviderResponse> OtpPushAsync(string account, OtpPushDescription description, ServiceProviderRequest request, string requestId, CancellationToken cancellationToken)
        {
            var channel     = OtpChannelHelper.Format(description.Channel);
            var smsProvider = ProviderManager.GetSmsServiceProvider();

            // Check if templete type is 2
            var smsGetRequest = new ServiceProviderRequest
            {
                HttpMethod          = "GET",
                Path                = "templates/" + description.TemplateName,
                Content             = string.Empty,
                Headers             = request.Headers,
                QueryNameValuePairs = request.QueryNameValuePairs,
            };
            var subscriptionId = await RequestHelper.GetSubscriptionId(account);

            try
            {
                var result = await smsProvider.OnRequestAsync(smsGetRequest);

                var    projson = JObject.Parse(result.Content);
                JToken tpltype;
                if (projson.TryGetValue("tplType", out tpltype) && ((int)tpltype != 2))
                {
                    throw new ArgumentException($"Invalid template type.");
                }

                // generate otpCode
                var code = GetOtpCode((int)description.CodeLength);

                // prepare messageSendRequest for sending request to sms provider
                MessageSendRequest messageSendRequest = new MessageSendRequest()
                {
                    Targets = new List <string>()
                    {
                        description.PhoneNumber
                    },
                    MessageBody = new MessageTemplateBody()
                    {
                        TemplateName       = description.TemplateName,
                        TemplateParameters = new PropertyCollection <string>()
                    }
                };
                messageSendRequest.MessageBody.TemplateParameters.Add("otpcode", code);
                var content = JsonConvert.SerializeObject(messageSendRequest);

                // create request for sms provider
                var smsRequest = new ServiceProviderRequest
                {
                    HttpMethod          = "POST",
                    Path                = "messages",
                    Content             = content,
                    Headers             = request.Headers,
                    QueryNameValuePairs = request.QueryNameValuePairs
                };

                // send push request to sms provider
                result = await smsProvider.OnRequestAsync(smsRequest);

                if (result.StatusCode != HttpStatusCode.OK)
                {
                    return(result);
                }

                // Create otp record in db
                var otpcode = await this.otpStore.CreateorUpdateOtpCodeAsync(account, description.PhoneNumber, code, (int)description.ExpireTime);

                // Create otp check history in otp storage table
                await this.otpStorage.CreateOtpCodeHistoryRecord(account, description.PhoneNumber, ActionType.Start.ToString(), DateTime.UtcNow);

                this.metricManager.LogOtpSendSuccess(1, account, subscriptionId, description.Channel);
                OtpProviderEventSource.Current.Info(requestId, this, nameof(this.OtpPushAsync), OperationStates.Succeeded, $"account: {account}, channel: {channel}, phoneNumber: {description.PhoneNumber}");
                return(new ServiceProviderResponse
                {
                    StatusCode = HttpStatusCode.OK,
                    JsonContent = new OtpStartOperationResult
                    {
                        ExpireTime = (int)description.ExpireTime
                    }
                });
            }
            catch (Exception ex)
            {
                this.metricManager.LogOtpSendFailed(1, account, subscriptionId, description.Channel);
                while (ex is AggregateException)
                {
                    ex = ex.InnerException;
                }

                OtpProviderEventSource.Current.ErrorException(requestId, this, nameof(this.OtpPushAsync), OperationStates.Failed, $"Failed to send OTP code for account: {account}, channel: {channel}, phoneNumber: {description.PhoneNumber}", ex);

                if ((ex is ArgumentException) || (ex is QuotaExceededException))
                {
                    throw ex;
                }

                throw new Exception(string.Format($"Failed to send OTP code for account: {account}, channel: {channel}, phoneNumber: {description.PhoneNumber}"));
            }
        }
예제 #14
0
        public ActionResult <RequestResult> SendMessage([FromServices] ITokens tokens, [FromServices] IConfiguration config, [FromServices] MessageData messageData, MessageSendRequest messageSendRequest)
        {
            var result = new RequestResult();

            const string firebaseFuncName = "SendMessage";
            var          client           = new RestClient(config["FirebaseLink"]);
            var          androidToken     = tokens.AndroidToken;
            var          req = new RestRequest(firebaseFuncName, Method.POST);

            var message    = messageSendRequest.Message;
            var recipients = messageSendRequest.Recipients;
            var messageID  = messageSendRequest.MessageID;


            foreach (var conversation in messageData.Conversations.Where(conversation => conversation.ConversationID == messageSendRequest.ConversationID))
            {
                conversation.MostRecent = message;
            }

            Message newMsg = new Message();

            newMsg.ConversationID   = messageSendRequest.ConversationID;
            newMsg.sentSuccessfully = false;
            newMsg.Sender           = "";
            newMsg.IsSender         = true;
            newMsg.TimeStamp        = DateTime.Now;
            newMsg.MessageBody      = message;

            // GUID stuff
            messageData.UnsentMessageGuids[messageID] = newMsg;

            if (messageData.ConversationToMessages.TryGetValue(messageSendRequest.ConversationID, out var msgList))
            {
                messageData.ConversationToMessages[messageSendRequest.ConversationID].Add(newMsg);
            }
            else
            {
                messageData.ConversationToMessages[messageSendRequest.ConversationID] = new List <Message>();
                messageData.ConversationToMessages[messageSendRequest.ConversationID].Add(newMsg);
            }

            var dict = new Dictionary <string, object>()
            {
                { "Token", androidToken },
                { "Message", message },
                { "Recipients", JsonConvert.SerializeObject(recipients) },
                { "MessageID", messageID }
            };

            req.AddParameter("application/json; charset=utf-8", JsonConvert.SerializeObject(dict), ParameterType.RequestBody);
            req.RequestFormat = DataFormat.Json;
            var response = client.Execute(req);

            if (response.StatusCode == HttpStatusCode.OK)
            {
                result.ResultMessage = "Successfully sent SendMessage request to firebase";
                result.Status        = ResultStatus.Success;
                return(Ok(result));
            }
            else
            {
                result.ErrorMessage = response.ErrorMessage;
                result.Status       = ResultStatus.Failure;
                return(BadRequest(result));
            }
        }
예제 #15
0
        private async Task <MessagePack> BuildInputMessageAsync(Account account, MessageSendRequest request, string requestId)
        {
            // Validate extended code
            this.ValidateExtendedCode(request.ExtendedCode);

            // Get template
            var template = await this.store.GetTemplateAsync(account.EngagementAccount, request.MessageBody.TemplateName);

            Validator.IsTrue <ArgumentException>(template != null && template.State == ResourceState.Active, nameof(template), "Template does not exist or is not active");

            // Validate account settings
            this.ValidateAccountSettings(account, template);

            // Get signature
            var signature = await this.store.GetSignatureAsync(account.EngagementAccount, template.Signature);

            Validator.IsTrue <ArgumentException>(signature != null && signature.State == ResourceState.Active, nameof(signature), "Signature does not exist or is not active");

            // Get message body
            var messageBody = this.ValidateTemplateParameters(template, request.MessageBody.TemplateParameters);

            messageBody = string.Format(SmsConstant.SmsBodyFormat, signature.Value, messageBody);

            // Get credential assignement
            var channelType = SmsConstant.MessageSendChannelMappings[template.Category];
            var assignment  = await this.credentialManager.GetCredentialAssignmentByAccountAsync(account.EngagementAccount, channelType);

            Validator.IsTrue <ApplicationException>(assignment != null, nameof(assignment), "No active credential assignment for account {0}", account.EngagementAccount);

            // Get credential and metadata
            var credential = await this.credentialManager.GetConnectorCredentialByIdAsync(assignment.ConnectorIdentifier);

            Validator.IsTrue <ApplicationException>(credential != null, nameof(credential), "Invalid credential for account {0}", account.EngagementAccount);

            var metadata = await this.credentialManager.GetMetadata(assignment.ConnectorIdentifier.ConnectorName);

            // Extended code consists of three segments
            var extendedCodes = new List <string>
            {
                assignment.ExtendedCode,
                signature.ExtendedCode,
                request.ExtendedCode
            };

            var extension = new SmsMessageInfoExtension();

            extension.ChannelType     = SmsConstant.MessageSendChannelMappings[template.Category];
            extension.MessageCategory = template.Category;
            extension.ExtendedCodes   = extendedCodes;

            var message = new InputMessage();

            message.MessageInfo = new MessageInfo();
            message.MessageInfo.EngagementAccount = account.EngagementAccount;
            message.MessageInfo.MessageId         = Guid.NewGuid();
            message.MessageInfo.MessageBody       = messageBody;
            message.MessageInfo.SendTime          = DateTime.UtcNow;
            message.MessageInfo.TrackingId        = requestId;
            message.MessageInfo.ExtensionData     = extension.ToString();

            message.Targets             = request.Targets.AsReadOnly();
            message.ConnectorCredential = credential.ToDataContract(metadata);

            return(new MessagePack
            {
                InputMessage = message,
                Extension = extension,
                Signature = signature
            });
        }
예제 #16
0
        public async Task <ServiceProviderResponse> SendMessageAsync(
            [FromHeader(Constant.OperationTrackingIdHeader)] string requestId,
            [FromHeader] string account,
            [FromBody] MessageSendRequest request)
        {
            Account currentAccount = null;

            try
            {
                SmsProviderEventSource.Current.Info(requestId, this, nameof(this.SendMessageAsync), OperationStates.Received, $"Request is received");

                currentAccount = await this.ValidateAccount(account);

                Validator.ArgumentNotNull(request, nameof(request));
                Validator.ArgumentNotNull(request.MessageBody, nameof(request.MessageBody));
                Validator.ArgumentNotNullOrEmpty(request.MessageBody.TemplateName, request.MessageBody.TemplateName);

                request.Targets = this.ValidatePhoneNumbers(request.Targets);

                var pack = await this.BuildInputMessageAsync(currentAccount, request, requestId);

                var message = pack.InputMessage;
                SmsProviderEventSource.Current.Info(requestId, this, nameof(this.SendMessageAsync), OperationStates.Starting, $"Message is ready. messageId={message.MessageInfo.MessageId}");

                var signatureQuotaName = string.Format(Constant.SmsSignatureMAUNamingTemplate, pack.Signature.Value);
                SmsProviderEventSource.Current.Info(requestId, this, nameof(this.SendMessageAsync), OperationStates.Empty, $"If quota is enabled, request {request.Targets.Count} for account {account}. Otherwise, ignore");
                await QuotaCheckClient.AcquireQuotaAsync(account, SmsConstant.SmsQuotaName, request.Targets.Count);

                await QuotaCheckClient.AcquireQuotaAsync(account, signatureQuotaName, request.Targets.Count);

                try
                {
                    await this.reportManager.OnMessageSentAsync(account, message, pack.Extension);

                    SmsProviderEventSource.Current.Info(requestId, this, nameof(this.SendMessageAsync), OperationStates.Starting, $"Report is updated. messageId={message.MessageInfo.MessageId}");

                    await this.DispatchMessageAsync(message, pack.Extension, requestId);

                    SmsProviderEventSource.Current.Info(requestId, this, nameof(this.SendMessageAsync), OperationStates.Starting, $"Message is dispatched. messageId={message.MessageInfo.MessageId}");

                    this.metricManager.LogSendSuccess(1, account, currentAccount.SubscriptionId ?? string.Empty, pack.Extension.MessageCategory);
                    this.metricManager.LogSendTotal(BillingHelper.GetTotalSegments(message.MessageInfo.MessageBody), account, currentAccount.SubscriptionId ?? string.Empty, pack.Extension.MessageCategory);
                    var response = new MessageSendResponse
                    {
                        MessageId = message.MessageInfo.MessageId,
                        SendTime  = message.MessageInfo.SendTime
                    };

                    return(ServiceProviderResponse.CreateJsonResponse(HttpStatusCode.OK, response));
                }
                catch
                {
                    SmsProviderEventSource.Current.Info(requestId, this, nameof(this.SendMessageAsync), OperationStates.Empty, $"If quota is enabled, release {request.Targets.Count} for account {account}. Otherwise, ignore");
                    await QuotaCheckClient.ReleaseQuotaAsync(account, SmsConstant.SmsQuotaName, request.Targets.Count);

                    await QuotaCheckClient.ReleaseQuotaAsync(account, signatureQuotaName, request.Targets.Count);

                    this.metricManager.LogSendFailed(1, account, currentAccount.SubscriptionId ?? string.Empty, pack.Extension.MessageCategory);
                    throw;
                }
            }
            catch
            {
                this.metricManager.LogSendFailed(1, account, currentAccount?.SubscriptionId ?? string.Empty, null);
                throw;
            }
        }
        public async Task SendMessageAsync(string messageText, string[] gamertags)
        {
            MessageSendRequest postData = new MessageSendRequest(messageText, gamertags);

            await SendMessageAsync(postData);
        }
예제 #18
0
 public ApiResult <BaseResponse> Execute(MessageSendRequest request)
 {
     return(Execute <MessageSendRequest, BaseResponse>("/cgi/message/send", request));
 }
        public async Task SendMessageAsync(string messageText, ulong[] xuids)
        {
            MessageSendRequest postData = new MessageSendRequest(messageText, xuids);

            await SendMessageAsync(postData);
        }
예제 #20
0
        public void SendMessage(string messageText, string[] gamertags)
        {
            MessageSendRequest postData = new MessageSendRequest(messageText, gamertags);

            SendMessage(postData);
        }