公众号消息会话开发
Posted 雪雁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了公众号消息会话开发相关的知识,希望对你有一定的参考价值。
目录
-
概要
博客使用Word发博,发布后,排版会出现很多问题,敬请谅解。可加群获取原始文档。
公众号是以微信用户的一个联系人形式存在的,消息会话是公众号与用户交互的基础。
本篇主要围绕消息会话进行讲述。
-
关于Magicodes.WeChat.SDK
MAGICODES.WECHAT.SDK为心莱团队封装的轻量级微信SDK,现已全部开源,开源库地址为:https://github.com/xin-lai/Magicodes.WeChat.SDK
更多介绍,请关注后续博客。
-
群发消息
公众号可以以一定频次(订阅号为每天1次,服务号为每月4次),向用户群发消息,包括文字消息、图文消息、图片、视频、语音等。
-
概要图
-
发送流程
-
图文消息群发流程
-
-
文本群发流程
-
其他类型群发流程
-
注意事项
- 对于认证订阅号,群发接口每天可成功调用1次,此次群发可选择发送给全部用户或某个分组;
- 对于认证服务号虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败;
- 具备微信支付权限的公众号,在使用群发接口上传、群发图文消息类型时,可使用<a>标签加入外链;
- 4、开发者可以使用预览接口校对消息样式和排版,通过预览接口可发送编辑好的消息给指定用户校验效果。
-
开发实践
-
开发思路
-
框架设计
为了简化接口调用,Magicodes.WeChat.SDK对此进行了封装。目前框架仅封装了多图文的接口调用,其他封装类似:
-
多图文接口
注意:多图文群发时,图片地址必须为上传图片素材时获取到的微信服务器地址。
-
Demo
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Magicodes.WeChat.SDK.Apis.Material;
using System.Linq;
namespace Magicodes.WeChat.SDK.Test.ApiTests
{
[TestClass]
public class NewsApiTest : ApiTestBase
{
NewsApi api = new NewsApi();
public NewsApiTest()
{
api.SetKey(1);
}
[TestMethod]
public void NewsApiTest_GetById()
{
var testNews = db.Site_News.FirstOrDefault();
if (testNews == null)
{
Assert.Fail("没有数据!");
}
var result = api.Get(testNews.MediaId);
if (!result.IsSuccess())
{
Assert.Fail("获取多图文信息失败,返回结果如下:" + result.DetailResult);
}
}
[TestMethod]
public void NewsApiTest_Get()
{
var result = api.Get();
if (!result.IsSuccess())
{
Assert.Fail("获取多图文信息失败,返回结果如下:" + result.DetailResult);
}
}
[TestMethod]
public void NewsApiTest_Post()
{
//不能使用第三方的图片
var model = new NewsPostModel() {
Articles=new System.Collections.Generic.List<NewsPostModel.ArticleInfo>()
{
new NewsPostModel.ArticleInfo()
{
Author="liwq",
Content="<p><img data-s=\\"300,640\\" data-type=\\"png\\" data-src=\\"http://mmbiz.qpic.cn/mmbiz/SLeRFiaVmNAS3kOq3icjbfpz1GicHibTN4P9jicick8xyiaia8TMEzafuB4dSBfba5IdshdYX2qXJqBP689NMhPHuo3PsQ/0?wx_fmt=png\\" data-ratio=\\"0.7733812949640287\\" data-w=\\"\\" /><br /></p><p><span style=\\"line-height: 25.6px;\\">"Magicodes.WeiChat,是由Magicode.WeiChat团队打造的一个基于ASP.NET MVC5微信业务快速开发与定制的开发框架。目的让微信业务开发与定制更快速、简单。"</span></p>",
ContentSourceUrl ="http://www.cnblogs.com/codelove/p/5306395.html",
Digest="每周一小更,每月一大更。我们要做最好的微信快速定制开发框架。",
ShowCoverPic=0,
ThumbMediaId="HXIy1CJD5Qt12D9XBuSx0pXEqWaCbkwdYwCQ50spLlE",
Title="版本历史"
},
new NewsPostModel.ArticleInfo()
{
Author="liwq",
Content="<p><img data-s=\\"300,640\\" data-type=\\"png\\" data-src=\\"http://mmbiz.qpic.cn/mmbiz/SLeRFiaVmNAS3kOq3icjbfpz1GicHibTN4P9jicick8xyiaia8TMEzafuB4dSBfba5IdshdYX2qXJqBP689NMhPHuo3PsQ/0?wx_fmt=png\\" data-ratio=\\"0.7733812949640287\\" data-w=\\"\\" /><br /></p><p><span style=\\"line-height: 25.6px;\\">"Magicodes.WeiChat,是由Magicode.WeiChat团队打造的一个基于ASP.NET MVC5微信业务快速开发与定制的开发框架。目的让微信业务开发与定制更快速、简单。"</span></p>",
ContentSourceUrl ="http://www.cnblogs.com/codelove/p/5306395.html",
Digest="每周一小更,每月一大更。我们要做最好的微信快速定制开发框架。",
ShowCoverPic=0,
ThumbMediaId="HXIy1CJD5Qt12D9XBuSx0pXEqWaCbkwdYwCQ50spLlE",
Title="版本历史"
},
new NewsPostModel.ArticleInfo()
{
Author="liwq",
Content="<div><img src=\\"http://mmbiz.qpic.cn/mmbiz/SLeRFiaVmNAS3kOq3icjbfpz1GicHibTN4P9jicick8xyiaia8TMEzafuB4dSBfba5IdshdYX2qXJqBP689NMhPHuo3PsQ/0?wx_fmt=png\\" /></div>",
ContentSourceUrl="http://www.cnblogs.com/codelove/p/5306395.html",
Digest="每周一小更,每月一大更。我们要做最好的微信快速定制开发框架。",
ShowCoverPic=0,
ThumbMediaId="HXIy1CJD5Qt12D9XBuSx0pXEqWaCbkwdYwCQ50spLlE",
Title="版本历史"
},
new NewsPostModel.ArticleInfo()
{
Author="liwq",
Content="<div><img src=\\"http://mmbiz.qpic.cn/mmbiz/SLeRFiaVmNAS3kOq3icjbfpz1GicHibTN4P9jicick8xyiaia8TMEzafuB4dSBfba5IdshdYX2qXJqBP689NMhPHuo3PsQ/0?wx_fmt=png\\" /></div>",
ContentSourceUrl="http://www.cnblogs.com/codelove/p/5306395.html",
Digest="每周一小更,每月一大更。我们要做最好的微信快速定制开发框架。",
ShowCoverPic=0,
ThumbMediaId="HXIy1CJD5Qt12D9XBuSx0pXEqWaCbkwdYwCQ50spLlE",
Title="版本历史"
}
}
};
var result = api.Post(model);
if (!result.IsSuccess())
{
Assert.Fail("添加多图文信息失败,返回结果如下:" + result.DetailResult);
}
}
}
}
注意:在大多数情况下,建议使用WeChatApisContext来调用API,比如WeChatApisContext.Current.MenuApi.Get()。使用new Api(API实现类)的情况仅限于微信服务器事件代码以及某些无法通过当前用户请求获取到TenantId的情形。
-
被动回复消息
在用户给公众号发消息后,微信服务器会将消息发到开发者预先在开发者中心设置的服务器地址(开发者需要进行消息真实性验证),公众号应该在5秒内做出回复,可以回复一个消息,也可以回复命令告诉微信服务器这条消息暂不回复。被动回复消息可以设置加密(在公众平台官网的开发者中心处设置,设置后,按照消息加解密文档来进行处理。
-
概要图
-
被动回复流程
-
普通消息回复流程
-
注意:对于普通消息,我们还可以通过编程将某些消息指向多客服来接收。
-
事件推送消息流程
-
配置
在开发之前,请务必按此步骤配置好认证服务号。
进入公众号后台,进入【开发-基本配置】页面。请按要求配置如图所示的内容:
注意:如果使用的是Magicodes.WeiChat,请进入公众号管理的公众号设置页面,获得Url以及Token。
-
开发实践
-
开发思路
-
-
框架设计
-
Demo
这里使用了Senparc.Weixin:
using Magicodes.WeiChat.Data;
using Magicodes.WeiChat.Data.Models.WeiChat;
using Magicodes.WeChat.SDK;
using NLog;
using Senparc.Weixin.Context;
using Senparc.Weixin.MP;
using Senparc.Weixin.MP.AdvancedAPIs;
using Senparc.Weixin.MP.AdvancedAPIs.Media;
using Senparc.Weixin.MP.Agent;
using Senparc.Weixin.MP.Entities;
using Senparc.Weixin.MP.MessageHandlers;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Configuration;
using System.Data.Entity;
using Magicodes.WeiChat.Helpers;
using Magicodes.WeiChat.Data.Models;
using Magicodes.WeChat.SDK.Apis.User;
using EntityFramework.DynamicFilters;
using Magicodes.WeiChat.Infrastructure.Tenant;
namespace Magicodes.WeiChat.App_Start
{
/// <summary>
/// 微信消息与事件处理
/// </summary>
public class MessageHandler : MessageHandler<MessageContext<IRequestMessageBase, IResponseMessageBase>>
{
private Lazy<AppDbContext> _db;
protected AppDbContext db
{
get
{
return _db.Value;
}
}
/// <summary>
/// 租户Id
/// </summary>
public int TenantId { get; set; }
/// <summary>
/// 日志记录
/// </summary>
ILogger logger = LogManager.GetLogger("WeiChat.MessageHandler");
#region 基础内容
/// <summary>
/// 访问凭据
/// </summary>
private string AccessToken
{
get
{
return WeiChatConfigManager.Current.AccessToken;
}
}
public MessageHandler(Stream inputStream, int tenantId, int maxRecordCount = 0)
: base(inputStream, null, maxRecordCount)
{
WeixinContext.ExpireMinutes = 3;
TenantId = tenantId;
_db = new Lazy<AppDbContext>(() =>
{
var _tmpDb = new AppDbContext();
//启用租户筛选器
TenantManager.Current.EnableTenantFilter(_tmpDb, TenantId);
return _tmpDb;
});
}
public override void OnExecuting()
{
//测试MessageContext.StorageData
if (CurrentMessageContext.StorageData == null)
{
CurrentMessageContext.StorageData = 0;
}
base.OnExecuting();
}
public override void OnExecuted()
{
base.OnExecuted();
CurrentMessageContext.StorageData = (int)CurrentMessageContext.StorageData + 1;
}
#endregion
/// <summary>
/// 所有没有被处理的消息会默认返回这里的结果
/// </summary>
/// <param name="requestMessage"></param>
/// <returns></returns>
public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
{
//所有没有被处理的消息会默认返回这里的结果
var responseMessage = this.CreateResponseMessage<ResponseMessageText>();
responseMessage.Content = "您好,客服人员在忙,请稍后。";
return responseMessage;
}
/// <summary>
/// 订阅(关注)事件
/// </summar 以上是关于公众号消息会话开发的主要内容,如果未能解决你的问题,请参考以下文章 小程序公众号数据助手升级为公众平台助手,增加消息留言赞赏通知四个功能 使用NodeJs作为微信公众号后台服务器 使用node回复公众号消息 node验证公众号tonken node微信公众号开发