using System; using System.Collections.Generic; using System.Data; using System.Web; using System.Web.Http; using System.Web.Http.Description; using SuperMap.RealEstate.Utility; using MSPB = SuperMap.RealEstate.MobileServicePlatform.Business; using ESCom = EShang.Common; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using HZQR.Common; using RedisHelp; namespace YFBusinessApi.Controllers { /// /// 驿付商家相关接口 /// public class BusinessController : BaseController { #region 方法 -> 小程序授权绑定三步骤 #region 第一步 -> 小程序登录 /// /// 小程序登录 /// /// 小程序APPId /// 小程序登录态 /// 小程序前端使用wx.login() 从微信服务器获取code /// [HttpGet] [Route("Business/WeChatLogin")] public IHttpActionResult WeChatLogin(string wechatAppAppId, string wechatMiniproToken = "", string wechatCode = "") { try { #region 判断参数是否正确 if ((string.IsNullOrEmpty(wechatMiniproToken) || wechatMiniproToken.ToLower() == "undefined") && (string.IsNullOrEmpty(wechatCode) || wechatCode.ToLower() == "undefined")) { transaction.Rollback(); return Ok(Helper.Common.ReturnJson(101, "小程序未授权")); } #endregion string wechatAppOpenid = ""; ESCom.Model.WeChatAppSign weChatAppSignModel = ESCom.Base.GetWechatAppSignInfo(transaction, wechatAppAppId); ESCom.Model.MinProUserInfo minProUserInfo = null; if (!string.IsNullOrEmpty(wechatCode) && wechatCode.ToLower() != "undefined") { #region 向微信服务器换取用户openId 和session_key JObject wxObject = new JObject(); wxObject = ESCom.WeChatHelper.WeChatLogin(wechatAppAppId, weChatAppSignModel.wechatAppAppSecret, wechatCode); //获取用户openId 和session_key出错 if (wxObject["ResultCode"].TryParseToInt() != 100) { transaction.Rollback(); return Ok(Helper.Common.ReturnJson(wxObject["ResultCode"].TryParseToInt(), wxObject["ResultDesc"].ToString())); } wechatAppOpenid = wxObject["ResultData"]["openid"].TryParseToString(); minProUserInfo = ESCom.Member.GetRtWechatAppByOpenId(transaction, weChatAppSignModel.weChatAppSignId, wechatAppOpenid); //session_key是微信服务区生成的针对用户数据加密前面的秘钥,不应该传输到客户端 string session_key = wxObject["ResultData"]["session_key"].TryParseToString(); //MiniProSessionKey用于存储登录状态校验:session_key + openid wechatMiniproToken = ESCom.MiniProgram.CreateMiniProToken(session_key, wechatAppOpenid); #endregion } else if (!string.IsNullOrEmpty(wechatMiniproToken) && wechatMiniproToken.ToLower() != "undefined") { #region 从登录态中获取用户openId 和session_key JObject tokenObj = (JObject)JsonConvert.DeserializeObject(wechatMiniproToken.ToDecrypt()); wechatAppOpenid = tokenObj["openid"].TryParseToString(); //根据openId 先取缓存中的小程序用户信息 minProUserInfo = ESCom.Member.GetRtWechatAppByOpenId(transaction, weChatAppSignModel.weChatAppSignId, wechatAppOpenid); if (minProUserInfo == null || minProUserInfo.WeChat_MemberId == 0) { //查不到用户信息,或者没有WeChat_MemberId,后面需要授权手机号,则需要判断session是否过期 var isValid = ESCom.MiniProgram.CheckSession(Convert.ToDateTime(tokenObj["datetime"])); if (!isValid) { transaction.Rollback(); return Ok(Helper.Common.ReturnJson(200, "session已过期")); } } #endregion } ESCom.Model.MemberLogin memberLogin = new ESCom.Model.MemberLogin(); memberLogin.MembershipId = minProUserInfo.WeChat_MemberId; memberLogin.MembershipName = minProUserInfo.WeChat_MemberName; memberLogin.MembershipPhone = minProUserInfo.WeChat_Phone; memberLogin.WeChatUserId = minProUserInfo.WeChat_UserId; memberLogin.WeChatUserName = minProUserInfo.WeChat_UserName; memberLogin.WeChatUserHeadimage = minProUserInfo.WeChat_UserHeadimage; memberLogin.WeChatMiniProToken = wechatMiniproToken; return Ok(Models.JsonMsg.Success(memberLogin, 100, "请求成功")); } catch (Exception ex) { ErrorLogHelper.Write(ex, "接口【WeChatLogin】", "Business/WeChatLogin"); transaction.Rollback(); return Ok(Helper.Common.ReturnJson(999, "查询失败" + ex.Message)); } } #endregion #region 第二步 -> 小程序授权 /// /// 小程序授权 /// /// 小程序APPId /// 小程序登录态 /// 小程序端 wx.getUserInfo向微信服务区请求拿到encryptedData ,编码后传入 /// 小程序端 wx.getUserInfo向微信服务区请求拿到iv ,编码后传入 /// [HttpGet] [Route("Business/WeChatLicensed")] public IHttpActionResult WeChatLicensed(string wechatAppAppId, string wechatMiniproToken, string encryptedData, string iv) { try { #region 请求参数 string _encryptedData = HttpUtility.UrlDecode(encryptedData); string _iv = HttpUtility.UrlDecode(iv); if (string.IsNullOrEmpty(wechatMiniproToken) || wechatMiniproToken.ToLower() == "undefined") { return Ok(Helper.Common.ReturnJson(101, "小程序未授权")); } if (string.IsNullOrEmpty(encryptedData) || encryptedData.ToLower() == "undefined" || string.IsNullOrEmpty(iv) || iv.ToLower() == "undefined") { return Ok(Helper.Common.ReturnJson(999, "encryptedData或者iv参数有误")); } #endregion //判断令牌是否有效 JObject tokenObj = (JObject)JsonConvert.DeserializeObject(wechatMiniproToken.ToDecrypt()); string wechatAppOpenid = tokenObj["openid"].TryParseToString(); string session_key = tokenObj["session_key"].TryParseToString(); //微信小程序解密用户信息 MSPB.CommonHelper.WechatUserInfo userInfo = null; try { userInfo = MSPB.CommonHelper.WeChatAppDecrypt.Decrypt(_encryptedData, _iv, session_key); } catch (Exception ex) { return Ok(Helper.Common.ReturnJson(999, "encryptedData或者iv参数有误")); } //先判断小程序用户是否已存在 ESCom.Model.WeChatAppSign weChatAppSignModel = ESCom.Base.GetWechatAppSignInfo(transaction, wechatAppAppId); ESCom.Model.MinProUserInfo minProUser = ESCom.Member.GetRtWechatAppByOpenId(transaction, weChatAppSignModel.weChatAppSignId, wechatAppOpenid); #region 插入小程序用户信息 MSPB.RTWECHATAPP _RTWECHATAPP = new MSPB.RTWECHATAPP(transaction); if (minProUser == null) { _RTWECHATAPP.ResetProperty(); _RTWECHATAPP.WECHATAPPSIGN_ID = weChatAppSignModel.weChatAppSignId; _RTWECHATAPP.WECHATPUBLICSIGN_ID = weChatAppSignModel.weChatPublicSignId; _RTWECHATAPP.WECHATAPP_OPENID = userInfo.openId; _RTWECHATAPP.NICK_NAME = userInfo.nickName; _RTWECHATAPP.USER_GENDER = short.Parse(userInfo.gender); _RTWECHATAPP.USER_CITY = userInfo.city; _RTWECHATAPP.USER_PROVINCE = userInfo.province; _RTWECHATAPP.USER_COUNTRY = userInfo.country; _RTWECHATAPP.USER_AVATARURL = userInfo.avatarUrl; _RTWECHATAPP.USER_UNIONID = userInfo.unionId; _RTWECHATAPP.RTWECHATAPP_STATE = 1; _RTWECHATAPP.ADDTIME = DateTime.Now; _RTWECHATAPP.Insert(); } else { _RTWECHATAPP.RTWECHATAPP_ID = minProUser.WeChat_UserId; _RTWECHATAPP.NICK_NAME = userInfo.nickName; _RTWECHATAPP.USER_GENDER = short.Parse(userInfo.gender); _RTWECHATAPP.USER_CITY = userInfo.city; _RTWECHATAPP.USER_PROVINCE = userInfo.province; _RTWECHATAPP.USER_COUNTRY = userInfo.country; _RTWECHATAPP.USER_AVATARURL = userInfo.avatarUrl; _RTWECHATAPP.USER_UNIONID = userInfo.unionId; _RTWECHATAPP.OPERATE_DATE = DateTime.Now; _RTWECHATAPP.Update(); } //更新redis缓存 string key = weChatAppSignModel.weChatAppSignId + ":" + wechatAppOpenid;//按小程序ID来存储更方便查看 minProUser.WeChat_UseOpenId = wechatAppOpenid;//存下openId,获取用户详情信息时更新用户信息时用到 minProUser.WeChat_UserId = _RTWECHATAPP.RTWECHATAPP_ID.Value; minProUser.WeChat_UserName = _RTWECHATAPP.NICK_NAME; minProUser.WeChat_UserHeadimage = _RTWECHATAPP.USER_AVATARURL; minProUser.WeChat_UserSex = _RTWECHATAPP.USER_GENDER.TryParseToInt(); int? validDay = 7;//存储7天后过期 ESCom.Redis.StringSet(0, key, minProUser, validDay);//序列化以后存入库中 #endregion #region 返回参数 ESCom.Model.MemberLogin memberLogin = new ESCom.Model.MemberLogin(); memberLogin.MembershipId = minProUser.WeChat_MemberId; memberLogin.MembershipName = minProUser.WeChat_MemberName; memberLogin.MembershipPhone = minProUser.WeChat_Phone; memberLogin.WeChatUserId = minProUser.WeChat_UserId; memberLogin.WeChatUserName = minProUser.WeChat_UserName; memberLogin.WeChatUserHeadimage = minProUser.WeChat_UserHeadimage; return Ok(Models.JsonMsg.Success(memberLogin, 100, "请求成功")); #endregion } catch (Exception ex) { ErrorLogHelper.Write(ex, "接口【WeChatLicensed】", "Business/WeChatLicensed"); transaction.Rollback(); return Ok(Helper.Common.ReturnJson(999, "查询失败" + ex.Message)); } } #endregion #region 第三步 -> 小程序绑定会员手机号 /// /// 小程序绑定会员手机号 /// /// 小程序APPId /// 小程序用户Id /// 小程序登录态 /// 小程序端getPhoneNumber 向微信服务区请求拿到encryptedData,编码后传入 /// 小程序端getPhoneNumber 向微信服务区请求拿到iv,编码后传入 /// /// [HttpGet] [Route("Business/WeChatBindPhone")] public IHttpActionResult WeChatBindPhone(string wechatAppAppId, string wechatMiniproToken, string encryptedData, string iv, int? wechatUserId = null, int? ownerUnitId = null) { try { #region 请求参数 if (string.IsNullOrEmpty(wechatMiniproToken) || wechatMiniproToken.ToLower() == "undefined") { return Ok(Helper.Common.ReturnJson(101, "小程序未授权")); } if (string.IsNullOrEmpty(encryptedData) || encryptedData.ToLower() == "undefined" || string.IsNullOrEmpty(iv) || iv.ToLower() == "undefined") { return Ok(Helper.Common.ReturnJson(200, "用户拒绝授权")); } string _encryptedData = HttpUtility.UrlDecode(encryptedData); string _iv = HttpUtility.UrlDecode(iv); #endregion #region 解密令牌 string session_key = "", wechatAppOpenid = ""; DateTime? tokenAddTime = null; try { JObject tokenObj = (JObject)JsonConvert.DeserializeObject(wechatMiniproToken.ToDecrypt()); session_key = tokenObj["session_key"].TryParseToString(); wechatAppOpenid = tokenObj["openid"].TryParseToString(); tokenAddTime = tokenObj["datetime"].TryParseToDateTime(); var isValid = ESCom.MiniProgram.CheckSession(Convert.ToDateTime(tokenAddTime)); if (!isValid) { return Ok(Helper.Common.ReturnJson(200, "session已过期")); } } catch (Exception ex) { SuperMap.RealEstate.Utility.ErrorLogHelper.Write(ex, "接口WeChat_BusinessPhone", "解密令牌有误" + wechatMiniproToken); return Ok(Helper.Common.ReturnJson(999, "参数wechatMiniproToken有误," + ex.ToString())); } #endregion string mobilePhone = "", memberName = ""; #region 解密手机号码 try { string jsonStr = ESCom.WeChatHelper.Decrypt(_encryptedData, _iv, session_key); JObject phoneObj = JObject.Parse(jsonStr); mobilePhone = phoneObj["phoneNumber"].TryParseToString(); } catch (Exception ex) { SuperMap.RealEstate.Utility.ErrorLogHelper.Write(ex, "接口WeChat_BusinessPhone", "解密手机号码有误" + wechatMiniproToken); return Ok(Helper.Common.ReturnJson(999, "解密手机号码有误," + ex.ToString())); } #endregion #region 取出redis中的小程序用户信息 ESCom.Model.WeChatAppSign weChatAppSignModel = ESCom.Base.GetWechatAppSignInfo(transaction, wechatAppAppId); if (ownerUnitId == null && weChatAppSignModel != null) { ownerUnitId = weChatAppSignModel.ownerUnitId;//未传业主单位Id则为小程序所属业主单位 } ESCom.Model.MinProUserInfo minProUser = ESCom.Member.GetRtWechatAppByOpenId(transaction, weChatAppSignModel.weChatAppSignId, wechatAppOpenid); if (minProUser == null) { minProUser = new ESCom.Model.MinProUserInfo(); minProUser.WeChat_UserId = wechatUserId.TryParseToInt(); } else { memberName = minProUser.WeChat_UserName; } #endregion MSPB.BUSINESSMAN _BUSINESSMAN = new MSPB.BUSINESSMAN(transaction); ESCom.Model.MinProUserInfo memberModel = ESCom.BusinessMan.GetBusinessManByMobile( transaction, ownerUnitId.TryParseToInt(), mobilePhone); if (memberModel == null) { #region 注册新会员 ESCom.Model.OwnerUnit ownerUnit = ESCom.Base.GetOwnerUnitInfo(transaction, ownerUnitId.TryParseToInt()); string staffName = "小程序注册"; _BUSINESSMAN = ESCom.BusinessMan.AddMemberShip(transaction, mobilePhone, memberName, wechatUserId, staffName); #endregion } else { #region 更新原来的用户信息 _BUSINESSMAN.BUSINESSMAN_ID = memberModel.WeChat_MemberId; _BUSINESSMAN.RTWECHATAPP_ID = minProUser.WeChat_UserId; _BUSINESSMAN.OPERATE_DATE = DateTime.Now; _BUSINESSMAN.Update(); #endregion } #region 更新redis 小程序用户,存储7天 try { string key = weChatAppSignModel.weChatAppSignId + ":" + wechatAppOpenid;//按小程序ID来存储更方便查看 minProUser.WeChat_UseOpenId = wechatAppOpenid;//存下openId,获取用户详情信息时更新用户信息时用到 minProUser.WeChat_Phone = mobilePhone; minProUser.WeChat_MemberId = _BUSINESSMAN.BUSINESSMAN_ID.Value; minProUser.WeChat_MemberName = memberName; int? validDay = 7;//存储7天后过期 ESCom.Redis.StringSet(0, key, minProUser, validDay);//序列化以后存入库中 } catch (Exception ex) { SuperMap.RealEstate.Utility.ErrorLogHelper.Write(ex, "接口【WeChatBindPhone】", "注册写入redis db1:" + wechatAppOpenid); } #endregion #region 更新小程序人员表的会员ID/手机号码 MSPB.RTWECHATAPP _RTWECHATAPP = new MSPB.RTWECHATAPP(transaction); _RTWECHATAPP.RTWECHATAPP_ID = minProUser.WeChat_UserId; _RTWECHATAPP.MEMBERSHIP_ID = _BUSINESSMAN.BUSINESSMAN_ID; _RTWECHATAPP.PHONE_NUMBER = mobilePhone; _RTWECHATAPP.OPERATE_DATE = DateTime.Now; _RTWECHATAPP.Update(); #endregion #region 返回参数 ESCom.Model.MemberLogin memberLogin = new ESCom.Model.MemberLogin(); memberLogin.MembershipId = minProUser.WeChat_MemberId; memberLogin.MembershipName = minProUser.WeChat_MemberName; memberLogin.MembershipPhone = minProUser.WeChat_Phone; memberLogin.WeChatUserId = minProUser.WeChat_UserId; memberLogin.WeChatUserName = minProUser.WeChat_UserName; memberLogin.WeChatUserHeadimage = minProUser.WeChat_UserHeadimage; memberLogin.WeChatMiniProToken = wechatMiniproToken; return Ok(Models.JsonMsg.Success(memberLogin, 100, "请求成功")); #endregion } catch (Exception ex) { ErrorLogHelper.Write(ex, "接口【WeChatBindPhone】", "Business/WeChatBindPhone"); transaction.Rollback(); return Ok(Helper.Common.ReturnJson(999, "查询失败" + ex.Message)); } } #endregion #endregion #region 方法 -> 获取商家详情信息 /// /// 微信端接口:获取商家详情信息 /// /// 会员ID /// 微信小程序AppId /// [Route("Business/GetMemberBusinessInfo")] [AcceptVerbs("GET", "POST")] public IHttpActionResult GetMemberBusinessInfo(int memberShipId, string WeChat_AppId) { try { JObject Data = new JObject(); #region 获取会员信息 RedisHelper redisMember = new RedisHelper(3);//从redis中取 ESCom.Model.RedisMember redisUser = new ESCom.Model.RedisMember(); if (redisMember.KeyExists(memberShipId.ToString())) { //获取会员信息 redisUser = redisMember.StringGet(memberShipId.ToString()); } else { //若缓存中不存在对应商家信息,则读取会员信息存储于缓存中 MSPB.BUSINESSMAN _BUSINESSMAN = ESCom.BusinessMan.GetBusinessManModelById(transaction, memberShipId); if (_BUSINESSMAN.PropertyObject != null && _BUSINESSMAN.BUSINESSMAN_ID != null) { redisUser.WeChat_MemberId = _BUSINESSMAN.BUSINESSMAN_ID.Value; //会员内码 redisUser.WeChat_MemberName = _BUSINESSMAN.BUSINESSMAN_NAME; //会员名称 redisUser.WeChat_Phone = _BUSINESSMAN.BUSINESSMAN_MOBILEPHONE; //手机号码 redisUser.WeChat_MemberType = _BUSINESSMAN.BUSINESSMAN_TYPE.Value; //会员类型 redisUser.UserId = _BUSINESSMAN.USER_ID; //平台账号内码 redisUser.UserOwnerUnitId = _BUSINESSMAN.OWNERUNIT_ID.Value; //业主单位内码 redisUser.UserOwnerUnitName = _BUSINESSMAN.OWNERUNIT_NAME; //业主单位名称 } } #endregion #region 业主单位、授权的门店权限,并记录Redis缓存信息 if (redisUser.UserId != null) { //获取门店权限集合 JObject shopInfo = QRWL.Common.JsonHelper.DataTableToJObject( ESCom.BusinessMan.GetShopPermission(transaction, redisUser.UserId.Value)); Data["ServerpartList"] = shopInfo["List"]; } #endregion //获取用户权限模块 Data["AuthorityInfo"] = ESCom.Member.GetObjMemberModule(transaction, redisUser.WeChat_MemberId, WeChat_AppId); #region 商家详情信息 //写入redis,后面的逻辑判断都从redis的db4中取 ESCom.Redis.StringSet(3, memberShipId.ToString(), redisUser, 14); //返回给前端的内容 Data["Membership_Id"] = redisUser.WeChat_MemberId; //会员内码 Data["Membership_Name"] = redisUser.WeChat_MemberName; //会员名称 Data["Membership_Phone"] = redisUser.WeChat_Phone; //手机号码 Data["Membership_Headimage"] = redisUser.WeChat_Headimage; //头像地址 Data["Membership_Type"] = redisUser.WeChat_MemberType; //会员类型 Data["OwnerUnitName"] = redisUser.UserOwnerUnitName; //业主单位名称 #endregion return Ok(Helper.Common.ReturnJson(100, "查询成功!", Data)); } catch (Exception ex) { ErrorLogHelper.Write(ex, "接口【GetMemberBusinessInfo】", "Business/GetMemberBusinessInfo"); transaction.Rollback(); return Ok(Helper.Common.ReturnJson(999, "查询失败" + ex.Message)); } } #endregion #region 方法 -> 首页 - 获取待处理任务 /// /// 首页 - 获取待处理任务 /// /// 会员ID /// [Route("Business/GetPendingInfo")] [AcceptVerbs("GET", "POST")] [ResponseType(typeof(Models.JsonMsg))] public IHttpActionResult GetPendingInfo(string memberShipId) { try { Models.PendingModel pendingModel = Helper.PowerHelper.GetPendingInfo(transaction, memberShipId); return Ok(Models.JsonMsg.Success(pendingModel, 100, "查询成功")); } catch (Exception ex) { ErrorLogHelper.Write(ex, "接口【Business/GetPendingInfo】", ""); transaction.Rollback(); return Ok(Helper.Common.ReturnJson(999, "查询失败" + ex.Message)); } } #endregion } }