public ActionResult GetPhoneNumberFromWeChat(string userID, string iv, string encryptedData) { var user = db.Users.FirstOrDefault(s => s.Id == userID); if (user == null) { return(Json(Comm.ToJsonResult("UserNoFound", "用户不存在"))); } if (db.CardPersonals.Any(s => s.UserID == userID)) { return(Json(Comm.ToJsonResult("CardPersonalHadCreate", "该用户已经个人名片已存在"), JsonRequestBehavior.AllowGet)); } //把数据中的OpenID取出 var userOpenIDs = new Bll.Users.UserOpenID(user); IConfig config = new ConfigMiniPersonal(); var openID = userOpenIDs.SearchOpenID(config.AppID); if (openID == null) { return(Json(Comm.ToJsonResult("OpenIDIsNull", "OpenID不存在"), JsonRequestBehavior.AllowGet)); } string session = null; try { session = Jscode2sessionResultList.GetSession(openID); } catch (Exception ex) { return(Json(Comm.ToJsonResult("GetSessionFail", ex.Message), JsonRequestBehavior.AllowGet)); } string mobile = null; try { mobile = Jscode2sessionResultList.AESDecryptPhoneNumber(encryptedData, session, iv); } catch (Exception) { Comm.WriteLog("CreateByWeChatPhoneDecrypt", JsonConvert.SerializeObject(new { encryptedData, session, iv }), Common.Enums.DebugLogLevel.Error); return(Json(Comm.ToJsonResult("DecryptFail", "解密失败,SessionKey过期,需要重新调用登录接口"))); } return(Json(Comm.ToJsonResult("Success", "成功", mobile), JsonRequestBehavior.AllowGet)); }
/// <summary> /// 注册VIP /// </summary> /// <param name="userID">用户ID</param> /// <param name="iv">手机号</param> /// <param name="code"></param> /// <returns></returns> public ActionResult CreateByWeChatPhone(string userID, string iv, string encryptedData, string code) { var user = db.Users.FirstOrDefault(s => s.Id == userID); if (user == null) { return(Json(Comm.ToJsonResult("UserNoFound", "用户不存在"))); } if (db.CardPersonals.Any(s => s.UserID == userID)) { return(Json(Comm.ToJsonResult("CardPersonalHadCreate", "该用户已经个人名片已存在"))); } //把数据中的OpenID取出 var userOpenIDs = new Bll.Users.UserOpenID(user); IConfig config = new ConfigMiniPersonal(); var openID = userOpenIDs.SearchOpenID(config.AppID); if (openID == null) { return(Json(Comm.ToJsonResult("OpenIDIsNull", "OpenID不存在"))); } string session = null; try { session = Jscode2sessionResultList.GetSession(openID); } catch (Exception ex) { return(Json(Comm.ToJsonResult("GetSessionFail", ex.Message))); } string mobile = null; try { mobile = Jscode2sessionResultList.AESDecryptPhoneNumber(encryptedData, session, iv); } catch (Exception) { return(Json(Comm.ToJsonResult("DecryptFail", "解密失败,SessionKey过期,需要重新调用登录接口"))); } if (db.Users.Any(s => s.PhoneNumber == mobile)) { return(Json(Comm.ToJsonResult("MobileHadUsed", "手机号已被使用"))); } //if (!Reg.IsMobile(mobile)) //{ // return Json(Comm.ToJsonResult("Moblie Error", "手机号不正确")); //} Vip parentVip = null; if (!string.IsNullOrWhiteSpace(code)) { //判断是否邀请码是否存在 parentVip = db.Vips.FirstOrDefault(s => s.State == Common.Enums.VipState.Enable && s.Code == code); if (parentVip == null) { return(Json(Comm.ToJsonResult("CodeNoFound", "邀请码不存在"))); } } //保存用户手机号到用户表 user.PhoneNumber = mobile; //把名片已知信息填到个人名片 var card = new CardPersonal { UserID = userID, Avatar = user.Avatar, Enable = true, Gender = Common.Enums.Gender.NoSet, Name = user.NickName, Mobile = mobile }; db.CardPersonals.Add(card); db.SaveChanges(); try { card.WeChatMiniQrCode = GetWeChatQrCode(card.ID); db.SaveChanges(); } catch (Exception ex) { Comm.WriteLog(this.GetType().ToString(), ex.Message, Common.Enums.DebugLogLevel.Error); } var result = new Bll.VipBLL().CreateVipRelation(userID, code); if (result.retCode == Comm.ReqResultCode.failed) { //回滚 db.CardPersonals.Remove(card); db.SaveChanges(); return(Json(Comm.ToJsonResult("Error", result.retMsg))); } return(Json(Comm.ToJsonResult("Success", "成功", new { PCardID = card.ID }))); }
/// <summary> /// 创建升级支付订单 /// </summary> /// <param name="code"></param> /// <param name="userID"></param> /// <returns></returns> public object CreateUpGradeOrder(string code, string userID) { //1.调用小程序登录API,获取openID IConfig config = new ConfigMiniPersonal(); WeChatMinApi miniApi = new WeChatMinApi(config); Jscode2sessionResult openIDResule = miniApi.Jscode2session(code); if (openIDResule == null || string.IsNullOrWhiteSpace(openIDResule.OpenID)) { return(new { retCode = "Error", retMsg = "无法获取openID,请确认code是否正确", objectData = "" }); } //using (ApplicationDbContext db = new ApplicationDbContext()) //{ // //防止用户重复提交订单,把Vip状态设为升级中 // var vip = db.Vips.FirstOrDefault(s => s.UserID == userID); // vip.State = Common.Enums.VipState.Uploading; // db.SaveChanges(); //} string OrderCode = CreateOrderCode(userID); //创建订单号 decimal Amount = Comm.UpGradeAmount(); //升级费用 if (string.IsNullOrEmpty(OrderCode)) { return(new { retCode = "Error", retMsg = "订单号生成失败", objectData = "" }); } //2.调用支付统一下单API #region 调用支付统一下单API UnifiedPayData payData = new UnifiedPayData() { attach = string.Empty, body = "个人升级成为VIP,提交支付费用", goods_tag = string.Empty, openid = openIDResule.OpenID, out_trade_no = OrderCode, total_fee = (int)Amount * 100, //total_fee = 1,//测试10分订单 trade_type = "JSAPI" }; RequestResult payResult = payment.GetUnifiedOrderResult(payData); WxPayData payreturnData = payResult.objectData; if (payResult.retCode != ReqResultCode.success || payreturnData == null) { return(new { retCode = "Error", retMsg = "请求微信支付统一下单失败", objectData = "" }); } #endregion //3.生成商户订单 #region 生成商户订单 int rows = 0; using (ApplicationDbContext db = new ApplicationDbContext()) { //2.生成商户订单 Order order = new Order() { Amount = 0, Code = OrderCode, ReceivableAmount = Amount, State = Common.Enums.OrderState.UnHandle, Channel = Common.Enums.PayChannel.WxPay, Type = Common.Enums.OrderType.Receivable, UserID = userID, CreateDateTime = DateTime.Now, PayCode = string.Empty, PayInput = JsonConvert.SerializeObject(payData) }; db.Orders.Add(order); rows = db.SaveChanges(); } if (rows <= 0) { return(new { retCode = "Error", retMsg = "保存订单数据失败", objectData = "" }); } #endregion //4.返回支付参数:5个参数,生成签名再返回 System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区 long ts = (long)(DateTime.Now - startTime).TotalSeconds; // 相差秒数 System.Text.StringBuilder paySignpar = new System.Text.StringBuilder(); paySignpar.Append($"appId={payreturnData.GetValue("appid")?.ToString()}"); paySignpar.Append($"&nonceStr={payreturnData.GetValue("nonce_str")?.ToString()}"); paySignpar.Append($"&package=prepay_id={payreturnData.GetValue("prepay_id")?.ToString()}"); paySignpar.Append($"&signType=MD5"); paySignpar.Append($"&timeStamp={ts.ToString()}"); paySignpar.Append($"&key={ConfigurationManager.AppSettings["wxPayKey"] ?? string.Empty}"); string strPaySignpar = paySignpar.ToString(); var sign = GetMd5Hash(strPaySignpar).ToUpper(); dynamic retModel = new { timeStamp = ts.ToString(), nonceStr = payreturnData.GetValue("nonce_str")?.ToString(), package = "prepay_id=" + payreturnData.GetValue("prepay_id")?.ToString(), signType = "MD5", paySign = sign, total_fee = payData.total_fee / 100m, }; return(new { retCode = "Success", retMsg = "成功", objectData = retModel }); }
private ApplicationUser CreateByWeChat(Common.WeChat.UserInfoResult model) { string username, nickname, avart, unionId = model.UnionID; var user = db.Users.FirstOrDefault(s => s.WeChatID == unionId); IConfig config = null; switch (model.Type) { case WeChatAccount.AiCardMini: config = new ConfigMini(); break; case WeChatAccount.AiCardPersonalMini: config = new ConfigMiniPersonal(); break; default: case WeChatAccount.PC: config = new ConfigWeChatWork(); break; } if (user != null) { string appID = config.AppID; var op1 = new Bll.Users.UserOpenID(user); op1.AddOpenID(appID, model.OpenID); db.SaveChanges(); return(user); } nickname = model.NickName; avart = model.HeadImgUrl; if (!string.IsNullOrWhiteSpace(avart)) { try { avart = this.Download(avart); } catch (Exception) { avart = "~/Content/Images/404/avatar.png"; } } unionId = model.UnionID; #region 把图片传到七牛 var path = Server.MapPath(avart); avart = new Common.Qiniu.QinQiuApi().UploadFile(path, true); #endregion do { username = $"wc{DateTime.Now:yyyyMMddHHmmss}{Comm.Random.Next(1000, 9999)}"; } while (db.Users.Any(s => s.UserName == username)); if (string.IsNullOrWhiteSpace(nickname)) { nickname = username; } user = new ApplicationUser { WeChatID = unionId, UserName = username, NickName = nickname, Avatar = avart, RegisterDateTime = DateTime.Now, LastLoginDateTime = DateTime.Now, UserType = UserType.Personal }; var option = new Bll.Users.UserOpenID(user); option.AddOpenID(config.AppID, model.OpenID); var r = UserManager.Create(user); user = db.Users.FirstOrDefault(s => s.WeChatID == unionId); db.SaveChanges(); if (!r.Succeeded) { throw new Exception(r.Errors.FirstOrDefault()); } return(user); }