Commit 279b3b21 by changjin.pan

企业微信 获取访客身份接口

parent 7d365da0
...@@ -14,6 +14,7 @@ using Newtonsoft.Json.Linq; ...@@ -14,6 +14,7 @@ using Newtonsoft.Json.Linq;
using Newtonsoft.Json; using Newtonsoft.Json;
using Siger.WeComApi.Core.Domain.Entity; using Siger.WeComApi.Core.Domain.Entity;
using Siger.WeComApi.Core.Repository; using Siger.WeComApi.Core.Repository;
using Siger.WeComApi.Core.Dto.Response;
namespace Siger.WeComApi.Biz.service namespace Siger.WeComApi.Biz.service
{ {
...@@ -170,7 +171,6 @@ namespace Siger.WeComApi.Biz.service ...@@ -170,7 +171,6 @@ namespace Siger.WeComApi.Biz.service
} }
} }
//响应应答处理 //响应应答处理
return ReceiveResponse(decryptionParame, timestamp, signature, Token, EncodingAESKey, CorpID); return ReceiveResponse(decryptionParame, timestamp, signature, Token, EncodingAESKey, CorpID);
} }
...@@ -180,43 +180,16 @@ namespace Siger.WeComApi.Biz.service ...@@ -180,43 +180,16 @@ namespace Siger.WeComApi.Biz.service
public void GetPermentCode(string authCode) public void GetPermentCode(string authCode)
{ {
//通过auth code获取公司信息及永久授权码 //通过auth code获取公司信息及永久授权码
WeComThirdHelper weComThirdHelper = new WeComThirdHelper();
JObject postJson = new JObject(); JObject postJson = new JObject();
postJson["auth_code"] = authCode; postJson["auth_code"] = authCode;
string suitAccessToken = GetSuiteToken(); var suitAccessToken = weComThirdHelper.GetSuiteAccessToken();
WeComThirdHelper weComThirdHelper = new WeComThirdHelper();
string pUrl = weComThirdHelper.GetPermanentCodeUrl() + suitAccessToken; string pUrl = weComThirdHelper.GetPermanentCodeUrl() + suitAccessToken;
string corpInfo = weComThirdHelper.post(pUrl + "", postJson); string corpInfo = weComThirdHelper.post(pUrl + "", postJson);
//将授权的客户企业存入数据库 补充报错的判断!!! //将授权的客户企业存入数据库 补充报错的判断!!!
InsertWeComCompany(corpInfo); InsertWeComCompany(corpInfo);
} }
private string GetSuiteToken()
{
WeComThirdHelper weComThirdHelper = new WeComThirdHelper();
JObject postJson = new JObject();
postJson["suite_id"] = SuiteID;
postJson["suite_secret"] = SuiteSecret;
postJson["suite_ticket"] = weComThirdHelper.GetTicket();
if (string.IsNullOrEmpty(postJson["suite_ticket"].ToString()))
{
string errorMsg = "获取suite_ticket失败,请手动推送ticket,或等待10分钟系统自动推送";
_logger.Info(errorMsg);
throw new Exception(errorMsg);
}
var posdata = JsonConvert.SerializeObject(postJson);
string response = weComThirdHelper.post(weComThirdHelper.GetSuiteTokenUrl(), postJson);
JObject suiteJson = (JObject)JsonConvert.DeserializeObject(response);
if (suiteJson["errcode"] != null)
{
string errorMsg = string.Format("获取suite_access_token失败:errcode{0},errmsg{1}", suiteJson["errcode"], suiteJson["errmsg"]);
_logger.Info(errorMsg);
throw new Exception(errorMsg);
}
string suite_access_token = suiteJson["suite_access_token"].ToString();
weComThirdHelper.SetSuiteToken(suite_access_token);
return suite_access_token;
}
#region 响应应答处理 #region 响应应答处理
/// <summary> /// <summary>
/// 响应应答处理 /// 响应应答处理
...@@ -374,14 +347,12 @@ namespace Siger.WeComApi.Biz.service ...@@ -374,14 +347,12 @@ namespace Siger.WeComApi.Biz.service
return replyMsg; return replyMsg;
} }
private string InsertWeComCompany(string corpInfo) private string InsertWeComCompany(string corpInfo)
{ {
JObject corpJson = (JObject)JsonConvert.DeserializeObject(corpInfo); JObject corpJson = (JObject)JsonConvert.DeserializeObject(corpInfo);
if (corpJson["errcode"] != null) if (corpJson["errcode"] != null)
{ {
string errorMsg = string.Format("获取企业信息及永久授权码失败:errcode{0},errmsg{1}", corpJson["errcode"], corpJson["errmsg"]); string errorMsg = string.Format("获取企业信息及永久授权码失败:errcode{0},errmsg{1}", corpJson["errcode"], corpJson["errmsg"]);
_logger.Info(errorMsg);
throw new Exception(errorMsg); throw new Exception(errorMsg);
} }
var authCorpInfo = corpJson["auth_corp_info"].ToString(); var authCorpInfo = corpJson["auth_corp_info"].ToString();
...@@ -393,29 +364,40 @@ namespace Siger.WeComApi.Biz.service ...@@ -393,29 +364,40 @@ namespace Siger.WeComApi.Biz.service
} }
public string GetUserInfo(string code) public ResponseWeComUser GetUserInfo(string code)
{ {
//获取访客身份
WeComThirdHelper weComThirdHelper = new WeComThirdHelper(); WeComThirdHelper weComThirdHelper = new WeComThirdHelper();
JObject postJson = new JObject(); JObject postJson = new JObject();
postJson["suite_access_token"] = GetSuiteToken(); var suite_access_token = weComThirdHelper.GetSuiteAccessToken();
postJson["code"] = code; var userinfo3rdUrl = weComThirdHelper.GetUserinfo3rdUrl() + "?suite_access_token=" + suite_access_token + "&js_code=" + code + "&grant_type=" + "authorization_code";
if (string.IsNullOrEmpty(postJson["suite_access_token"].ToString())) string response = weComThirdHelper.post(userinfo3rdUrl, null);
JObject userInfoJson = (JObject)JsonConvert.DeserializeObject(response);
if (userInfoJson["errcode"].ToString() != "0")
{ {
string errorMsg = "获取suite_access_token失败"; string errorMsg = string.Format("获取访客身份失败,errcode: {0},errmsg: {1}", userInfoJson["errcode"], userInfoJson["errmsg"]);
_logger.Info(errorMsg);
throw new Exception(errorMsg); throw new Exception(errorMsg);
} }
var posdata = JsonConvert.SerializeObject(postJson);
var userinfo3rdUrl = weComThirdHelper.GetUserinfo3rdUrl() + "?suite_access_token=" + GetSuiteToken() + "&code=" + code; //获取当前用户所属公司的永久授权码
string response = weComThirdHelper.post(userinfo3rdUrl, null); siger_wecom_company curCompany = _sigerWeComCompanyRepository.GetSigerWeComCompany("", userInfoJson["corpid"].ToString());
JObject userInfoJson = (JObject)JsonConvert.DeserializeObject(response); if (curCompany == null)
if (userInfoJson["errcode"] != null)
{ {
string errorMsg = string.Format("获取访客身份失败:errcode{0},errmsg{1}", userInfoJson["errcode"], userInfoJson["errmsg"]); string errorMsg = string.Format("获取访客身份失败,errcode: {0},errmsg: {1}", "", "数据库中未找到当前授权公司");
_logger.Info(errorMsg);
throw new Exception(errorMsg); throw new Exception(errorMsg);
} }
return JsonConvert.SerializeObject(userInfoJson);
//获取客户企业凭证
string accessToken = weComThirdHelper.GetCorpAccessToken(curCompany.corpid, curCompany.permanent_code);
//获取访客敏感信息
var userAllInfo = weComThirdHelper.GetUserAllInfo(accessToken, userInfoJson["userid"].ToString());
JObject userAllInfoJson = (JObject)JsonConvert.DeserializeObject(userAllInfo);
ResponseWeComUser company = JsonConvert.DeserializeObject<ResponseWeComUser>(userAllInfoJson.ToString());
company.corpid = curCompany.corpid;
company.corpname = curCompany.corp_name;
return company;
} }
} }
......
...@@ -221,6 +221,32 @@ namespace Siger.WeComApi.Common.cache ...@@ -221,6 +221,32 @@ namespace Siger.WeComApi.Common.cache
/// <param name="value"></param> /// <param name="value"></param>
/// <param name="overtime">单位-秒</param> /// <param name="overtime">单位-秒</param>
/// <returns></returns> /// <returns></returns>
public bool Set(string key, string value, int overtime = -1)
{
if (Client == null)
{
return false;
}
try
{
byte[] temparr = SerializeObject(value);
return Client.Set(key, temparr, overtime);
}
catch (Exception ex)
{
logger.Error(ex, new { key, value, overtime }, key);
}
return false;
}
/// <summary>
/// 设置缓存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="overtime">单位-秒</param>
/// <returns></returns>
public async Task<bool> SetAsync<T>(string key, T value, int overtime = -1) public async Task<bool> SetAsync<T>(string key, T value, int overtime = -1)
{ {
if (Client == null) if (Client == null)
...@@ -313,6 +339,24 @@ namespace Siger.WeComApi.Common.cache ...@@ -313,6 +339,24 @@ namespace Siger.WeComApi.Common.cache
return false; return false;
} }
public long Del(params string[] key)
{
if (Client == null)
{
return 0;
}
try
{
return Client.Del(key);
}
catch (Exception ex)
{
logger.Error(ex, new { key });
}
return 0;
}
public long DeleteHost(string HostHash, string key) public long DeleteHost(string HostHash, string key)
{ {
if (Client == null) if (Client == null)
......
...@@ -3,9 +3,11 @@ using System.Collections.Generic; ...@@ -3,9 +3,11 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Net; using System.Net;
using System.Text; using System.Text;
using System.Threading.Tasks;
using System.Timers; using System.Timers;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Siger.WeComApi.Common.cache;
namespace Siger.ApiTPM.Utilities namespace Siger.ApiTPM.Utilities
{ {
...@@ -18,6 +20,7 @@ namespace Siger.ApiTPM.Utilities ...@@ -18,6 +20,7 @@ namespace Siger.ApiTPM.Utilities
private readonly string Token = "VA7Ua2huaUKmjhaxakxCO2iYQYKCa6"; private readonly string Token = "VA7Ua2huaUKmjhaxakxCO2iYQYKCa6";
private readonly string CorpID = "ww99ade71da501313d"; private readonly string CorpID = "ww99ade71da501313d";
private readonly string EncodingAESKey = "M1s6eo7BEBmxNw2Tj8TeQPKKT6zqKOyYRWkpuN8kmnn"; private readonly string EncodingAESKey = "M1s6eo7BEBmxNw2Tj8TeQPKKT6zqKOyYRWkpuN8kmnn";
private readonly string ProviderSecret = "YfzQU3nKNSLAPM9-c4kHtP5hCTFG2p3xbJlFtsIlsxCPgs15079tYNL94Xb5Rf0s";
//企微应用关联的小程序信息 //企微应用关联的小程序信息
private readonly string SuiteID = "wwb172cebe81bae0af"; private readonly string SuiteID = "wwb172cebe81bae0af";
private readonly string SuiteSecret = "aHB2yPhKX8AsRp-c_8UBrhOju7ahxu8Rq3LLuRVrRo8"; private readonly string SuiteSecret = "aHB2yPhKX8AsRp-c_8UBrhOju7ahxu8Rq3LLuRVrRo8";
...@@ -39,13 +42,18 @@ namespace Siger.ApiTPM.Utilities ...@@ -39,13 +42,18 @@ namespace Siger.ApiTPM.Utilities
private string ssoAuthUrl = "https://open.work.weixin.qq.com/wwopen/sso/3rd_qrConnect?appid=%s&redirect_uri=%s&state=%s&usertype=%s"; private string ssoAuthUrl = "https://open.work.weixin.qq.com/wwopen/sso/3rd_qrConnect?appid=%s&redirect_uri=%s&state=%s&usertype=%s";
private string loginInfoUrl = serviceUrl + "get_login_info?access_token=%s"; private string loginInfoUrl = serviceUrl + "get_login_info?access_token=%s";
//第三方应用身份验证 //第三方应用身份验证
private string getuserinfo3rdUrl = serviceUrl + "getuserinfo3rd"; private string getuserinfo3rdUrl = serviceUrl + "miniprogram/jscode2session";
private static string userUrl = baseUrl + "user/";
private string getUserAllInfo = userUrl + "get";
//加密coprid
private string corpIDToOpenCorpIDUrl = serviceUrl + "corpid_to_opencorpid";
//通讯录转译 //通讯录转译
private string contactUploadUrl = serviceUrl + "media/upload?provider_access_token=%s&type=%s"; private string contactUploadUrl = serviceUrl + "media/upload?provider_access_token=%s&type=%s";
private string contactTransUrl = serviceUrl + "contact/id_translate?provider_access_token=%s"; private string contactTransUrl = serviceUrl + "contact/id_translate?provider_access_token=%s";
private string transResultUrl = serviceUrl + "batch/getresult?provider_access_token=%s&jobid=%s"; private string transResultUrl = serviceUrl + "batch/getresult?provider_access_token=%s&jobid=%s";
//公司相关 //公司相关
private string corpTokenUrl = serviceUrl + "get_corp_token?suite_access_token=%s"; private string corpTokenUrl = serviceUrl + "get_corp_token?suite_access_token=";
private string departmentUrl = baseUrl + "department/list?access_token=%s"; private string departmentUrl = baseUrl + "department/list?access_token=%s";
private string userSimplelistUrl = baseUrl + "user/simplelist?access_token=%s&department_id=%s&fetch_child=%s"; private string userSimplelistUrl = baseUrl + "user/simplelist?access_token=%s&department_id=%s&fetch_child=%s";
private string userDetailUrl = baseUrl + "user/get?access_token={access_token}&userid={user_id}"; private string userDetailUrl = baseUrl + "user/get?access_token={access_token}&userid={user_id}";
...@@ -133,11 +141,135 @@ namespace Siger.ApiTPM.Utilities ...@@ -133,11 +141,135 @@ namespace Siger.ApiTPM.Utilities
return suiteTokenUrl; return suiteTokenUrl;
} }
/// <summary>
/// 获取客户企业凭证
/// </summary>
/// <returns></returns>
public string GetCorpAccessToken(string corpid,string permanentCode)
{
string preAccessToken = corpid + "AccessToken";
string accessToken = CacheUtility.Instance.GetString(preAccessToken);
if (string.IsNullOrEmpty(accessToken))
{
JObject postJson = new JObject();
postJson["auth_corpid"] = corpid;
postJson["permanent_code"] = permanentCode;
string url = corpTokenUrl + GetSuiteAccessToken();
string response = post(url, postJson);
JObject accessTokenJson = (JObject)JsonConvert.DeserializeObject(response);
if (accessTokenJson["errcode"] != null)
{
string errorMsg = string.Format("获取企业{0}应用凭证失败,errcode: {1},errmsg: {2}", corpid, accessTokenJson["errcode"], accessTokenJson["errmsg"]);
throw new Exception(errorMsg);
}
accessToken = accessTokenJson["access_token"].ToString();
CacheUtility.Instance.Set(preAccessToken, accessToken, 7150); //2小时过期的token,此处提前50秒清空
}
return accessToken;
}
/// <summary>
/// 第三方应用 获取访客身份url(简单信息)
/// </summary>
/// <returns></returns>
public string GetUserinfo3rdUrl() public string GetUserinfo3rdUrl()
{ {
return getuserinfo3rdUrl; return getuserinfo3rdUrl;
} }
/// <summary>
/// 第三方应用 获取访客身份(敏感信息)
/// </summary>
/// <returns></returns>
public string GetUserAllInfo(string accessToken,string userid)
{
JObject postJson = new JObject();
var url = getUserAllInfo + "?access_token=" + accessToken + "&userid=" + userid;
string response = post(url, null);
return response;
}
/// <summary>
/// 获取第三方应用凭证
/// </summary>
/// <returns></returns>
public string GetSuiteAccessToken()
{
var suiteAccessToken = CacheUtility.Instance.GetString("SuiteAccessToken");
if (string.IsNullOrEmpty(suiteAccessToken))
{
JObject postJson = new JObject();
postJson["suite_id"] = SuiteID;
postJson["suite_secret"] = SuiteSecret;
postJson["suite_ticket"] = GetTicket();
if (string.IsNullOrEmpty(postJson["suite_ticket"].ToString()))
{
string errorMsg = "获取suite_ticket失败,请手动推送ticket,或等待10分钟系统自动推送";
throw new Exception(errorMsg);
}
string response = post(suiteTokenUrl, postJson);
JObject suiteAccessTokenJson = (JObject)JsonConvert.DeserializeObject(response);
if (suiteAccessTokenJson["errcode"] != null)
{
string errorMsg = string.Format("获取第三方应用凭证失败,errcode: {0},errmsg: {1}", suiteAccessTokenJson["errcode"], suiteAccessTokenJson["errmsg"]);
throw new Exception(errorMsg);
}
suiteAccessToken = suiteAccessTokenJson["suite_access_token"].ToString();
CacheUtility.Instance.Set("SuiteAccessToken", suiteAccessToken, 7150); //2小时过期的token,此处提前50秒清零
}
return suiteAccessToken;
}
/// <summary>
/// 获取供应商token(西格的AccessToken)
/// </summary>
/// <returns></returns>
public string GetProviderAccessToken()
{
var providerToken = CacheUtility.Instance.GetString("ProvideAccessToken");
if (string.IsNullOrEmpty(providerToken))
{
JObject postJson = new JObject();
postJson["corpid"] = CorpID;
postJson["provider_secret"] = ProviderSecret;
var response = post(providerTokenUlr, postJson);
JObject providerTokenJson = (JObject)JsonConvert.DeserializeObject(response);
if (providerTokenJson["errcode"] != null)
{
string errorMsg = string.Format("获取服务商凭证失败,errcode: {0},errmsg: {1}", providerTokenJson["errcode"], providerTokenJson["errmsg"]);
throw new Exception(errorMsg);
}
providerToken = providerTokenJson["provider_access_token"].ToString();
CacheUtility.Instance.Set("ProvideAccessToken", providerToken, 7150); //2小时过期的token,此处提前50秒清零
}
return providerToken;
}
/// <summary>
/// 转化为加密后的corpid
/// </summary>
/// <returns></returns>
public string ToOpenCorpid(string corpID)
{
string provideAccessToken = GetProviderAccessToken();
string url = corpIDToOpenCorpIDUrl + "?provider_access_token=" + provideAccessToken;
JObject postJson = new JObject();
postJson["corpid"] = corpID;
string response = post(url, postJson);
JObject openCorpIDJson = (JObject)JsonConvert.DeserializeObject(response);
if (openCorpIDJson["errcode"] != null)
{
string errorMsg = string.Format("openCorpID,errcode: {0},errmsg: {1}", openCorpIDJson["errcode"], openCorpIDJson["errmsg"]);
throw new Exception(errorMsg);
}
return openCorpIDJson.ToString();
}
/// <summary>
/// post请求方法
/// </summary>
/// <returns></returns>
public string post(string posturl, JObject json) public string post(string posturl, JObject json)
{ {
var posdata = JsonConvert.SerializeObject(json); var posdata = JsonConvert.SerializeObject(json);
......
...@@ -13,7 +13,7 @@ namespace Siger.WeComApi.Core.Biz ...@@ -13,7 +13,7 @@ namespace Siger.WeComApi.Core.Biz
string InstructCallback(HttpRequest request); string InstructCallback(HttpRequest request);
string GetUserInfo(string code); ResponseWeComUser GetUserInfo(string code);
} }
} }
...@@ -5,6 +5,7 @@ namespace Siger.WeComApi.Core.Repository ...@@ -5,6 +5,7 @@ namespace Siger.WeComApi.Core.Repository
{ {
public interface ISigerWeComCompanyRepository : IRepositoryBase<siger_wecom_company> public interface ISigerWeComCompanyRepository : IRepositoryBase<siger_wecom_company>
{ {
siger_wecom_company GetSigerWeComCompany(string id, string corpid);
string AddSigerWeComCompany(siger_wecom_company siger_wecom_company); string AddSigerWeComCompany(siger_wecom_company siger_wecom_company);
} }
......
...@@ -8,6 +8,7 @@ using Siger.WeComApi.Core.Biz; ...@@ -8,6 +8,7 @@ using Siger.WeComApi.Core.Biz;
using Siger.WeComApi.Common.Filter; using Siger.WeComApi.Common.Filter;
using Siger.WeComApi.Common.CommonModels; using Siger.WeComApi.Common.CommonModels;
using Siger.WeComApi.Common.Enums; using Siger.WeComApi.Common.Enums;
using Siger.WeComApi.Core.Dto.Response;
namespace Siger.ApiTPM.Controllers namespace Siger.ApiTPM.Controllers
{ {
...@@ -32,12 +33,13 @@ namespace Siger.ApiTPM.Controllers ...@@ -32,12 +33,13 @@ namespace Siger.ApiTPM.Controllers
string result = "success"; string result = "success";
try try
{ {
string userInfo = _sigerWeComThirdService.GetUserInfo(code); ResponseWeComUser userInfo = _sigerWeComThirdService.GetUserInfo(code);
return new ResponseBase(1, 1, userInfo); return new ResponseBase(1, 1, userInfo);
} }
catch (Exception ex) catch (Exception ex)
{ {
result = "企微回调异常:" + ex.Message; result = "企微回调异常:" + ex.Message;
_logger.Info(result);
return new ResponseBase(1, 1, result); return new ResponseBase(1, 1, result);
} }
} }
......
...@@ -20,7 +20,7 @@ namespace Siger.WeComApi.WebApi ...@@ -20,7 +20,7 @@ namespace Siger.WeComApi.WebApi
.ConfigureWebHostDefaults(webBuilder => .ConfigureWebHostDefaults(webBuilder =>
{ {
webBuilder.UseStartup<Startup>(); webBuilder.UseStartup<Startup>();
webBuilder.UseUrls(args.Length > 1 ? $"http://*:{args[1]}" : "http://*:7008"); webBuilder.UseUrls(args.Length > 1 ? $"http://*:{args[1]}" : "http://*:8105");
}).ConfigureAppConfiguration((hostingContext, config) => }).ConfigureAppConfiguration((hostingContext, config) =>
{ {
var env = hostingContext.HostingEnvironment; var env = hostingContext.HostingEnvironment;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment