Exemplo n.º 1
0
        /// <summary>
        /// 修改用户,只修改基本信息
        /// </summary>
        /// <returns></returns>
        public ActionResult NimUserUpdateInfo(Int32 id)
        {
            NimUser NimUser = entities.NimUser.Find(id);

            ViewData.Model = NimUser.NimUserEx;
            return(View());
        }
Exemplo n.º 2
0
        public ActionResult CheckPermission(Int32 folderId, Int32 userId)
        {
            Folder folder = entities.Folder.Find(folderId);

            if (folder.Member.Any())
            {
                DateTime now  = DateTime.Now;
                var      vfmu = entities.View_Folder_Member_User.Where(o => o.FolderId == folderId && o.UserId == userId && o.From < now && now < o.To).ToList();

                NimUser user = entities.NimUser.Find(userId);
                if (user != null && user.Category == 1)
                {
                    return(Json(new { code = 200, desc = "拥有权限", info = vfmu.Select(o => new { o.MemberId, o.FolderId, o.UserId }) }));
                }

                if (vfmu.Count > 0)
                {
                    return(Json(new { code = 200, desc = "拥有权限", info = vfmu.Select(o => new { o.MemberId, o.FolderId, o.UserId }) }));
                }
                else
                {
                    return(Json(new { code = 201, desc = "没有权限" }));
                }
            }
            else
            {
                return(Json(new { code = 200, desc = "不需要权限" }));
            }
        }
Exemplo n.º 3
0
        public ActionResult Recharge(Int32 id)
        {
            NimUser user = entities.NimUser.Find(id);

            ViewData.Model = user;
            return(View());
        }
Exemplo n.º 4
0
        public ActionResult Dequeue(Int32 id)
        {
            NimUser user = entities.NimUser.Find(id);

            if (user == null)
            {
                return(Json(new { code = 201, desc = "用户不存在" }));
            }

            if (user.Category != 1)
            {
                return(Json(new { code = 202, desc = "用户类型错误" }));
            }
            //Queue<>

            user.IsOnline = 0;
            user.IsEnable = 0;
            //user.Enqueue = DateTime.Now.Ticks;
            //  user.Refresh = DateTime.Now.Ticks;

            try
            {
                entities.SaveChanges();
                return(Refresh(id, 0, 25));
            }
            catch (Exception ex)
            {
                return(Json(new { code = 203, desc = ex.Message }));
            }
        }
Exemplo n.º 5
0
        private static void NewMethod3()
        {
            StudyOnlineEntities entities = new StudyOnlineEntities();
            DateTime            now      = DateTime.Now;

            for (int i = 1; i <= 150; i++)
            {
                //创建帐号
                NimUser nimuser = new NimUser()
                {
                    Accid = Guid.NewGuid().ToString().Replace("-", ""), Category = 0, IsActive = 1, IsEnable = 1, Username = String.Format("CFFD{0:D3}", i), Password = EncryptionUtil.Md5Encode("00000000"), CreateDate = now, NimUserEx = new NimUserEx()
                    {
                        Coins = 600
                    }
                };

                //同步云信
                String json = NimUtil.UserCreate(nimuser.Accid, null, null, null);
                Answer a    = JsonConvert.DeserializeObject <Answer>(json);
                if (a.code == 200)
                {
                    nimuser.Token = a.info.token;
                }

                //保存数据
                entities.NimUser.Add(nimuser);
                Console.WriteLine("帐号:{0},密码:{2},学币:{1},accid={3},token={4}", nimuser.Username, nimuser.NimUserEx.Coins, nimuser.Password, nimuser.Accid, nimuser.Token);
            }

            entities.SaveChanges();
        }
Exemplo n.º 6
0
        public ActionResult Refresh(Int32 id, Int32 skip, Int32 take)
        {
            var all = entities.NimUser.Where(o => o.Category == 1 && o.IsOnline == 1 && o.IsEnable == 1).OrderBy(o => o.Id);

            Int32 Index = -1;

            NimUser k = all.FirstOrDefault(o => o.Id == id);

            if (k != null)
            {
                Index = all.Count();
            }

            return(Json(new
            {
                code = 200,
                desc = "查询成功",
                info = new
                {
                    Index,
                    Count = all.Count(),
                    Current = k == null ? null : new { k.Id, k.Username, k.IsOnline, k.IsEnable },
                    Teacher = all.Skip(skip).Take(take).Select(o => new { o.Id, o.Username, o.IsOnline, o.IsEnable })
                }
            }));
        }
Exemplo n.º 7
0
        public ActionResult GetListByUserId(Int32 userId, Int32?skip, Int32?take, DateTime?from, DateTime?to)
        {
            NimUser user = entities.NimUser.Find(userId);

            if (user == null)
            {
                return(Json(new { code = 201, desc = "用户不存在" }));
            }

            //区分用户类型,如果是学生,则取学生的,如果是老师,则取老师的
            Expression <Func <View_Chat_user, bool> > predicateCategory = o => true;

            if (user.Category == 0)
            {
                predicateCategory = o => o.Source == user.Id;
            }
            else if (user.Category == 1)
            {
                predicateCategory = o => o.Target == user.Id;
            }

            Expression <Func <View_Chat_user, bool> > predicateFrom = o => true;

            if (from != null)
            {
                predicateFrom = o => from < o.Start;
            }

            Expression <Func <View_Chat_user, bool> > predicateTo = o => true;

            if (to != null)
            {
                predicateTo = o => o.Start < to;
            }

            var   query    = entities.View_Chat_user.Where(o => o.ChatType == 1 && o.BalanceS == 1).Where(predicateCategory).Where(predicateFrom).Where(predicateTo).OrderByDescending(o => o.Start);
            Int32 count    = query.Count();
            Int32 duration = query.Sum(o => o.Duration) ?? 0;
            var   temp     = query.Skip(skip ?? 0).Take(take ?? Int32.MaxValue).ToList().Select(o => new
            {
                o.Id,
                o.Source,
                o.Student,
                o.Target,
                o.Teacher,
                UtcStart  = o.Start.Value.ToUniversalTime().ToString("u"),
                UtcFinish = o.Finish.Value.ToUniversalTime().ToString("u"),
                o.Start,
                o.Finish,
                o.ChatId,
                o.ChatType,
                o.Duration,
                o.BalanceS,
                o.Coins,
                Themes = entities.LogTheme.Where(t => t.ChatId == o.ChatId).Select(t => new { t.Theme.Name, Id = t.ThemeId })
            });

            return(new DateTimeSEJsonResult(new { code = 200, desc = "查询成功", info = new { duration, count, from, to, list = temp } }));
        }
Exemplo n.º 8
0
        public ActionResult GetByUserIdAndYearMonth(Int32?id, Int32?skip, Int32?take, DateTime?from, DateTime?to)
        {
            NimUser user = entities.NimUser.Find(id);

            if (user == null)
            {
                return(Json(new { code = 201, desc = "指定用户名不存在" }));
            }

            Expression <Func <CallLog, bool> > userPredicate  = o => user.Category == 0 ? o.Source == id : o.Target == id;
            Expression <Func <CallLog, bool> > rangePredicate = o => from < o.Start && o.Start <= to;
            List <CallLog> chats = entities.CallLog.Where(o => o.Start != null && o.Finish != null).Where(userPredicate).Where(rangePredicate).OrderByDescending(o => o.Start).Skip(skip ?? 0).Take(take ?? pageSize).ToList();

            var tha = chats.Where(o => o.Duration == null);

            if (tha.Any())
            {
                foreach (var item in tha)
                {
                    item.Duration = (Int32)((item.Finish - item.Start).Value.TotalMinutes + 0.5);
                }
                try
                {
                    entities.SaveChanges();
                }
                catch (Exception ex)
                {
                    logger.Error(ex);
                }
            }


            return(Json(new
            {
                code = 200,
                desc = "查询成功",
                info = chats.Select(o => new
                {
                    Start = o.Start.Value.ToString("yyyy-MM-dd HH:mm:ss"),
                    Finish = o.Finish.Value.ToString("yyyy-MM-dd HH:mm:ss"),
                    Duration = (Int32)((o.Finish - o.Start).Value.TotalMinutes + 0.5),
                    Teacher = new
                    {
                        o.NimUser1.Id,
                        Nickname = o.NimUser1.NimUserEx.Name ?? "",
                        o.NimUser1.Username
                    },
                    Student = new
                    {
                        o.NimUser.Id,
                        Nickname = o.NimUser.NimUserEx.Name ?? "",
                        o.NimUser.Username
                    },
                    Themes = entities.LogTheme.Where(i => i.ChatId == o.ChatId).Select(i => new { i.Theme.Name }),
                    o.Score,
                    o.Coins
                })
            }));
        }
Exemplo n.º 9
0
        /// <summary>
        /// 初始化消息列表
        /// </summary>
        /// <param name="myId">己方云信ID</param>
        /// <param name="user">对方云信名片</param>
        public void init(string myId, NimUser user)
        {
            this.myId = myId;
            target    = user;

            mlcMessage.init(user);
            mmeInput.Select();
        }
Exemplo n.º 10
0
        public ActionResult GetListByFolderId(Int32 folderId, Int32?userId, Int32?skip, Int32?take)
        {
            Folder folder = entities.Folder.Find(folderId);

            if (folder == null)
            {
                return(Json(new { code = 202, desc = "指定文件夹不存在" }));
            }

            var temp = folder.Document.Where(o => o.AuditCase == AuditCase.审核).OrderBy(o => o.Sort).ThenByDescending(o => o.AuditDate).Skip(skip ?? 0).Take(take ?? Int32.MaxValue).Select(o => new
            {
                o.Id,
                o.Title,
                o.TitleTwo,
                TitleCn = o.Title,
                TitleEn = o.TitleTwo,
                o.TitlePy,
                o.TitleSubCn,
                o.TitleSubEn,
                o.TitleSubPy,
                o.Category,
                o.SoundPath,
                o.Duration,
                o.Length,
                o.LengthString,
                o.Contents,
                o.FolderId,
                o.LevelId,
                AuditDate = (o.AuditDate.HasValue ? o.AuditDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : null),
                Date      = (o.AuditDate.HasValue ? o.AuditDate.Value.ToString("yyyy-MM-dd") : null),
                Size      = o.Length,
                Time      = o.Duration
            });

            if (folder.Member.Any())
            {
                DateTime now     = DateTime.Now;
                var      vfmu    = entities.View_Folder_Member_User.Where(o => o.FolderId == folderId && o.UserId == userId && o.From < now && now < o.To).ToList();
                NimUser  nimuser = entities.NimUser.Find(userId);


                if (vfmu.Count > 0 || (nimuser != null && nimuser.Category == 1))
                {
                    return(Json(new { code = 200, desc = "查询成功", info = temp.ToList() }));
                }
                else
                {
                    return(Json(new { code = 201, desc = "没有权限" }));
                }
            }
            return(Json(new { code = 200, desc = "查询成功", info = temp.ToList() }));
        }
Exemplo n.º 11
0
        public ActionResult NimUserUpdate(NimUser nimUser)
        {
            NimUser model = entities.NimUser.Find(nimUser.Id);
            int     exist = entities.NimUser.Where(o => o.Id != nimUser.Id && o.Username == nimUser.Username).Count();

            if (exist > 0)
            {
                return(Json(new { statusCode = "300", message = "帐号重复" }));
            }

            model.Username = nimUser.Username;
            model.Password = ChineseChat.Library.EncryptionUtil.Md5Encode(nimUser.Password);//密码加密
            model.Category = nimUser.Category;

            entities.SaveChanges();

            var data = new { statusCode = "200", message = "操作成功", navTabId = "AdminNimUserIndex", rel = "", callbackType = "closeCurrent", forwardUrl = "" };

            return(Json(data));
        }
Exemplo n.º 12
0
 public ActionResult GetStudentByUsername(String username, Int32 skip, Int32 take)
 {
     try
     {
         NimUser nimuser = entities.NimUser.Single(o => o.Username == username);
         var     temp    = entities.CallLog.Where(o => o.Source == nimuser.Id && o.Start != null && o.Finish != null).OrderByDescending(o => o.Start).Skip(skip).Take(take).ToList();
         return(Json(new
         {
             code = 200,
             desc = "查询成功",
             info = temp.Select(o => new
             {
                 o.Target,
                 Start = o.Start.Value.ToString("yyyy-MM-dd HH:mm:ss"),
                 Finish = o.Finish.Value.ToString("yyyy-MM-dd HH:mm:ss"),
                 (o.Finish - o.Start).Value.TotalSeconds,
                 Duration = (o.Finish - o.Start).Value.ToString(@"hh\:mm\:ss"),
                 Teacher = new
                 {
                     o.NimUser1.Id,
                     Nickname = o.NimUser1.NimUserEx.Name,
                     o.NimUser1.Username
                 },
                 Student = new
                 {
                     o.NimUser.Id,
                     Nickname = o.NimUser.NimUserEx.Name,
                     o.NimUser.Username
                 },
                 Themes = entities.LogTheme.Where(i => i.ChatId == o.ChatId).Select(i => new { i.Theme.Name }),
                 o.Score,
                 o.Coins
             })
         }));
     }
     catch (Exception ex)
     {
         return(Json(new { code = 201, desc = ex.Message }));
     }
 }
Exemplo n.º 13
0
        public void Execute(IJobExecutionContext context)
        {
            log.Info("now sync teacher");
            try
            {
                StudyOnlineEntities   entities = new StudyOnlineEntities();
                List <Teacherreginfo> teachers = entities.Teacherreginfo.Where(o => o.IsEnable == 1 && o.IsSync != 1).ToList();
                foreach (var item in teachers)
                {
                    //先创建云信帐号
                    //同步云信帐号系统
                    String json = NimUtil.UserCreate(Guid.NewGuid().ToString().Replace("-", ""), null, null, HttpUtility.UrlEncode(item.Truename));
                    Answer a    = JsonConvert.DeserializeObject <Answer>(json);
                    if (a.code == 200)
                    {
                        //修改数据库状态
                        item.IsSync = 1;

                        //创建新用户
                        NimUser nimUser = new NimUser()
                        {
                            Username = item.Username, Password = item.Password, Category = 1, Accid = a.info.accid, Token = a.info.token, CreateDate = DateTime.Now, IsActive = 1, IsOnline = 0
                        };
                        nimUser.NimUserEx = new NimUserEx()
                        {
                            Email = item.Username, Mobile = item.Phonenumber, Spoken = item.ForeignLanguages, School = item.Education, About = item.Note
                        };
                        entities.NimUser.Add(nimUser);
                    }
                    log.Info(String.Format("Syncint the teacher:{0}", item.Username));
                }

                entities.SaveChanges();
            }
            catch (Exception)
            {
                log.Info("sync failure");
            }
        }
Exemplo n.º 14
0
        public ActionResult GetByUsername(String username, Int32 type, Int32 skip, Int32 take)
        {
            NimUser user = entities.NimUser.Single(o => o.Username == username);
            Expression <Func <CallLog, bool> > predicate = o => (type == 0 ? o.Source == user.Id : o.Target == user.Id);
            var temp = entities.CallLog.Where(o => o.Start != null && o.Finish != null).Where(predicate).OrderByDescending(o => o.Start).Skip(skip).Take(take).ToList();

            temp.Select(o => o.Coins).Sum();

            return(Json(new
            {
                code = 200,
                desc = "查询成功",
                info = temp.Select(o => new
                {
                    UtcStart = o.Start.Value.ToUniversalTime().ToString("u"),
                    UtcFinish = o.Finish.Value.ToUniversalTime().ToString("u"),
                    Start = o.Start.Value.ToString("yyyy-MM-dd HH:mm:ss"),
                    Finish = o.Finish.Value.ToString("yyyy-MM-dd HH:mm:ss"),
                    (o.Finish - o.Start).Value.TotalSeconds,
                    Duration = (Int32)((o.Finish - o.Start).Value.TotalMinutes + 0.5),
                    Teacher = new
                    {
                        o.NimUser1.Id,
                        Nickname = o.NimUser1.NimUserEx.Name ?? "",
                        o.NimUser1.Username
                    },
                    Student = new
                    {
                        o.NimUser.Id,
                        Nickname = o.NimUser.NimUserEx.Name ?? "",
                        o.NimUser.Username
                    },
                    Themes = entities.LogTheme.Where(i => i.ChatId == o.ChatId).Select(i => new { i.Theme.Name }),
                    o.Score,
                    o.Coins
                })
            }));
        }
Exemplo n.º 15
0
        public ActionResult Select(Int32?userId)
        {
            //默认提供的是没有任何机构关联的价格表
            var temp = entities.Product.Where(o => o.Enabled == 1 && !o.Member.Any()).OrderBy(o => o.Sort).ToList();

            //20170210处理机构相关价格表问题
            //由于...默认每个用户只能属于一个机构或会员单位,所以如果用户设定了两个机构那么,该价格表就有可能查询不出来任何东西
            //如果用户没有输入userId,返回默认的价格表
            //如果用户所属的机构没有价格表,返回默认的价格表
            //如果用户所属的机构有多个,返回第一个机构的价格表
            if (userId.HasValue && userId.Value > 0)
            {
                NimUser user = entities.NimUser.Find(userId);
                if (user != null && user.Member_User.Any())
                {
                    Member member = user.Member_User.FirstOrDefault().Member;
                    if (member.Product.Any())
                    {
                        temp = member.Product.Where(o => o.Enabled == 1).OrderBy(o => o.Sort).ToList();
                    }
                }
            }
            return(Json(new { code = 200, desc = "查询成功", info = temp.Select(o => new { o.Coin, o.USD, o.CNY, o.Hour }) }));
        }
Exemplo n.º 16
0
        public ActionResult Finish(String callId, Int64?chatId, Int32?userId)
        {
            CallLog chat = null;

            if (!string.IsNullOrEmpty(callId))
            {
                chat = entities.CallLog.Find(callId);
            }

            if (chat == null)
            {
                chat = entities.CallLog.SingleOrDefault(o => o.ChatId == chatId);
            }

            if (chat == null)
            {
                return(Json(new { code = 2001, desc = "记录为空" }));
            }

            if (chat.Finish == null)
            {
                chat.Finish = DateTime.Now;
            }

            //扣费情况,一分钟一个币,如果大于等于30秒,算一分钟
            //TimeSpan s = new TimeSpan(0, 0, 0, 29,999);
            //(Int32)(s.TotalMinutes + 0.5)=0;
            //TimeSpan s = new TimeSpan(0, 0, 0, 29,1000);
            //(Int32)(s.TotalMinutes + 0.5)=1;
            var span     = chat.Finish - chat.Start;
            int duration = ((Int32)(span.Value.TotalMinutes + 0.5));//29秒不算,但是如果满30秒,当一分钟算,如:5:30,按6MIN算
            int coins    = duration * Constants.Price;

            //学生和老师
            NimUser student = entities.NimUser.Find(chat.Source);
            NimUser teacher = entities.NimUser.Find(chat.Target);

            ////学生扣除学币
            //if (chat.IsBalance != 1)
            //{
            //    student.NimUserEx.Coins -= coins;//从学生的帐号中去掉学币数
            //    chat.Coins = coins;//把这次的学币说写入聊天记录
            //    chat.IsBalance = 1;//平衡学币
            //    chat.Duration = duration;//这个chat的时长(单位分钟,满30秒算1分钟)
            //    chat.Price = Constants.Price;//每分钟单价
            //    chat.BalanceS = 1;//平衡学生学币
            //    chat.BalanceT = 0;//统计老师课时
            //}

            //记录该通话的结束时间和结束人员
            if (userId != null && chat.ChatId.HasValue)
            {
                ChatData data = new ChatData()
                {
                    Id = Guid.NewGuid().ToString().Replace("-", ""), ChatId = chat.ChatId.Value, UserId = userId.Value, Type = (Int32)ChatType.通话结束, Time = DateTime.Now
                };
                entities.ChatData.Add(data);
            }

            //只有通话记录没有平衡时,并且当前用户不是教师的时候才计算(包括学生和userId为空的用户)
            if (chat.BalanceS != 1 && chat.Target != userId)
            {
                logger.Debug(String.Format("通话结束:chatId={0},balance={1},coins={2} userId={3}", chat.ChatId, chat.BalanceS, chat.NimUser.NimUserEx.Coins, userId));
                Balance(chat);
                entities.SaveChanges();
            }

            //老师重新入队
            teacher.IsEnable = 1;
            teacher.IsOnline = 1;
            teacher.Enqueue  = DateTime.Now;
            teacher.Refresh  = DateTime.Now;

            //老师计算总课时,当月课时
            DateTime from  = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
            DateTime to    = from.AddMonths(1);
            var      c     = entities.CallLog.Where(o => o.Target == teacher.Id && o.Start != null && o.Finish != null).Where(o => from < o.Start && o.Start <= to).Where(o => o.Id != callId);
            Int32    month = from.Month;
            Int32    d     = (c.Sum(o => o.Duration) ?? 0) + duration;
            Int32    count = c.Count() + 1;

            try
            {
                entities.SaveChanges();
                return(Json(new
                {
                    code = 200,
                    desc = "记录成功",
                    info = new
                    {
                        chat.Id,
                        Student = new
                        {
                            student.Id,
                            student.Username,
                            Nickname = student.NimUserEx.Name,
                            student.NimUserEx.Coins
                        },
                        Teacher = new
                        {
                            teacher.Id,
                            teacher.Username,
                            Nickname = teacher.NimUserEx.Name,
                            Summary = new { month, count, duration = d }
                        }
                        ,
                        chat.Price
                        ,
                        chat.Duration


                        //,
                        //chat.Source,
                        //chat.Target,
                        //chat.Coins
                        //,
                        //span.Value.TotalSeconds,
                        //teacher.IsEnable,
                        //teacher.IsOnline,
                        //teacher.NimUserEx.Name
                    }
                }));
            }
            catch (Exception ex)
            {
                logger.Debug(ex.StackTrace);
                return(Json(new { code = 201, desc = ex.StackTrace }));
            }
        }
Exemplo n.º 17
0
 public static void Create(NimUser nimuser)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 18
0
        public ActionResult VerifyPayPal(String orderId, String paymentId)
        {
            Orders order = entities.Orders.Find(orderId);

            if (order == null)
            {
                return(Json(new { code = 201, desc = "指定订单不存在" }));
            }

            NimUser user = entities.NimUser.SingleOrDefault(o => o.Username == order.UserName);



            //OAuthTokenCredential tokenCredential = new OAuthTokenCredential("<CLIENT_ID>", "<CLIENT_SECRET>");
            //string accessToken = tokenCredential.GetAccessToken();

            // ### Api Context
            // Pass in a `APIContext` object to authenticate
            // the call and to send a unique request id
            // (that ensures idempotency). The SDK generates
            // a request id if you do not pass one explicitly.
            // See [Configuration.cs] to know more about APIContext.
            var     apiContext = Configuration.GetAPIContext();
            Payment payment    = Payment.Get(apiContext, paymentId);

            //You should verify that the Payment:
            //Is approved ("state": "approved").
            //Contains a Transaction with:
            //An Amount with total and currency values that match your expectation.
            //A Sale that is completed (in related_resources, with "state": "completed").

            if (payment.state != "approved")
            {
                return(Json(new { code = 201, desc = "交易记录验证不成功" }));
            }

            //由手机端传过来的信息,如支付总额,货币
            String clientAmount   = order.Amount + "";
            String clientCurrency = order.Currency + "";


            Transaction d = payment.transactions[0];

            String serverAmount    = d.amount.total;
            String serverCurrentcy = d.amount.currency;
            String saleState       = d.related_resources[0].sale.state;

            //插入数据库

            //验证交易总额
            if (clientAmount != serverAmount)
            {
                return(Json(new { code = 201, desc = "交易总额验证不成功" }));
            }

            //验证货币类型
            if (clientCurrency != serverCurrentcy)
            {
                return(Json(new { code = 201, desc = "货币类型验证不成功" }));
            }

            //验证交易状态
            if (saleState != "completed")
            {
                return(Json(new { code = 201, desc = "交易状态验证不成功" }));
            }

            //保存数据
            order.TradeNo     = paymentId;
            order.TradeStatus = "completed";

            //平衡学币
            user.NimUserEx.Coins = order.Coin + (user.NimUserEx.Coins ?? 0);
            order.IsBalance      = 1;
            entities.SaveChanges();

            return(Json(new { code = 200, desc = "支付成功", info = new { user.Username, user.NimUserEx.Name, user.NimUserEx.Coins } }));
        }
Exemplo n.º 19
0
        public ActionResult VerifyAliPay(String orderId, String result)
        {
            Orders order = entities.Orders.Find(orderId);

            if (order == null)
            {
                return(Json(new { code = 201, desc = "指定订单不存在" }));
            }

            NimUser user = entities.NimUser.Single(o => o.Username == order.UserName);

            //如果异步通知成功,直接返回
            if (order.TradeStatus == "TRADE_SUCCESS" || order.TradeStatus == "TRADE_FINISHED")
            {
                //平衡学币
                user.NimUserEx.Coins = order.Coin + (user.NimUserEx.Coins ?? 0);
                order.IsBalance      = 1;
                entities.SaveChanges();

                return(Json(new { code = 200, desc = "支付成功", info = new { user.Username, Nickname = user.NimUserEx.Name, user.NimUserEx.Coins } }));
            }

            //如果服务端没有收到异步通知的时候,则要验证客户端发过来的同步通知(https://doc.open.alipay.com/doc2/detail.htm?spm=0.0.0.0.bsvyrx&treeId=59&articleId=103665&docType=1)
            //1、原始数据是否跟商户请求支付的原始数据一致(必须验证这个);
            //2、验证这个签名是否能通过。上述1、2通过后,在sign字段中success = true才是可信的。

            //构建原始数据,并验证是否一致,比如如果订单号不存在,那么就会验证不成功
            String orderString = OrderUtil.getOrderInfo(order);

            if (!result.Contains(orderString))
            {
                return(Json(new { code = 201, desc = "数据验证不通过" }));
            }

            //验证数据的签名,以[&sign_type="RSA"&sign=]为界,前面的为(原始数据&支付结果),后面的为带双引号的签名结果,在验证签名时,记录把开头和结尾的引号trim掉
            String[] a      = result.Split(new String[] { "&sign_type=\"RSA\"&sign=" }, StringSplitOptions.None);
            bool     isPass = RSAFromPkcs8.verify(a[0], a[1].Trim(new char[] { '"' }), Config.Public_key, Config.Input_charset);

            if (!isPass)
            {
                return(Json(new { code = 201, desc = "数据签名不相符" }));
            }

            //验证是否包含""这样的支付结果
            if (!a[0].Contains("&success=\"true\""))
            {
                return(Json(new { code = 201, desc = "支付失败" }));
            }

            order.TradeNo     = "";
            order.TradeStatus = "COMPLETED";//只说明是同步验证成功,应该尽量依靠服务器异步验证

            if (order.IsBalance != 1)
            {
                user.NimUserEx.Coins = order.Coin + (user.NimUserEx.Coins ?? 0);
                order.IsBalance      = 1;
            }

            entities.SaveChanges();
            return(Json(new { code = 200, desc = "支付成功", info = new { user.Username, Nickname = user.NimUserEx.Name, user.NimUserEx.Coins } }));
        }