100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 使用Senparc.Weixin SDK搭建微信公众号服务程序

使用Senparc.Weixin SDK搭建微信公众号服务程序

时间:2018-08-16 08:06:00

相关推荐

使用Senparc.Weixin SDK搭建微信公众号服务程序

之前学过一些关于微信公众号二次开发的教程,偶然的机会接触了Senparc.Weixin SDK,确实是不错的框架,所以想着按照/szw/archive//05/14/weixin-course-index.html里的教程自己学着从零开始搭建这个框架,中间发现一些问题,在这里做些记录,经供参考。

关于微信公众号的开发原理,请查看Senparc.Weixin SDK相关教程,在这里就不再累赘。

下面主要记录在VS下一个微信公众号二次开发程序的创建过程:

1、建立一个空的 MVC项目:

2、引入Senparc.Weixin SDK的dll文件

一般我们可以使用nuget直接安装到该项目中。右击项目中的引用,点击菜单中的“管理NuGet程序包”。

在浏览中搜索Senparc.Weixin SDK相关的dll,主要有以下几个dll:

Senparc.Weixin:基础库

Senparc.Weixin MP:公众号、微信支付、JS-SDK、摇一摇周边相关的库

Senparc.Weixin MP Mvc:用于提供基于 mvc的拓展

备注:安装这些dll的时候,都会有安装版本的选择,刚开始我想着依照以前成熟的demo来查找对应版本的dll,但思来想去,还是用最新的,有问题再继续解决。

3、在global.asax.cs文件中进行设置,主要在Application_Start()中增加以下代码:

/* 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);

4、在web.config文件中进行设置,主要在<appSetting>节点中加入以下参数:

<!-- 以下信息会被自动识别,如无特殊说明,不用的参数可以删除,但修改 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" />

<!-- 自动识别参数结束 -->

5、创建一个控制器——WeixinControl.cs,并且修改该代码,代码如下:

using System.Web.Mvc;

using Senparc.Weixin;

using Senparc.Weixin.MP;

namespace weixintest.Controllers

{

using Senparc.Weixin.MP.Entities.Request;

using Senparc.Weixin.MP.MvcExtension;

using weixintest.MessageHandlers.CustomMessageHandler;

//using Senparc.Weixin.monService.CustomMessageHandler;

public 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填写如:/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 + "," + 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: Weixin

public ActionResult Index()

{

return View();

}

}

}

6、添加messagehandler,在该项目下新建文件夹,格式和内容如下:

7、CustomMessageContext.cs

namespace weixintest.MessageHandlers.CustomMessageHandler

{

public class CustomMessageContext : MessageContext<IRequestMessageBase, IResponseMessageBase>

{

public CustomMessageContext()

{

base.MessageContextRemoved += CustomMessageContext_MessageContextRemoved;

}

/// <summary>

/// 当上下文过期,被移除的时候触发的时间

/// </summary>

private void CustomMessageContext_MessageContextRemoved(object sender, WeixinContextRemovedEventArgs<IRequestMessageBase, IResponseMessageBase> e)

{

/* 注意,这个事件不是实时触发的(当然你也可以专门写一个线程监控)

* 为了提高效率,根据WeixinContext中的算法,这里的过期消息会在过期后下一条请求执行之前被清除

*/

var messageContext = e.MessageContext as CustomMessageContext;

if (messageContext == null)

{

//如果是正常的调用,messageContext不会为null

return;

}

//TODO:这里根据需要执行消息过期时候的逻辑,下面的代码仅供参考

//Log.InfoFormat("{0}的消息上下文已过期",e.OpenId);

//api.SendMessage(e.OpenId, "由于长时间未搭理客服,您的客服状态已退出!");

}

}

}

8、CustomMessageHandler.cs

using Senparc.NeuChar.Entities;

using Senparc.Weixin.MP.Entities;

using Senparc.Weixin.MP.Entities.Request;

using Senparc.Weixin.MP.MessageHandlers;

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Web;

namespace weixintest.MessageHandlers.CustomMessageHandler

{

public class CustomMessageHandler: MessageHandler<CustomMessageContext>

{

public CustomMessageHandler(Stream inputStream, PostModel postModel)

: base(inputStream, postModel)

{

}

public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)

{

var responseMessage = base.CreateResponseMessage<ResponseMessageText>(); //ResponseMessageText也可以是News等其他类型

responseMessage.Content = "这条消息来自DefaultResponseMessage。";

return responseMessage;

}

public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)

{

var responseMessage = base.CreateResponseMessage<ResponseMessageText>();

responseMessage.Content = "您的OpenID是:" + requestMessage.FromUserName //这里的requestMessage.FromUserName也可以直接写成base.WeixinOpenId

+ "。\r\n您发送了文字信息:" + requestMessage.Content; //\r\n用于换行,requestMessage.Content即用户发过来的文字内容

return responseMessage;

}

}

}

9、基本完成后发布到服务器上,功能如下:

以上内容写得有点糙,先发布出来大家吐槽吧。有哪些问题的大家一起指正,我随时更新内容。当然如果有朋友也想搭这个demo,也可以联系我,我把之前搭的这个demo发你,一起学习。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。