C# 微信小程序 订阅消息

小程序端弹出 用户同意 订阅消息:

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不对";
        }
    }
    
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值