微信新更新的sendUniformMessage接口也叫下发小程序和公众号统一的服务消息,可以支持小程序服务通知和微信公众号模板消息的发送,并且如果小程序与公众号相互关联还可根据通知进行页面的跳转交互,好吧 话不多说直接上干货:
官方文档链接地址:https://developers.weixin.qq.com/miniprogram/dev/api/sendUniformMessage.html
首先我们看官方文档的请求地址:
POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN可以看到要发送统一服务便需要获取到与微信交换的access_token,跟微信打过交道的朋友就知道微信提供了根据appid 以及appsecret 获取token的接口 在这里就不多做解释了 当然你也可以使用现有的sdk 本人使用的是Magicodes.WeChat.MiniProgram这个是公司在githup开源的sdk之一 进行微信的基础信息注册如下所示:
namespace Magicodes.MiniProgram.Startup
{
public class MiniProgramStartup
{
/// <summary>
/// 配置微信小程序
/// </summary>
public static void Config(ILogger logger, IIocManager iocManager, IConfigurationRoot config, ISettingManager settingManager)
{
//日志函数
void LogAction(string tag, string message)
{
if (tag.Equals("error", StringComparison.CurrentCultureIgnoreCase))
logger.Error(message);
else
logger.Debug(message);
}
var configInfo = new DefaultMiniProgramConfig
{
MiniProgramAppId = config["WeChat:MiniProgram:AppId"],
MiniProgramAppSecret = config["WeChat:MiniProgram:AppSecret"]
};
//从用户设置读取配置
if (Convert.ToBoolean(settingManager.GetSettingValue(AppSettings.WeChatMiniProgram.IsActive)))
{
configInfo.MiniProgramAppId = settingManager.GetSettingValue(AppSettings.WeChatMiniProgram.AppId);
configInfo.MiniProgramAppSecret = settingManager.GetSettingValue(AppSettings.WeChatMiniProgram.AppSecret);
}
MiniProgramSDKBuilder.Create()
//设置日志记录
.WithLoggerAction(LogAction).RegisterGetKeyFunc(() =>
{
var key = iocManager.Resolve<IAbpSession>()?.TenantId;
if (key == null) return "0";
return key.ToString();
}).RegisterGetConfigByKeyFunc(key => configInfo).Build();
}
}
}
就可以使用接口获取token :
TokenApi tokenApi = new TokenApi()
var AccessToken = tokenApi.SafeGet()?.AccessToken;
然后就是入参的准备 仔细看一下官方文档会发现 小程序对于不良营销方面还是非常的严格 需要提供formid或者预支付id作为入参 所以在小程序的场景中应该尽量多存储一下formid和预支付id以供使用
我们来看一下入参格式:
namespace Magicodes.App.Application.MiniProgram.Dto
{
/// <summary>
/// 发送统一服务出参(根据微信格式定义)
/// </summary>
public class UniServiceOutput
{
/// <summary>
/// 接收该消息的用户openid(小程序与公众号openid需根据场景区分)
/// </summary>
public string touser { get; set; }
/// <summary>
/// 小程序的模板
/// </summary>
public AppletTemplateInputDto weapp_template_msg { get; set; }
/// <summary>
/// 公众号的模板
/// </summary>
public PlatformTemplateInputDto mp_template_msg { get; set; }
/// <summary>
/// 小程序模板入参
/// </summary>
public class AppletTemplateInputDto{
/// <summary>
/// 模板消息id
/// </summary>
public string template_id { get; set; }
/// <summary>
/// 小程序跳转页面(点击模板消息触发)
/// </summary>
public string page { get; set; }
/// <summary>
/// 表单id(可以是支付场景的预支付id)
/// </summary>
public string form_id { get; set; }
/// <summary>
/// 模板数据
/// </summary>
public Dictionary<string, TemplateDataItem> data { get; set; }
/// <summary>
/// 放大的关键词(为空无放大关键词)
/// </summary>
public string emphasis_keyword { get; set; }
}
/// <summary>
/// 公众号模板入参
/// </summary>
public class PlatformTemplateInputDto
{
/// <summary>
/// 公众号appid
/// </summary>
public string appid { get; set; }
/// <summary>
/// 模板消息id
/// </summary>
public string template_id { get; set; }
/// <summary>
/// 模板消息的跳转地址
/// </summary>
public string url { get; set; }
/// <summary>
/// 关联的小程序(如需要跳转小程序页面需传此值)
/// </summary>
public AssociatedMiniprogram miniprogram { get; set; }
/// <summary>
/// 公众号模板数据
/// </summary>
public Dictionary<string, TemplateDataItem> Data { get; set; }
}
/// <summary>
/// 关联的小程序
/// </summary>
public class AssociatedMiniprogram
{
/// <summary>
/// 小程序appid
/// </summary>
public string appid { get; set; }
/// <summary>
/// 需要跳转的小程序地址
/// </summary>
public string pagepath { get; set; }
}
}
}
namespace Magicodes.App.Application.MiniProgram.Dto
{
/// <summary>
/// 模板消息的数据项类型
/// </summary>
public class TemplateDataItem
{
/// <summary>
///
/// </summary>
/// <param name="tvalue"></param>
/// <param name="tcolor"></param>
public TemplateDataItem(string tvalue, string tcolor = "#173177")
{
value = tvalue;
color = tcolor;
}
/// <summary>
/// 项目值
/// </summary>
public string value { get; set; }
/// <summary>
/// 16进制颜色代码,如:#FF0000
/// </summary>
public string color { get; set; }
}
}
这里一定注意的地方 1、参数要一致包括大小写和符号,2、touser指的平台的openid 3、有小程序的入参时默认先发小程序服务通知,没有小程序的入参有公众号入参才会发公众号模板消息
以上准备好了之后就可以进行发送了
/// 处理并发送模板消息
/// </summary>
/// <param name="input"></param>
private SendUniformMessageResult sendUniformMessage(UniServiceOutput input)
{
TokenApi tokenApi = new TokenApi();
string result = null;
//根据sdk安全获取AcceessToken值
var AccessToken = tokenApi.SafeGet()?.AccessToken;
if (!string.IsNullOrEmpty(AccessToken))
{
string url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=" + AccessToken;
var wr = new WeChatApiWebRequestHelper();
result = wr.HttpPost(url, JsonConvert.SerializeObject(input));
}
else
{
Logger.Debug("未获取到AccessToken");
}
return JsonConvert.DeserializeObject<SendUniformMessageResult>(result);
}