小程序端弹出 用户同意 订阅消息:
var midlist=[];//订阅消息列表
var sub_temp={};
sub_temp.msgType="访客提醒";
sub_temp.template_id="YCBAZh0MEsiyDFhW4WrATyRqvvKPf_r6JvbTYkel648";
sub_temp.accept="";
midlist.push(sub_temp);
sub_temp={};
sub_temp.msgType="违反宿管通知";
sub_temp.template_id="ASYha6FFo1w9Je7dfJTJ-fojArGBpEm721JeIE3uSkI";
sub_temp.accept="";
midlist.push(sub_temp);
this.get_accept(midlist,1);
//获取没有同意的订阅消息:midlist=消息模板列表;getcode=1时,去获取前3项....
get_accept:function(midlist,getcode)
{
var no_accept_submsg=[];
var _tmplIds=[];
var that=this;
wx.getSetting({
withSubscriptions: true,
success (res) {
//console.log(res.authSetting);
// res.authSetting = {
// "scope.userInfo": true,
// "scope.userLocation": true
// }
//console.log(res.subscriptionsSetting);
var subsetting=res.subscriptionsSetting;
if(subsetting!=undefined)
{
var items=JSON.stringify(subsetting.itemSettings) ;
//console.log(items);
var itemjs=JSON.parse(items);
for(var i=0;i<midlist.length;i++)
{
// sub_temp.msgType="上传照片不符";
// sub_temp.template_id="UzEFc5MD84pJ6unEBluXtR_nzqQDM0wYZvUMJm3sZ4M";
var sub_accept=itemjs[midlist[i].template_id];
if(sub_accept==undefined || sub_accept!="accept")
{
// var sub_temp={};
// sub_temp.msgType=midlist[i].msgType;
// sub_temp.msgType=midlist[i].template_id;
no_accept_submsg.push(midlist[i]);
if(_tmplIds.length<3)
{
_tmplIds.push(midlist[i].template_id);
//break;
}
}
else
{
midlist[i].accept="1";
no_accept_submsg.push(midlist[i]);
}
//sub_temp.accept="";
}
that.globalData.no_accept_submsg=no_accept_submsg;
}
else{
for(var i=0;i<midlist.length;i++)
{
no_accept_submsg.push(midlist[i]);
if(_tmplIds.length<3)
{
_tmplIds.push(midlist[i].template_id);
break;
}
}
that.globalData.no_accept_submsg=no_accept_submsg;
}
console.log("no_accept_submsg:");
console.log(that.globalData.no_accept_submsg);
if(getcode==1 && _tmplIds.length>0)
{
wx.requestSubscribeMessage({
tmplIds: _tmplIds, //['37cnYgEW0qF1Y-BBWvE0xO5s2UoI2OIfOOxUpHI-Ny8'],
success: function (res) {
console.log(res);
},
})
}
// res.subscriptionsSetting = {
// mainSwitch: true, // 订阅消息总开关
// itemSettings: { // 每一项开关
// SYS_MSG_TYPE_INTERACTIVE: 'accept', // 小游戏系统订阅消息
// SYS_MSG_TYPE_RANK: 'accept',
// zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE: 'reject', // 普通一次性订阅消息
// ke_OZC_66gZxALLcsuI7ilCJSP2OJ2vWo2ooUPpkWrw: 'ban',
// }
// }
}
})
},
//C# 后台发送订阅消息代码
using ConsumePlatform.Model;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using Utility;
namespace ConsumePlatform.BLL
{
public class subscribeMsg
{
#region 小程序:订阅消息
public string postmsg(string APIURL, Dictionary<string, string> dc, int iType)
{
if (APIURL.ToUpper().StartsWith("HTTPS"))
{
//https请求
//using System.Net.Security;
//using System.Security.Cryptography.X509Certificates;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
}
var http = new HttpClient();
string Receive = "";
try
{
//https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx093fe96d62d9a278&secret=647d496c618f1e0cb5491bae59e6fa86
if (iType == 0)
{
string jsonString = JsonConvert.SerializeObject(dc);
var content = new FormUrlEncodedContent(dc);//dc
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded");
Receive = http.PostAsync(APIURL, content).Result.Content.ReadAsStringAsync().Result;
}
else
{
string jsonString = JsonConvert.SerializeObject(dc);
HttpContent content = new StringContent(jsonString);
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");//
Receive = http.PostAsync(APIURL, content).Result.Content.ReadAsStringAsync().Result;
}
http.Dispose();
}
catch (Exception ex)
{
http.Dispose();
}
return Receive;
}
public string postmsg(string APIURL, string strjson)
{
if (APIURL.ToUpper().StartsWith("HTTPS"))
{
//https请求
//using System.Net.Security;
//using System.Security.Cryptography.X509Certificates;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
}
var http = new HttpClient();
string Receive = "";
try
{
//string jsonString = JsonConvert.SerializeObject(dc);
HttpContent content = new StringContent(strjson);
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");//
Receive = http.PostAsync(APIURL, content).Result.Content.ReadAsStringAsync().Result;
http.Dispose();
}
catch (Exception ex)
{
http.Dispose();
}
return Receive;
}
public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true;
}
public class actoken
{
public string access_token { get; set; }// string 获取到的凭证
public int expires_in { get; set; }//number 凭证有效时间,单位:秒。目前是7200秒之内的值。
public int errcode { get; set; }//errcode number 错误码
public string errmsg { get; set; }//errmsg string 错误信息
}
/// <summary>
/// 获取小程序全局唯一后台接口调用凭据(access_token) https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html
/// </summary>
/// <returns>{"access_token":"ACCESS_TOKEN","expires_in":7200} </returns>
public string auth_getAccessToken(ref string access_token, string appid, string secret)
{
Dictionary<string, string> dc = new Dictionary<string, string>();
dc.Add("grant_type", "client_credential");
string tem_appid = appid;
string tem_secret = secret;
dc.Add("appid", tem_appid);
dc.Add("secret", tem_secret);
string data = postmsg("https://api.weixin.qq.com/cgi-bin/token", dc, 0);
if (data != "")
{
actoken _data = JsonConvert.DeserializeObject<actoken>(data);
if (_data.access_token != null && _data.access_token != "")
{
access_token = _data.access_token;
return "成功";
}
else
{
#region
string errmsg = _data.errmsg;
string errcode = _data.errcode.ToString();
switch (errcode)
{
case "-1":
{
errmsg = "系统繁忙,此时请开发者稍候再试";
break;
}
case "40001":
{
errmsg = "AppSecret 错误或者 AppSecret 不属于这个小程序,请开发者确认 AppSecret 的正确性";
break;
}
case "40002":
{
errmsg = "请确保 grant_type 字段值为 client_credential";
break;
}
case "40013 ":
{
errmsg = "不合法的 AppID,请开发者检查 AppID 的正确性,避免异常字符,注意大小写";
break;
}
default:
{ break; }
}
#endregion
access_token = "";
return errmsg;
}
}
else
{
access_token = "";
return "请求失败";
}
}
public string getAccessToken(string appid, string secret)
{
//Pay/getAccessToken
// access_token 的存储至少要保留 512 个字符空间;
//access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效;
//建议开发者使用中控服务器统一获取和刷新 access_token,其他业务逻辑服务器所使用的 access_token 均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致 access_token 覆盖而影响业务;
//access_token 的有效期通过返回的 expires_in 来传达,目前是7200秒之内的值,中控服务器需要根据这个有效时间提前去刷新。在刷新过程中,中控服务器可对外继续输出的老 access_token,此时公众平台后台会保证在5分钟内,新老 access_token 都可用,这保证了第三方业务的平滑过渡;
//access_token 的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新 access_token 的接口,这样便于业务服务器在API调用获知 access_token 已超时的情况下,可以触发 access_token 的刷新流程。
string access_token = "";
string msg = auth_getAccessToken(ref access_token, appid, secret);
return access_token;
}
/// <summary>
/// 订阅消息 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
/// </summary>
/// <param name="appid"></param>
/// <param name="secret"></param>
/// <param name="openid">如果为空,根据订单号获取用户表里的openid</param>
/// <param name="template_id">暂时无用</param>
/// <param name="page">小程序跳转页面路径:pages/carpay/carpay</param>
/// <param name="miniType">跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版</param>
/// <param name="msgType">通知消息类型:外部订餐提醒、内部订餐提醒、消费提醒、充值成功通知、访客拜访提醒</param>
/// <param name="orderid">订单单号(充值成功通知用的是索引号)</param>
/// <returns>空=成功;其他是具体信息</returns>
public string uniform_send(string appid, string secret, string openid, string template_id, string page, string miniType, string msgType, string orderid)//
{
try
{
#region 提醒
//#region 发送订阅消息
//try
//{
// System.Threading.Thread thread = new Thread(() =>
// {
// string _appid = System.Configuration.ConfigurationManager.AppSettings["appid"].ToString().Trim();//this.appid
// string _secret = System.Configuration.ConfigurationManager.AppSettings["secret"].ToString().Trim();//this.secret
// subscribeMsg sendmsg = new subscribeMsg();
// string msg = sendmsg.uniform_send(_appid, _secret, "", "", "", "", "消费提醒", mOper.OperationID);
// });
// thread.IsBackground = true;
// thread.Start();
//}
//catch
//{ }
//#endregion
//订阅消息,小程序端,先要用户授权才可以接收到消息
//订单下单提醒(内部、外部) 37cnYgEW0qF1Y-BBWvE0xO5s2UoI2OIfOOxUpHI-Ny8
//支付成功通知(消费提醒) V2dQzhDFWzSF0ALLgszp5j44BoeF2KC1hdxhJKvIHFc
//充值成功通知 mHeNyoDyFAjV0hMDwX2sq7s9fnXIYtJTdkTibRzvRKg
// wx.requestSubscribeMessage({
// tmplIds: ['mHeNyoDyFAjV0hMDwX2sq7s9fnXIYtJTdkTibRzvRKg'],
// success: function(res)
// {
// app.consolelog(res);
// },
//})
#endregion
if (string.IsNullOrEmpty(appid))
{
try
{
appid = System.Configuration.ConfigurationManager.AppSettings["appid"].ToString();
}
catch
{
}
}
if (string.IsNullOrEmpty(secret))
{
try
{
secret = System.Configuration.ConfigurationManager.AppSettings["secret"].ToString();
}
catch
{
}
}
if (string.IsNullOrEmpty(appid) || string.IsNullOrEmpty(secret) || string.IsNullOrEmpty(msgType) || string.IsNullOrEmpty(orderid))
{
return "参数有误";
}
if (string.IsNullOrEmpty(miniType))
{
miniType = "formal"; //跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
}
if (string.IsNullOrEmpty(page))
{
page = "pages/zdcodemeals/zdcodemeals";//小程序跳转页面路径
}
Dictionary<string, string> dc = new Dictionary<string, string>();
string access_token = "";
string msg = auth_getAccessToken(ref access_token, appid, secret);
if (access_token == "")
{
return "请求接口调用凭证失败," + msg;
}
var url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + access_token;
string jsondata = getMsgdata(appid, openid, template_id, page, miniType, msgType, orderid);
if (jsondata == "" || jsondata.ToLower().StartsWith("herr"))
{
jsondata = jsondata.Trim() == "" ? "获取订单信息失败" : jsondata;
return jsondata;
}
string data = postmsg(url, jsondata);//JsonConvert.SerializeObject(tempData)
if (data != "")
{
var getdata = Newtonsoft.Json.Linq.JToken.Parse(data) as dynamic;
string errcode = getdata.errcode;
string errmsg = getdata.errmsg;
if (errcode == "0")
{
return "";//
}
else
{
switch (errcode)
{
#region
case "40003":
{
errmsg = "touser字段openid为空或者不正确";
break;
}
case "40037":
{
errmsg = "订阅模板id为空不正确";
break;
}
case "43101":
{
errmsg = "用户拒绝接受消息,如果用户之前曾经订阅过,则表示用户取消了订阅关系";
break;
}
case "47003":
{
errmsg = "模板参数不准确,可能为空或者不满足规则,errmsg会提示具体是哪个字段出错";
break;
}
case "41030":
{
errmsg = "page路径不正确,需要保证在现网版本小程序中存在,与app.json保持一致";
break;
}
default:
{
break;
}
#endregion
}
return errmsg;
}
}
return "请求失败";
}
catch (Exception ex)
{
return ex.Message;
}
}
#endregion
/// <summary>
/// 获取订阅消息对应模板的json信息
/// </summary>
/// <param name="appid"></param>
/// <param name="openid"></param>
/// <param name="template_id"></param>
/// <param name="page"></param>
/// <param name="miniType"></param>
/// <param name="msgType"></param>
/// <param name="orderid"></param>
/// <returns></returns>
public string getMsgdata(string appid, string openid, string template_id, string page, string miniType, string msgType, string orderid)
{
//通过appid 来区别不同小程序的消息模板(默认、食堂全码付)
//if (appid.ToLower().Trim() == "wx093fe96d62d9a278")
//{
#region 食堂全码付:wx093fe96d62d9a278
switch (msgType)
{
case "访客拜访提醒":
{
#region 访客拜访提醒
//拜访客户
//{{thing1.DATA}}
//拜访方式
//{{thing2.DATA}}
//拜访时间
//{{time3.DATA}}
T_Visitor_BLL bllvst = new T_Visitor_BLL();
T_Visitor_Model m = bllvst.GetModel(orderid);
if (m == null || m.VisitID.Trim() == "")
{ return "herr:未找到编号为" + orderid + "的访客信息"; }
openid = m.vt_OpenID;
string thing1 = m.vName;
string thing2 = m.vThings;
if(thing1.Length>20)
{
thing1 = thing1.Substring(0, 20);
}
if (thing2.Length > 20)
{
thing2 = thing2.Substring(0, 20);
}
var tempData = new
{
touser = openid,
template_id = "iNXhxqWe__dhGZaiO4L1LbL8i49Hn_1kmHRMWj0uNbg",// "",
page = page,// "index",
miniprogram_state = miniType,// "developer",//跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
lang = "zh_CN",
data = new
{
thing1 = new
{
value = thing1
},
thing2 = new
{
value = thing2
},
time3 = new
{
value = m.vDate.ToString("yyyy-MM-dd HH:mm") //:ss
},
}
};
return JsonConvert.SerializeObject(tempData);
#endregion
break;
}
default:
{ break; }
}
#endregion
//}
return "appid或者msgType不对";
}
}
}