MeiRiYiCheng_1_old/YBDevice.WX/Controllers/OpenController.cs

211 lines
8.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.AspNetCore.Mvc;
using Nirvana.Common;
using Nirvana.Common.ApiBase;
using Senparc.CO2NET.AspNet.HttpUtility;
using Senparc.Weixin.MP.MessageHandlers;
using Senparc.Weixin.Open.ComponentAPIs;
using Senparc.Weixin.Open.Containers;
using Senparc.Weixin.Open.Entities.Request;
using Senparc.Weixin.Open.MessageHandlers;
using System;
using System.Threading.Tasks;
using YBDevice.Core;
using YBDevice.WX.MessageHandlers;
using YBDevice.WX.MessageHandlers.CustomMessageHandler;
namespace YBDevice.WX.Controllers
{
/// <summary>
/// 公众号授权
/// </summary>
public class OpenController : BaseController
{
private readonly ILoggerService _loggerService;
public OpenController(ILoggerService loggerService)
{
_loggerService = loggerService;
}
/// <summary>
/// 发起授权页的体验URL
/// </summary>
/// <returns></returns>
public async Task<IActionResult> OAuth(string id = "")
{
//获取预授权码
var preAuthCode = await ComponentContainer.TryGetPreAuthCodeAsync(component_AppId, component_Secret, true);
var callbackUrl = Configs.GetString("callbackUrl");//成功回调地址
callbackUrl = $"{callbackUrl}/{id}";
var url = ComponentApi.GetComponentLoginPageUrl(component_AppId, preAuthCode, callbackUrl);
return Redirect(url);
}
/// <summary>
/// 获取预授权码以及跳转地址
/// </summary>
/// <returns></returns>
public async Task<IActionResult> GetOAuth(string userid, string type)
{
try
{
if (RedisHelpers.Exists($"authpage_{userid}"))
{
var userinfo = RedisHelpers.stringGet($"authpage_{userid}");
var arr = userinfo.Split('|');
if(arr.Length == 4)
{
return Json(new
{
code = ResultState.SUCCESS,
message = "success",
data = new
{
preAuthCode = arr[2],
url = arr[3]
}
});
}
}
//获取预授权码
var preAuthCode = await ComponentContainer.TryGetPreAuthCodeAsync(component_AppId, component_Secret, true);
var callbackUrl = Configs.GetString("callbackUrl");//成功回调地址
var url = ComponentApi.GetComponentLoginPageUrl(component_AppId, preAuthCode, callbackUrl);
//保存授权信息,10分钟内有效
RedisHelpers.Insert($"authpage_{userid}", $"{userid}|{type}|{preAuthCode}|{url}", 600);
callbackUrl = $"{callbackUrl}/{userid}";
return Json(new
{
code = ResultState.SUCCESS,
message="success",
data = new
{
preAuthCode = preAuthCode,
url = url
}
});
}
catch (Exception ex)
{
_loggerService.AddErrorLogger(ex, $"userid={userid},type={type}", "获取预授权码以及跳转地址");
return Json(new { code = ResultState.FAIL, message = ex.Message});
}
}
/// <summary>
/// 获取公众号可用的token
/// </summary>
/// <param name="appid">公众号appid</param>
/// <returns></returns>
public async Task<IActionResult> GetAccessToken(string appid)
{
try
{
var accesstoken = await AuthorizerContainer.TryGetAuthorizerAccessTokenAsync(component_AppId, appid);
return Json(new { status = "success", accesstoken = accesstoken });
}
catch (Exception ex)
{
var msg = $"appid={appid}";
_loggerService.AddErrorLogger(ex, msg, "获取公众号可用的token");
return Json(new { status = "fail", accesstoken = "", errmsg = ex.Message });
}
}
/// <summary>
/// 微信服务器会不间断推送最新的Ticket10分钟一次需要在此方法中更新缓存
/// </summary>
/// <returns></returns>
[HttpPost]
public ActionResult Notice(PostModel postModel)
{
try
{
//var logPath = ServerUtility.ContentRootMapPath(string.Format("~/App_Data/Open/{0}/", SystemTime.Now.ToString("yyyy-MM-dd")));
//if (!Directory.Exists(logPath))
//{
// Directory.CreateDirectory(logPath);
//}
postModel.Token = component_Token;
postModel.EncodingAESKey = component_EncodingAESKey;
postModel.AppId = component_AppId;
ThirdPartyMessageHandler messageHandler = new CustomThirdPartyMessageHandler(Request.GetRequestMemoryStream(), postModel);
//记录RequestMessage日志可选
// messageHandler.EcryptRequestDocument.Save(Path.Combine(logPath, string.Format("{0}_Request.txt", SystemTime.Now.Ticks)));
// messageHandler.RequestDocument.Save(Path.Combine(logPath, string.Format("{0}_Request_{1}.txt", SystemTime.Now.Ticks, messageHandler.RequestMessage.AppId)));
messageHandler.Execute();//执行
//记录ResponseMessage日志可选
//using (TextWriter tw = new StreamWriter(Path.Combine(logPath, string.Format("{0}_Response_{1}.txt", SystemTime.Now.Ticks, messageHandler.RequestMessage.AppId))))
//{
// tw.WriteLine(messageHandler.ResponseMessageText);
// tw.Flush();
// tw.Close();
//}
return Content(messageHandler.ResponseMessageText);
}
catch (Exception ex)
{
var msg = $"{postModel.ToJson()}";
_loggerService.AddErrorLogger(ex, msg, "微信服务器会不间断推送最新的Ticket");
return Content("");
}
}
/// <summary>
/// 授权事件接收URL
/// </summary>
/// <param name="appId"></param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> Callback(Senparc.Weixin.MP.Entities.Request.PostModel postModel)
{
//此处的URL格式类型为http://sdk.weixin.senparc.com/Open/Callback/$APPID$ 在RouteConfig中进行了配置你也可以用自己的格式只要和开放平台设置的一致。
//处理微信普通消息可以直接使用公众号的MessageHandler。此处的URL也可以直接填写公众号普通的URL如本Demo中的/Weixin访问地址
//记录数据
//new LoggerApplication().InsertErrorLog(postModel.ToJson());
postModel.Token = component_Token;
postModel.EncodingAESKey = component_EncodingAESKey; //根据自己后台的设置保持一致
postModel.AppId = component_AppId; //根据自己后台的设置保持一致
var maxRecordCount = 10;
MessageHandler<CustomMessageContext> messageHandler = null;
try
{
var checkPublish = CheckPublish(postModel); //是否在“全网发布”阶段
if (checkPublish)
{
messageHandler = new OpenCheckMessageHandler(Request.GetRequestMemoryStream(), postModel, 10);
}
else
{
messageHandler = new CustomMessageHandler(Request.GetRequestMemoryStream(), postModel, maxRecordCount);
}
if(messageHandler != null)
{
await messageHandler.ExecuteAsync(new System.Threading.CancellationToken());//执行微信处理过程(关键)
}
return new FixWeixinBugWeixinResult(messageHandler);
}
catch (Exception ex)
{
var msg = $",model={postModel.ToJson()}";
if (messageHandler != null && messageHandler.ResponseDocument != null)
{
msg = $"{messageHandler.ResponseDocument.ToString()},model={postModel.ToJson()}";
}
_loggerService.AddErrorLogger(ex, msg, "授权事件接收URL");
return Content("");
}
}
private bool CheckPublish(Senparc.Weixin.MP.Entities.Request.PostModel postModel)
{
//小白商户助手
return postModel.AppId == "wxd5c9b0640e178bf2";
}
}
}