微信小程序订阅消息推送
微信小程序订阅消息推送
开发配置配置
服务器配置
- 在小程序后台开启消息推送(开发-开发设置-消息推送)文档地址
- 这里需要服务提供验证签名的接口 将下面代码发布到服务器并使用80或443端口访问(我在使用其他端口时出现问题 80和443端口正常) 例如:https://www.baidu.com/api/wx/CheckWxSignature
///
/// 接口认证 /// /// 回传参数 /// 加密字段 /// 时间搓 /// 随机字符串 ///[HttpGet,Route("api/wx/CheckWxSignature")] public IActionResult CheckWxSignature(string echostr, string signature, string timestamp, string nonce) { string token = "test"; if (!CheckSignature(token, signature, timestamp, nonce)) { return Ok("error"); } return Ok(echostr); } /// /// 验证微信签名 /// private bool CheckSignature(string token, string signature, string timestamp, string nonce) { string[] ArrTmp = { token, timestamp, nonce }; Array.Sort(ArrTmp); string tmpStr = string.Join("", ArrTmp); var data = SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(tmpStr)); var sb = new StringBuilder(); foreach (var t in data) { sb.Append(t.ToString("X2")); } tmpStr = sb.ToString(); tmpStr = tmpStr.ToLower(); if (tmpStr == signature) { return true; } else { return false; } }
小程序配置
小程序订阅消息在每次发送消息前需要询问用户是否授权,授权成功后才能调用。每次授权后只有一次调用权限。
服务器配置成功后还需要在小程序授权后才能调用,一次性授权的意思是授权后只有一次
的调用权限.
wx.requestSubscribeMessage({
tmplIds: ['template_id'], // 此处可填写多个模板 ID,但低版本微信不兼容只能授权一个
success (res) {
console.log('已授权接收订阅消息')
}
})
开发者工具目前无法调用接口,只能在真机上运行
服务端消息发送
WeChatHelper.cs
public class WeChatHelper{
private static string WXAppId="";
private static string WXAppSecret="";
///
/// 对页面是否要用授权
///
/// 微信应用id
/// 回调页面
/// 应用授权作用域snsapi_base(不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
/// 授权地址
public static string GetToken()
{
string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", WXAppId, WXAppSecret);
string ReText = HttpClients.WebRequestPostOrGet(url, "");//post/get方法获取信息
try
{
var obj = JsonConvert.DeserializeObject(ReText);
return obj.access_token;
}
catch (Exception ex)
{
return "";
}
}
public static object SendMessage(string token)
{
var access_token = token;
string url = $"https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token={access_token}";
var dic = new Dictionary();//组装模板内容
dic.Add("character_string8",new { value = "2020071212121351" });//订单编号
dic.Add("amount5",new { value= "20.00" });//订单金额
dic.Add("time10", new { value = "2020-07-13 12:00:00" });//订单时间
dic.Add("name3", new { value = "商户名称" });//商户名称
dic.Add("phrase1", new { value = "已支付" });//订单状态
var data = new MessageData()
{
touser = "微信openid",
template_id = "模板id",
page = "需要跳转的小程序地址 不跳转就不填写",
data = dic
};
string ReText = HttpClients.WebRequestPostOrGet(url, JsonConvert.SerializeObject(data));//post/get方法获取信息
return ReText;
}
}
HttpClients.cs
public class HttpClients{
//发起Http请求
public static string HttpPost(string url, Stream data, IDictionary
template_Id在小程序后台进行设置(功能-订阅消息-我的模板中进行添加)
这里代码只做参考 具体实现请不要使用静态类 并且access_token也需要缓存1-2小时 access_token过期时进行刷新