Senparc.Weixin.MP SDK 已经涵盖了微信 6.x 的几乎所有公共 API。
整个项目的源代码以都可以在这个项目中获取到:https://github.com/JeffreySu/WeiXinMPSDK
PS:由于微信 API 以及 Senparc.Weixin SDK一直在不断升级更新,最新的代码及 Demo 以上面的 GitHub 中的源代码为准。
我们现在从无到有建立一个ASP.NET MVC 项目,来看一下如何与微信进行对接(Webforms 原理也都是一样,只不过把 Controller 中的 Action 换成 .aspx 页面就可以了,可参考 Demo)。
将要演示的项目源代码也可以在开源项目中找到。因为源代码中要兼顾多个不同 .net 版本的项目,因此有一个公用项目(CommonService),所以与下面展示的结构略有不同,不过逻辑完全一致:
MVC:https://github.com/JeffreySu/WeiXinMPSDK/tree/master/Senparc.Weixin.MP.Sample
WebForms:https://github.com/JeffreySu/WeiXinMPSDK/tree/master/Senparc.Weixin.MP.Sample.WebForms
现在就开始吧!
第一步:建立一个空的 ASP.NET MVC 项目(截图以 ASP.NET MVC 4.0 为例,.net core 也是类似的),项目名称如Senparc.Weixin.MP.Sample
第二步:引入Senparc.Weixin.MP.dll
引入相关dll的方式有两种:
- 一种是复制 dll 到项目某文件夹中,然后直接在项目中添加 Senparc.Weixin.MP.dll 、依赖dll 及 Senparc.Weixin.MP.MvcExtension.dll 的引用(Senparc.Weixin.MP.MvcExtension.dll 只有 MVC 项目需要,WebForms 项目可以忽略);
- 第二种方式我们可以使用 Nuget 直接安装到项目中。
Nuget项目地址:https://www.nuget.org/packages/Senparc.Weixin.MP/
第一种方式已经足够简单(但是不建议,除非你需要修改 SDK 中的内容,使用自己编译的 dll)。
下面介绍第二种:打开菜单【工具】> 【库程序包管理器】 > 【程序包管理器控制台】,如下图:
点击后将会出现程序包管理器控制台:
如果是第一次安装Senparc.Weixin.MP库,则在PM>后面输入命令:
Install-Package Senparc.Weixin.MP
回车,Senparc.Weixin.MP.dll将会被自动引入到项目中。
如果以后需要更新到最新版本,只需要使用Update-Package命令,将会自动在线更新:
Update-Package Senparc.Weixin.MP
以上操作对MVC和WebForms项目都有效。
如果是MVC项目,为了获得更多针对MVC的扩展功能,我们可以继续引入Senparc.Weixin.MP.MvcExtension.dll:
Install-Package Senparc.Weixin.MP.MVC
命令窗口输出结果如下,表示已经安装成功:
我们观察一下项目引用的程序集,这两个dll已经被引用进来了(同时还会自动引入依赖的dll,如 Senparc.CO2NET):
除了使用命令行的方式,也可以在【解决方案管理器】中的项目节点点击右键,选择【管理 Nuget 程序包 ...】,在【浏览】标签下输入关键字“Senparc.Weixin.MP”,选中最新的版本,点击右侧的【安装】按钮:
第三步:在全局中进行设置
.net framework 项目:
1、打开global.asax.cs文件
2、在 Application_Start() 方法中加入如下代码(可参考 Demo):
/* CO2NET 全局注册开始
* 建议按照以下顺序进行注册
*/ //设置全局 Debug 状态
var isGLobalDebug = true;
var senparcSetting = SenparcSetting.BuildFromWebConfig(isGLobalDebug); //CO2NET 全局注册,必须!!
IRegisterService register = RegisterService.Start(senparcSetting)
.UseSenparcGlobal(false, null); /* 微信配置开始
* 建议按照以下顺序进行注册
*/ //设置微信 Debug 状态
var isWeixinDebug = true;
var senparcWeixinSetting = SenparcWeixinSetting.BuildFromWebConfig(isWeixinDebug); //微信全局注册,必须!!
register.UseSenparcWeixin(senparcWeixinSetting, senparcSetting);
3、参考 Web.Config 的<appSetting>节点下加入参数设置(可参考 Demo):
<!-- 以下信息会被自动识别,如无特殊说明,不用的参数可以删除,但修改 key 后将会无法自动识别! -->
<!-- 自动识别参数开始 --> <!-- 以下为 CO2NET 的 SenparcSetting 全局配置,请勿修改 key,勿删除任何项 --> <!-- 默认缓存命名空间配置 -->
<add key="DefaultCacheNamespace" value="DefaultCache" />
<!-- Cache.Redis连接配置 -->
<add key="Cache_Redis_Configuration" value="Redis配置" />
<!--<add key="Cache_Redis_Configuration" value="localhost:6379" />-->
<!-- Cache.Memcached连接配置 -->
<add key="Cache_Memcached_Configuration" value="Memcached配置" />
<add key="SenparcUnionAgentKey" value="SenparcUnionAgentKey" /> <!-- 以下为 Senparc.Weixin 的 SenparcWeixinSetting 微信配置,不使用的参数可以删除 --> <!-- 微信公众号URL对接信息 -->
<add key="WeixinToken" value="应用服务器(开发者服务器)URL对应的Token" />
<add key="WeixinEncodingAESKey" value="应用服务器(开发者服务器)URL对应的消息加解密密钥" />
<!-- 高级接口信息 -->
<add key="WeixinAppId" value="微信AppId" />
<add key="WeixinAppSecret" value="微信AppSecret" />
<!-- SDK提供的代理功能设置 -->
<add key="WeixinAgentUrl" value="外部代理Url" />
<add key="WeixinAgentToken" value="外部代理Token" />
<add key="SenparcAgentKey" value="盛派代理系统通用Key" />
<add key="WeixinAgentWeiweihiKey" value="外部代理WeiWeiHiKey" />
<!-- 微信支付相关参数 -->
<!-- 微信支付V2 -->
<add key="WeixinPay_Tenpay" value="WeixinPay_Tenpay" />
<add key="WeixinPay_PartnerId" value="WeixinPay_PartnerId" />
<add key="WeixinPay_Key" value="WeixinPay_Key" />
<add key="WeixinPay_AppId" value="WeixinPay_AppId" />
<add key="WeixinPay_AppKey" value="WeixinPay_AppKey" />
<add key="WeixinPay_TenpayNotify" value="WeixinPay_TenpayNotify" />
<!-- 微信支付V3 -->
<add key="TenPayV3_MchId" value="TenPayV3_MchId" />
<add key="TenPayV3_Key" value="TenPayV3_Key" />
<add key="TenPayV3_AppId" value="TenPayV3_AppId" />
<add key="TenPayV3_AppSecret" value="TenPayV3_AppSecret" />
<add key="TenPayV3_TenpayNotify" value="http://YourDomainName/TenpayV3/PayNotifyUrl" />
<!-- 开放平台 -->
<add key="Component_Appid" value="Component_Appid" />
<add key="Component_Secret" value="Component_Secret" />
<add key="Component_Token" value="Component_Token" />
<add key="Component_EncodingAESKey" value="Component_EncodingAESKey" />
<!-- 微信企业号 -->
<add key="WeixinCorpId" value="WeixinCorpId" />
<add key="WeixinCorpSecret" value="WeixinCorpSecret" /> <!-- 小程序 -->
<!-- 小程序消息URL对接信息 -->
<add key="WxOpenToken" value="小程序消息URL对应的Token" />
<add key="WxOpenEncodingAESKey" value="小程序消息URL对应的消息加解密密钥" />
<!-- 小程序秘钥信息 -->
<add key="WxOpenAppId" value="微信小程序AppId" />
<add key="WxOpenAppSecret" value="微信小程序AppSecret" /> <!-- 自动识别参数结束 -->
.net core 项目:
1、打开 Startup.cs 文件(可参考 Demo)
2、在 ConfigureServices() 方法中加入:
public void ConfigureServices(IServiceCollection services)
{
//...
services.AddSenparcGlobalServices(Configuration)//Senparc.CO2NET 全局注册
.AddSenparcWeixinServices(Configuration);//Senparc.Weixin 注册
}
3、修改 Configure() 方法传入参数,并添加代码:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions<SenparcSetting> senparcSetting, IOptions<SenparcWeixinSetting> senparcWeixinSetting)
{
//app.UseMvc()等设置... // 启动 CO2NET 全局注册,必须!
IRegisterService register = RegisterService.Start(env, senparcSetting.Value)
.UseSenparcGlobal(false, null); //开始注册微信信息,必须!
register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value)
}
4、在 appsetting.json 文件下插入以下设置(可参考 Demo):
//以下信息会被自动识别,如无特殊说明,不用的参数可以删除,但修改 key 后将会无法自动识别! //CO2NET 设置
"SenparcSetting": {
//以下为 CO2NET 的 SenparcSetting 全局配置,请勿修改 key,勿删除任何项 "IsDebug": true,
"DefaultCacheNamespace": "DefaultCache",
//分布式缓存
"Cache_Redis_Configuration": "Redis配置",
//"Cache_Redis_Configuration": "localhost:6379",
"Cache_Memcached_Configuration": "Memcached配置",
"SenparcUnionAgentKey": "SenparcUnionAgentKey"
},
//Senparc.Weixin SDK 设置
"SenparcWeixinSetting": {
//以下为 Senparc.Weixin 的 SenparcWeixinSetting 微信配置 //微信全局
"IsDebug": true, //以下不使用的参数可以删除,key 修改后将会失效 //公众号
"Token": "weixin",
"EncodingAESKey": "",
"WeixinAppId": "WeixinAppId",
"WeixinAppSecret": "WeixinAppSecret",
//小程序
"WxOpenAppId": "WxOpenAppId",
"WxOpenAppSecret": "WxOpenAppSecret",
"WxOpenToken": "WxOpenToken",
"WxOpenEncodingAESKey": "WxOpenEncodingAESKey",
//企业微信
"WeixinCorpId": "WeixinCorpId",
"WeixinCorpSecret": "WeixinCorpSecret", //微信支付
//微信支付V2(旧版)
"WeixinPay_PartnerId": "WeixinPay_PartnerId",
"WeixinPay_Key": "WeixinPay_Key",
"WeixinPay_AppId": "WeixinPay_AppId",
"WeixinPay_AppKey": "WeixinPay_AppKey",
"WeixinPay_TenpayNotify": "WeixinPay_TenpayNotify",
//微信支付V3(新版)
"TenPayV3_MchId": "TenPayV3_MchId",
"TenPayV3_Key": "TenPayV3_Key",
"TenPayV3_AppId": "TenPayV3_AppId",
"TenPayV3_AppSecret": "TenPayV3_AppId",
"TenPayV3_TenpayNotify": "TenPayV3_TenpayNotify", //开放平台
"Component_Appid": "Component_Appid",
"Component_Secret": "Component_Secret",
"Component_Token": "Component_Token",
"Component_EncodingAESKey": "Component_EncodingAESKey", //扩展及代理参数
"AgentUrl": "AgentUrl",
"AgentToken": "AgentToken",
"SenparcWechatAgentKey": "SenparcWechatAgentKey"
}
第四步:建立一个Controller,如WeixinController.cs
第四步:修改WeixinController.cs
我们将下列代码加入WeixinController.cs:
using System;
using System.IO;
using System.Web.Configuration;
using System.Web.Mvc;
using Senparc.Weixin.MP.Entities.Request; namespace Senparc.Weixin.MP.Sample.Controllers
{
using Senparc.Weixin.MP.MvcExtension;
using Senparc.Weixin.MP.Sample.CommonService.CustomMessageHandler; public partial class WeixinController : Controller
{
public static readonly string Token = Config.SenparcWeixinSetting.Token;//与微信公众账号后台的Token设置保持一致,区分大小写。
public static readonly string EncodingAESKey = Config.SenparcWeixinSetting.EncodingAESKey;//与微信公众账号后台的EncodingAESKey设置保持一致,区分大小写。
public static readonly string AppId = Config.SenparcWeixinSetting.WeixinAppId;//与微信公众账号后台的AppId设置保持一致,区分大小写。 /// <summary>
/// 微信后台验证地址(使用Get),微信后台的“接口配置信息”的Url填写如:http://weixin.senparc.com/weixin
/// </summary>
[HttpGet]
[ActionName("Index")]
public ActionResult Get(PostModel postModel, string echostr)
{
if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
{
return Content(echostr); //返回随机字符串则表示验证通过
}
else
{
return Content("failed:" + postModel.Signature + "," + MP.CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "。" +
"如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
}
} /// <summary>
/// 用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML。
/// PS:此方法为简化方法,效果与OldPost一致。
/// v0.8之后的版本可以结合Senparc.Weixin.MP.MvcExtension扩展包,使用WeixinResult,见MiniPost方法。
/// </summary>
[HttpPost]
[ActionName("Index")]
public ActionResult Post(PostModel postModel)
{
if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
{
return Content("参数错误!");
} postModel.Token = Token;//根据自己后台的设置保持一致
postModel.EncodingAESKey = EncodingAESKey;//根据自己后台的设置保持一致
postModel.AppId = AppId;//根据自己后台的设置保持一致 //自定义MessageHandler,对微信请求的详细判断操作都在这里面。
var messageHandler = new CustomMessageHandler(Request.InputStream, postModel);//接收消息 messageHandler.Execute();//执行微信处理过程 return new FixWeixinBugWeixinResult(messageHandler);//返回结果 }
}
}
第一个 Get() 对应微信后台设置 URL 时候的请求(只在验证的时候用到),第二个 Post() 用于接收微信服务器转发过来的客户请求。
其中 CustomMessageHandler 是我们自己创建的一个类,用于实现 MessageHandler(有关MessageHandler的详细介绍可以看《Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler》,也可以看这里),所有处理微信消息的核心逻辑都被包含到 CustomMessageHandler 中执行。除了承担处理微信响应的任务,MessageHandler 还实现了处理单个用户对话上下文等功能,非常方便。
至此,整个Senparc.Weixin.MP SDK已经基本开发完毕,可以直接发布,并在微信后台使用“高级功能”对接了。
在微信后台设置中,Url 填写 http://xxx/Weixin,Token 填写 Web.config 中的“WeixinToken ” 或 appsetting.json 中的“Token”所设置的值。
(如何在微信后台设置请看:Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证)
接下去我们会介绍如何在MessageHandler中处理具体的微信请求(文字、图片、位置、语音等等)。
系列教程索引
地址:http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html
- Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二):成为开发者
- Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证
- Senparc.Weixin.MP SDK 微信公众平台开发教程(四):Hello World
- Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK
- Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler
- Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题
- Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明
- Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十):多客服接口说明
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十三):地图相关接口说明
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十四):请求消息去重
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十七):个性化菜单接口说明
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十九):MessageHandler 的未知类型消息处理
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十):使用菜单消息功能
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十一):在小程序中使用 WebSocket (.NET Core)
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试
Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK的更多相关文章
-
Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能
在Senparc.Weixin.dll v4.5.7版本开始,我们提供了Web代理功能,以方便在受限制的局域网内的应用可以顺利调用接口. 有关的修改都在Senparc.Weixin/Utilities ...
-
Senparc.Weixin.MP SDK 微信公众平台开发教程(十七):个性化菜单接口说明
前不久微信上线了个性化菜单接口,Senparc.Weixin SDK也已经同步更新. 本次更新升级Senparc.Weixin.MP版本到v13.5.2,依赖Senparc.Weixin版本4.5.4 ...
-
Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证
要对接微信公众平台的"开发模式",即对接到自己的网站程序,必须在注册成功之后(见Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册),等待官方 ...
-
Senparc.Weixin.MP SDK 微信公众平台开发教程(四):Hello World
============= 以下写于2013-07-20 ============= 这一篇文章其实可以写在很前面,不过我还是希望开发者们尽多地了解清楚原理之后再下手. 通过上一篇Senparc.W ...
-
Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler
上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK>我们讲述了如何使用Senparc.Weixin.MP SDK ...
-
Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题
从这篇文章中我们已经了解了微信公众平台消息传递的方式,这种方式有一个先天的缺陷:不同用户的请求都来自同一个微信服务器,这使得常规的Session无法使用(始终面对同一个请求对象,况且还有对方服务器Co ...
-
Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明
一.基础说明 这里说的“通用接口(CommonAPIs)”是使用微信公众账号一系列高级功能的必备验证功能(应用于开发模式). 我们通过微信后台唯一的凭证,向通用接口发出请求,得到访问令牌(Access ...
-
Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明
上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>介绍了如何通过通用接口获取AccessToken,有了AccessToken,我们就可以来操作 ...
-
Senparc.Weixin.MP SDK 微信公众平台开发教程(十):多客服接口说明
微信官方的多客服接口原理是通过用户发送的信息,开发者服务器返回一条指定类型的响应信息,使用户的对话状态切换到官方的多客服状态(持续一段时间),这段时间内用户发送的所有信息都不会到达开发者的服务器,而是 ...
随机推荐
-
vuejs的动态过滤
想要通过vuejs动态过滤(这里动态指得是过滤的条件是动态变化的), 一直没找到好办法, 最蠢的办法当然是两个两个数组,一个作为原始副本数组 一个作为视图数组,这样当过滤条件变化的时候 动态拷贝原始数 ...
-
C++编程思想重点笔记(下)
上篇请看:C++编程思想重点笔记(上) 宏的好处与坏处 宏的好处:#与##的使用 三个有用的特征:字符串定义.字符串串联和标志粘贴. 字符串定义的完成是用#指示,它容许设一个标识符并把它转化为字符串, ...
-
c语言的一些库
1利用DEv编程的时候遇见sleep函数 ..注意S大写,并添加#include<windows.h>.
-
Python TF-IDF计算100份文档关键词权重
上一篇博文中,我们使用结巴分词对文档进行分词处理,但分词所得结果并不是每个词语都是有意义的(即该词对文档的内容贡献少),那么如何来判断词语对文档的重要度呢,这里介绍一种方法:TF-IDF. 一,TF- ...
-
JDK版本不匹配...
Java compiler level does not match the version of the installed Java project facet. 今天从把交通厅的项目,导进来就报 ...
-
【转】千万不要在JS中使用连等赋值操作
原文链接 千万不要在JS中使用连等赋值操作 目录 前言 赋值顺序? 连续赋值能拆开写么? 后记 前言 文章标题这句话原本是在国外某JavaScript规范里看到的,当时并没有引起足够的重视,直到最 ...
-
【CJOJ1644】【洛谷2758】编辑距离
题面 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一个字符: 皆为小 ...
-
随机四则运算的出题程序java
一.设计思想 1.功能较多必须有菜单选择项,将一个大程序分为若干个功能模块的小程序,逐个实现2.针对题目避免重复时先将已生成的算式保存,然后将下一条生成的式子进行判断是否已生成,如果生成则返回循环语句 ...
-
International Programming Retreat Day(2018.11.17)
时间:2018.11.17地点:北京国华投资大厦
-
wamp多站点多端口配置
1.配置httpd.conf 监听多个端口 #Listen 12.34.56.78:80 Listen 8081 Listen 8082 Listen 8083 可以通过netstat -n -a查看 ...