/// <summary>
/// 微信请求转发控制器
/// </summary>
[RoutePrefix("weixin")]
public class WeixinController : ApiController
{
#region 创建微信菜单 /// <summary>
/// 创建微信菜单
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("menu")]
public string CreateMenu()
{
#region 菜单结构构建
ButtonGroup bg = new ButtonGroup(); string websiteUrl = WebConfigurationManager.AppSettings["WebsiteUrl"];
bg.button.Add(new SingleViewButton()
{
//url = MenuHelper.GetMenuUrl("Weixin/Index"),
url = string.Format("{0}/{1}", websiteUrl, WebConfigurationManager.AppSettings["mainPage"]),
name = "我要借款",
}); bg.button.Add(new SingleViewButton()
{
url = string.Format("{0}/{1}", websiteUrl, "FrontendMobile/public/view/main.html#appeal"),
name = "投诉建议",
});
#endregion string result = string.Empty;
try
{
CommonApi.CreateMenu(WeixinConfig.APPID, bg); result = "菜单生成成功,一般有24小时缓存时间,也可以直接取消关注再关注直接查看效果";
}
catch (WeixinException e)
{
result = e.Message;
} return result;
} /// <summary>
/// 获取微信菜单
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("menu")]
public HttpResponseMessage GetMenu()
{
try
{
GetMenuResult result = CommonApi.GetMenu(WeixinConfig.APPID); return Request.CreateResponse(HttpStatusCode.OK, result);
}
catch (WeixinException e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e.Message);
}
} /// <summary>
/// 删除菜单方法
/// </summary>
/// <returns></returns>
[HttpDelete]
[Route("menu")]
public string DeleteMenu()
{
try
{
CommonApi.DeleteMenu(WeixinConfig.APPID); return "删除成功,一般有24小时缓存时间,也可以直接取消关注再关注直接查看效果";
}
catch (WeixinException e)
{
return e.Message;
}
} #endregion #region 微信服务器消息接收及处理 /// <summary>
/// 微信后台验证地址(使用Get),微信后台的“接口配置信息”的Url填写如:http://weixin.senparc.com/weixin
/// </summary>
[HttpGet]
[Route("")]
public HttpResponseMessage Get(string signature, string timestamp, string nonce, string echostr)
{
if (CheckSignature.Check(signature, timestamp, nonce, WeixinConfig.TOKEN))
{
var result = new StringContent(echostr, UTF8Encoding.UTF8, "application/x-www-form-urlencoded");
var response = new HttpResponseMessage { Content = result };
return response;
} return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, WeixinConfig.TOKEN) + "。" +
"如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
} /// <summary>
/// 用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML。
/// PS:此方法为简化方法,效果与OldPost一致。
/// v0.8之后的版本可以结合Senparc.Weixin.MP.MvcExtension扩展包,使用WeixinResult,见MiniPost方法。
/// </summary>
[HttpPost]
[Route("")]
public HttpResponseMessage Post()
{
var requestQueryPairs = Request.GetQueryNameValuePairs().ToDictionary(k => k.Key, v => v.Value);
if (requestQueryPairs.Count == 0
|| !requestQueryPairs.ContainsKey("timestamp")
|| !requestQueryPairs.ContainsKey("signature")
|| !requestQueryPairs.ContainsKey("nonce")
|| !CheckSignature.Check(requestQueryPairs["signature"], requestQueryPairs["timestamp"],
requestQueryPairs["nonce"], WeixinConfig.TOKEN))
{
return Request.CreateErrorResponse(HttpStatusCode.Forbidden, "未授权请求");
}
PostModel postModel = new PostModel
{
Signature = requestQueryPairs["signature"],
Timestamp = requestQueryPairs["timestamp"],
Nonce = requestQueryPairs["nonce"]
};
postModel.Token = WeixinConfig.TOKEN;
postModel.EncodingAESKey = WeixinConfig.ENCODINGAESKEY;//根据自己后台的设置保持一致
postModel.AppId = WeixinConfig.APPID;//根据自己后台的设置保持一致 //v4.2.2之后的版本,可以设置每个人上下文消息储存的最大数量,防止内存占用过多,如果该参数小于等于0,则不限制
var maxRecordCount = 10; //自定义MessageHandler,对微信请求的详细判断操作都在这里面。
var messageHandler = new CusMessageHandler(Request.Content.ReadAsStreamAsync().Result, postModel, maxRecordCount); try
{
#if DEBUG
Log.Logger.Debug(messageHandler.RequestDocument.ToString());
if (messageHandler.UsingEcryptMessage)
{
Log.Logger.Debug(messageHandler.EcryptRequestDocument.ToString());
}
#endif
/* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
* 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/
messageHandler.OmitRepeatedMessage = true; //执行微信处理过程
messageHandler.Execute(); #if DEBUG
if (messageHandler.ResponseDocument != null)
{
Log.Logger.Debug(messageHandler.ResponseDocument.ToString());
} if (messageHandler.UsingEcryptMessage)
{
//记录加密后的响应信息
Log.Logger.Debug(messageHandler.FinalResponseDocument.ToString());
}
#endif var resMessage = Request.CreateResponse(HttpStatusCode.OK);
resMessage.Content = new StringContent(messageHandler.ResponseDocument.ToString());
resMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/xml"); return resMessage;
}
catch (Exception ex)
{
Log.Logger.Error("处理微信请求出错:", ex);
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "处理微信请求出错");
}
} #endregion #region JSSDK相关 /// <summary>
/// 获取JSSDK参数信息
/// </summary>
/// <param name="url">获取签名所用的URL</param>
/// <returns></returns>
[HttpGet]
[Route("JSSDK/{*url}")]
public HttpResponseMessage GetJSSDK(string url)
{
if (!HttpContext.Current.SideInWeixinBroswer())
{
return Request.CreateErrorResponse(HttpStatusCode.Forbidden, "请通过微信端登录");
} try
{
//获取时间戳
var timestamp = JSSDKHelper.GetTimestamp();
//获取随机码
var nonceStr = JSSDKHelper.GetNoncestr();
string ticket = AccessTokenContainer.TryGetJsApiTicket(WeixinConfig.APPID, WeixinConfig.APPSECRET);
//获取签名
var signature = JSSDKHelper.GetSignature(ticket, nonceStr, timestamp, HttpUtility.UrlDecode(url)); return Request.CreateResponse(HttpStatusCode.OK, new
{
appId = WeixinConfig.APPID,
timestamp = timestamp,
nonceStr = nonceStr,
signature = signature
});
}
catch (Exception e)
{
Log.Logger.Error("获取JSSDK信息出错:", e); return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "获取JSSDK信息出错");
}
} #endregion /// <summary>
/// 微信菜单导航
/// </summary>
/// <param name="code"></param>
/// <param name="state"></param>
/// <returns></returns>
[HttpGet]
[Route("index")]
public HttpResponseMessage Index(string code, string state)
{
var response = Request.CreateResponse(HttpStatusCode.Redirect);
try
{
var result = OAuthApi.GetAccessToken(WeixinConfig.APPID, WeixinConfig.APPSECRET, code);
response.Headers.Location = new Uri(string.Format("{0}?openId={1}", WebConfigurationManager.AppSettings["mainPage"], result.openid), UriKind.Relative);
}
catch (WeixinException e)
{
Log.Logger.Error("OAuth2授权失败:", e);
response.Headers.Location = new Uri(WebConfigurationManager.AppSettings["mainPage"], UriKind.Relative);
} return response;
}
}

  

asp.net web api集成微信服务(使用Senparc微信SDK)- z的更多相关文章

  1. MVC项目实践,在三层架构下实现SportsStore-09,ASP.NET MVC调用ASP.NET Web API的查询服务

    ASP.NET Web API和WCF都体现了REST软件架构风格.在REST中,把一切数据视为资源,所以也是一种面向资源的架构风格.所有的资源都可以通过URI来唯一标识,通过对资源的HTTP操作(G ...

  2. 使用ASP.NET web API创建REST服务(二)

    Creating a REST service using ASP.NET Web API A service that is created based upon the architecture ...

  3. 使用ASP.NET web API创建REST服务(三)

    本文档来源于:http://www.cnblogs.com/madyina/p/3390773.html Creating a REST service using ASP.NET Web API A ...

  4. ASP.NET Web API 框架研究 服务容器 ServicesContainer

    ServicesContainer是一个服务的容器,可以理解为—个轻量级的IoC容器,其维护着一个服务接口类型与服务实例之间的映射关系,可以根据服务接口类型获取对应的服务实例.构成ASP.NET We ...

  5. asp.net web api集成微信服务(使用Senparc微信SDK)

    /// <summary> /// 微信请求转发控制器 /// </summary> [RoutePrefix("weixin")] public clas ...

  6. 使用 SoapUI 测试ASP.NET Web API

    我们为不同的目的开发了很多web服务,经过授权的用户就可以访问和使用这些web服务.soapUI 是一个强大的测试web服务的工具,他不仅可以测试SOAP服务,他也支持测试RESTful服务.在这里我 ...

  7. Asp.Net Web API 2第四课——HttpClient消息处理器

    Asp.Net Web API 导航   Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web A ...

  8. 【ASP.NET Web API教程】2.1 创建支持CRUD操作的Web API

    原文 [ASP.NET Web API教程]2.1 创建支持CRUD操作的Web API 2.1 Creating a Web API that Supports CRUD Operations2.1 ...

  9. 【ASP.NET Web API教程】2 创建各种Web API

    原文 [ASP.NET Web API教程]2 创建各种Web API Chapter 2: Creating Web APIs第2章 创建各种Web API 本文引自:http://www.asp. ...

随机推荐

  1. js 键盘码

    键盘各按键对应的数字 keycode 9 = Tab keycode 12 = Clear keycode 13 = Enter keycode 16 = Shift keycode 17 = Con ...

  2. (网页)Http状态码大全(200、404、500等)(转CSDN)

    当我们从客户端向服务器发送请求时 服务器向我们返回状态码 状态码就是告诉我们服务器响应的状态 通过它,我们就可以知道当前请求是成功了还是出现了什么问题 状态码是由3位数字和原因短语组成的(比如最常见的 ...

  3. webAPi OData的使用

    一.OData介绍 开放数据协议(Open Data Protocol,缩写OData)是一种描述如何创建和访问Restful服务的OASIS标准. 二.OData 在asp.net mvc中的用法 ...

  4. 6.2Python文件的操作(二)

    目录 目录 前言 (一)文件的定位 (二)文件的读操作 ==1.read()方法== ==2.readline()方法== ==3.readlines()方法== ==4.文件的遍历读法== (三)文 ...

  5. GC Ergonomics间接引发的锁等待超时问题排查分析

    1. 问题背景 上周线上某模块出现锁等待超时,如下图所示: 我虽然不是该模块负责人,但出于好奇,也一起帮忙排查定位问题. 这里的业务背景就是在执行到某个地方时,需要去表中插入一批数据,这批数据需要根据 ...

  6. JS中=>,>>>是什么意思

    最近经常看到 JS中=>,符号,于是查了一下别人的博客 =>是es6语法中的arrow function 举例:(x) => x + 6 相当于   function(x){ ret ...

  7. CPU指令分类

    指令可以分为三类: 有运算单元参与:compq.subq 无运算单元参与:jge.movq MOV指令可以在CPU内或CPU和存储器之间传送字或字节,它传送的信息可以从寄存器到寄存器,立即数到寄存器, ...

  8. Android开发学习笔记(二)——编译和运行原理(1)

    http://www.cnblogs.com/Pickuper/archive/2011/06/14/2078969.html 接着上一篇的内容,继续从全局了解Android.在清楚了Android的 ...

  9. APC | Memcache等缓存key冲突的解决的方法

    版权声明:https://github.com/wusuopubupt https://blog.csdn.net/wusuopuBUPT/article/details/24397109 apc.m ...

  10. Excel各种条件求和的公式汇总

    经常和Execl打交道的人肯定觉得求和公式是大家时常用到的.Excel里有哪几路求和公式呢?他们的使用方式又是怎样?我为大家汇总一下. 使用SUMIF()公式的单条件求和: 如要统计C列中的数据,要求 ...