|
|
namespace CounsellorBL.GROUP { using CounsellorBL.BLStructure; using CounsellorBL.Common; using CounsellorBL.Helper; using MonumentDefine; using Newtonsoft.Json; using OT.COM.ArsenalDB; using OT.COM.SignalerMessage; using SoldierData.EnterprizeV4; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using static CounsellorBL.GROUP.Helper.FbHelper;
public class GroupUserConnectService : SingleDataTableTemplate<tb_grp_group> { #region 私有類
private class Group2UserViewModel { public string app_id { get; set; } public string client_secret { get; set; } public string user_token { get; set; } public string fb_account { get; set; } }
private class FbTokenVerification { public VerificationContent data { get; set; } }
private class VerificationContent { public string app_id { get; set; } public string type { get; set; } public int data_access_expires_at { get; set; } public error error { get; set; } public int expires_at { get; set; } public bool is_valid { get; set; } public string user_id { get; set; } }
private class error { public int code { get; set; } public string message { get; set; } public int subcode { get; set; } }
private class ErrorMsg { public string message { get; set; } public string fb_account { get; set; } } #endregion
#region 私有方法
/// <summary>
/// 驗證token
/// </summary>
/// <param name="authorizationToken">user_token</param>
/// <param name="client_id">app_id</param>
/// <param name="client_secret">client_secret</param>
/// <param name="status"> 預設0: 正常 1: 即將到期 2: 驗證失敗</param>
/// <returns></returns>
private string CallFbCheckTokenGetAPI(string authorizationToken, string client_id, string client_secret, out int status) { // 送出資料
status = 0; // 預設0: 正常 1: 即將到期 2: 驗證失敗
string uri = "https://graph.facebook.com/debug_token?"; var dicData = new Dictionary<string, string>() { { "input_token", authorizationToken }, { "access_token", string.Format("{0}|{1}",client_id,client_secret) }, }; APIHelper.BaseGet(uri, null, dicData, out HttpResponseMessage responseMessage); if (responseMessage.IsSuccessStatusCode) { var responseData = JsonConvert.DeserializeObject<FbTokenVerification>(responseMessage.Content.ReadAsStringAsync().Result); if (responseData.data.is_valid) { return null; } else { status = 2; return responseData.data.error.message; } } else { status = 2; var error = $"{nameof(CallFbCheckTokenGetAPI)} Error, ReasonPhrase:{responseMessage.ReasonPhrase} hrmResult.Headers.WwwAuthenticate:{responseMessage.Headers.WwwAuthenticate} "; return $"Token Check 失敗, {error}"; } }
/// <summary>
/// 取得Group2User列表
/// </summary>
/// <param name="appId"></param>
/// <param name="qdGroup"></param>
/// <returns></returns>
private string GetListGroup2User(string appId, out List<Group2UserViewModel> qdGroup) { // 送出資料
qdGroup = new List<Group2UserViewModel>();
string sMsg; QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeGroup = lBlocks.GetInst(); qjeGroup.table = tb_grp_group.TABLENAME; qjeGroup.displaycols = new List<string>() { tb_grp_group.CN_APP_ID, tb_grp_group.CN_CLIENT_SECRET }; qjeGroup.wherecols = new WhereNode(tb_grp_group.CN_APP_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group), appId); lBlocks.Add(qjeGroup);
QueryJsonElement qjeGroupUser = lBlocks.GetInst(); qjeGroupUser.table = tb_grp_group2user.TABLENAME; qjeGroupUser.jointable = qjeGroup; qjeGroupUser.jointype = QueryJsonElement.LEFT_JOIN; qjeGroupUser.joincols = new Dictionary<string, string> { { tb_grp_group2user.CN_GROUP_UID, tb_grp_group.CN_UID } }; qjeGroupUser.displaycols = new List<string>() { tb_grp_group2user.CN_USER_TOKEN, tb_grp_group2user.CN_FB_ACCOUNT }; qjeGroupUser.wherecols = new WhereNode(tb_grp_group2user.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group2user), BLWording.STATUS_FLAG_ON); lBlocks.Add(qjeGroupUser);
sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
if (sMsg != null) { qdGroup = null; return sMsg; } ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes); qdGroup = ai.RunQueryList<Group2UserViewModel>(cRes); sMsg = GetLastErrorCode(cRes); if (sMsg != null) { return sMsg; } return sMsg; }
/// <summary>
/// 取得設定中的值
/// </summary>
/// <param name="i_crmInput"></param>
/// <returns></returns>
private string GetAppId(CRequestMessage i_crmInput) { object oAppId = i_crmInput != null && i_crmInput.customparam != null && i_crmInput.customparam.ContainsKey(BLWording.APP_ID) ? i_crmInput.customparam[BLWording.APP_ID] : null; return oAppId?.ToString(); }
#endregion
[Auth(false)] public CResponseMessage FbCheckToken(CRequestMessage i_crmInput) { Logger.Info("FbCheckToken debug start"); string sMsg = null; CResponseMessage crmRes = null; try { do { string strAppId = GetAppId(i_crmInput); if (string.IsNullOrEmpty(strAppId)) { Logger.Info(string.Format("請在appsettings.join中添加{0}的配置", BLWording.APP_ID)); sMsg = string.Format("請在appsettings.join中添加{0}的配置", BLWording.APP_ID) ; break; }
List<MailAccountInfo> lsMailList = new List<MailAccountInfo>(); // 取得當發文錯誤要發送的名單
string sMsgMailList = SystemSettingHelper.GetSetting(BLWording.ERROR_MAILLIST, out var mailList); if (sMsg != null) { Logger.Error(sMsgMailList); } if (mailList != null && !string.IsNullOrEmpty(mailList.key_value)) { var lsMail = mailList.key_value.Split(new String[] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries).ToList(); foreach (var mail in lsMail) { lsMailList.Add(new MailAccountInfo() { EMail = mail }); Logger.Info(string.Format("errorMail:{0}", mail)); } } else { Logger.Info(string.Format("請先設置{0}的值", BLWording.ERROR_MAILLIST)); sMsg = string.Format("請先設置{0}的值", BLWording.ERROR_MAILLIST); break; }
sMsg = GetListGroup2User(strAppId, out var qdGroup); if (sMsg != null) { break; } if (qdGroup.Count() <0) { Logger.Info("未查詢到user資料"); sMsg = "未查詢到user資料"; break; } List<ErrorMsg> lsErrorMsg = new List<ErrorMsg>(); foreach (Group2UserViewModel Group2UserData in qdGroup) { string isValid = CallFbCheckTokenGetAPI(Group2UserData.user_token, Group2UserData.app_id, Group2UserData.client_secret, out int status); if (isValid != null) { sMsg = isValid; if (status == 2) { Logger.Info(string.Format("Token驗證失敗:fb_account:{0}&&&app_id:{1}&&&client_secret:{2}&&&user_token:{3}", Group2UserData.fb_account, Group2UserData.app_id, Group2UserData.client_secret, Group2UserData.user_token)); lsErrorMsg.Add(new ErrorMsg() { fb_account = Group2UserData.fb_account,message= sMsg }); } } else { Logger.Info(string.Format("Token驗證成功:fb_account:{0}&&&app_id:{1}&&&client_secret:{2}&&&user_token:{3}", Group2UserData.fb_account, Group2UserData.app_id, Group2UserData.client_secret, Group2UserData.user_token)); }
} //存在錯誤訊息時
if (lsErrorMsg.Count() > 0) {
var mailHelper = new MailHelper(); var strBody = "";
foreach (ErrorMsg ErrorMsgData in lsErrorMsg) { strBody += string.Format("fb賬號:{0}錯誤信息:{1}<br/>", ErrorMsgData.fb_account, ErrorMsgData.message); } var mailMsg = mailHelper.Send(string.Format("appid:{0}驗證token錯誤", strAppId), strBody, lsMailList); if (string.IsNullOrEmpty(mailMsg)) { Logger.Info("信件發送成功"); } else { Logger.Error(string.Format("信件發送失敗:{0} => {1}", mailMsg, lsMailList)); } } else { Logger.Info(string.Format("app_id:{0}下未有驗證token錯誤的user", strAppId)); } crmRes = new CSuccessResponseMessage(null, i_crmInput); // 填寫回傳
} while (false); } catch (Exception ex) { sMsg = $"{nameof(PushPost)} exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ex={ex.Message}"; Logger.Error(sMsg); #if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg); #endif
}
if (!string.IsNullOrEmpty(sMsg)) { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } return crmRes; }
} }
|