• 微信小程序-发送模板消息


    1 添加一个小程序的消息模板,获取到模板id,存储到数据库中,方便以后修改调用

     

    2. https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/template-message/templateMessage.send.html  小程序模板消息 官网文档,直接调用send方法就行

    这里有个坑,就是 form_id, 这个是用户触发表单事件的表单id,需要存储到数据库中,给这个表单提交以后的数据,添加一个字段叫做form_id(7天过期), 这个formid 是和提交时的openid有关联的,只能是提交的那个人才能用,别人用不了

    也就是说,想要给谁发送模板消息,就要存储谁的form_id。

    例如 剑圣给守望者提交了一个 爱你呦 的表单(数据库里会存储这个表单的form_id),但是守望者回复这个表单,并且向给 剑圣发送一个提醒的模板消息,就需要从剑圣提交的表单中获取存储的form_id,然后拼接url,发送post请求才能成功

    守望者提交表单时的 form_id,只能给守望者自己发送模板消息

     

    3. 代码正文:

    剑圣端:

             Form表单属性

                      bindsubmit="sendClick" 提交方法

            report-submit="true" 必须有,用来获取form_id

        button

           formType="submit" 使用这个属性,进行表单提交,不用bindtap提交

    Wxml:

              <form bindsubmit="sendClick" bindreset="inputReset" report-submit="true">

          <input focus="true" name="send-input" adjust-position='{{false}}' value='{{inputValue}}' bindfocus='focus' bindblur='blur' bindconfirm="sendClick" bindinput="getcontent" />

          <image src='./../../../centent/img/camera.png' bindtap="chooseBanner"></image>

          <button formType="submit" bindtap="addquestion">发送</button>

        </form>

    Js:

    sendClick: function(e) {

            var formId = e.detail.formId;//获取form_id,存储到数据库

           hcxcx.requestPost(hcxcx.apiUrl.addquestion, { formId : formId },function(){

              

    })

    }

    守望者端:

             执行回复操作,C#代码:

             //发送模板消息

             Public void Addquestion(){

            //获取用户的formid,这个就是剑圣端提交保单时存储的formId

            var list = questionbll.GetList("IsNoTeam:1,MemberId:'" + memberid + "',XcxFormIdNoNull:1");

            var fid = list.OrderByDescending(x => x.CreateTime).FirstOrDefault().XcxFormId;

            var openid=memberid.openid;//这个是需要发送的用户(剑圣的openid,必须是小程序的openid)

            //拼接模板消息主体

            XcxRequestData xr = new XcxRequestData();

            XcxRequestDataKeyword xcxRequest1 = new XcxRequestDataKeyword();

            xcxRequest1.value = createTime.ToString("yyyy-MM-dd HH:mm:ss");

            XcxRequestDataKeyword xcxRequest2 = new XcxRequestDataKeyword();

            xcxRequest2.value = user.RealName;

            XcxRequestDataKeyword xcxRequest3 = new XcxRequestDataKeyword();

            xcxRequest3.value = "尊敬的用户您好,您的咨询已经被" + user.RealName + "解答,请及时查看";

     

            xr.keyword1 = xcxRequest1;

            xr.keyword2 = xcxRequest2;

            xr.keyword3 = xcxRequest3;

            //获取消息模板

            TemplateMesEntity templateMesEntity = templateMesCache.GetEntityByTeamIdAndTypeId(teamid.ToInt(), 30);

            //延迟4秒发送,否则苹果收不到消息

              System.Timers.Timer timer = new System.Timers.Timer(4000);

              timer.Elapsed += delegate (object sender, System.Timers.ElapsedEventArgs e)

              {

                     timer.Enabled = false;

                     XcxSendTemplateMsg xcxSend = new XcxSendTemplateMsg();

                     xcxSend.form_id = fid;

                     xcxSend.page = "pages/GroupTools/UserClient/UserClient";

                     xcxSend.template_id = templateMesEntity.TemplateId;

                     xcxSend.touser = openid;

                     xcxSend.data = xr;

                     XcxSendTemplateMsg(xcxSend);

              };

              timer.Enabled = true;

           

    }

            /// <summary>

            /// 获取小程序token

            /// </summary>

            /// <returns></returns>

            public static string GetXcxAccessToken()

            {

                var token = "";

                var tw = twCache.GetDataItemList("1001");

                if (tw != null)

                {

                    if (string.IsNullOrEmpty(tw.XcxAccessToken) || (!string.IsNullOrEmpty(tw.XcxAccessToken) && tw.XcxExpires != null && tw.XcxExpires <= DateTime.Now))

                    {

                        //获取新的token,存储到数据库

                        var url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + tw.XcxAppId + "&secret=" + tw.XcxAppSecret + "";

                        var accesstokenstr = HcCrm.Util.HttpMethods.HttpGet(url);

                        var xcxtoken = JsonConvert.DeserializeObject<XcxAccessToken>(accesstokenstr);

                        if (xcxtoken.errcode == 0)

                        {

                            token = xcxtoken.access_token;

                            tw.XcxAccessToken = xcxtoken.access_token;

                            tw.XcxExpires = DateTime.Now.AddSeconds(xcxtoken.expires_in);

                            teamwechatBLL.SaveForm(tw.TeamWcId, tw);

                        }

                    }

                    else

                    {

                        token = tw.XcxAccessToken;

                    }

                }

                return token;

            }

     

            /// <summary>

            /// 发送小程序模板消息

            /// </summary>

            /// <param name="xcxSendTemplateMsg"></param>

            /// <returns></returns>

            public static XcxReturnResult XcxSendTemplateMsg(XcxSendTemplateMsg xcxSendTemplateMsg)

            {

                try

                {

                    var token = GetXcxAccessToken();

                    var url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=" + token;

                    var data = JsonConvert.SerializeObject(xcxSendTemplateMsg);

     

                    var resultstr = HcCrm.Util.HttpMethods.HttpPost(url, data);

    // using Newtonsoft.Json;

                    var result = JsonConvert.DeserializeObject<XcxReturnResult>(resultstr);

                    LogEntity log = new LogEntity();

                    log.ExecuteResultJson = result.errmsg;

                    LogBLL.WriteLog(log);

                    return result;

                }

                catch (Exception ex)

                {

                    LogEntity log = new LogEntity();

                    log.ExecuteResultJson = "XcxSendTemplateMsg Exception:" + ex.Message;

                    LogBLL.WriteLog(log);

                    throw;

                }

     

            }

          /// <summary>

            /// HTTP POST方式请求数据

            /// </summary>

            /// <param name="url">URL.</param>

            /// <param name="param">POST的数据</param>

            /// <returns></returns>

            public static string HttpPost(string url, string param = null)

            {

                HttpWebRequest request;

     

                //如果是发送HTTPS请求 

                if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))

                {

                    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);

                    request = WebRequest.Create(url) as HttpWebRequest;

                    request.ProtocolVersion = HttpVersion.Version10;

                }

                else

                {

                    request = WebRequest.Create(url) as HttpWebRequest;

                }

     

                request.Method = "POST";

                //request.ContentType = "application/x-www-form-urlencoded";

                request.ContentType = "application/x-www-form-urlencoded;charset=unicode";//解决中文乱码问题

                request.Accept = "*/*";

                request.Timeout = 15000;

                request.AllowAutoRedirect = false;

     

     

     

                StreamWriter requestStream = null;

                WebResponse response = null;

                string responseStr = null;

     

                try

                {

                    requestStream = new StreamWriter(request.GetRequestStream());

                    requestStream.Write(param);

                    requestStream.Close();

     

                    response = request.GetResponse();

                    if (response != null)

                    {

                       // StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);

                        StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);//解决中文乱码问题

                        responseStr = reader.ReadToEnd();

                        reader.Close();

                    }

                }

                catch (Exception)

                {

                    throw;

                }

                finally

                {

                    request = null;

                    requestStream = null;

                    response = null;

                }

     

                return responseStr;

            }

        /// <summary>

        /// 小程序token类

        /// </summary>

        public class XcxAccessToken

        {

            public string access_token { get; set; }

            public double expires_in { get; set; }

            public int errcode { get; set; }

            public string errmsg { get; set; }

        }

    public class XcxSendTemplateMsg

        {

            /// <summary>

            /// 接收者(用户)的 openid

            /// </summary>

            public string touser { get; set; }

            /// <summary>

            /// 所需下发的模板消息的id

            /// </summary>

            public string template_id { get; set; }

            /// <summary>

            /// 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。

            /// </summary>

            public string page { get; set; }

            /// <summary>

            /// 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id

            /// </summary>

            public string form_id { get; set; }

            /// <summary>

            /// 模板内容,不填则下发空模板。具体格式请参考示例。

            /// </summary>

            public XcxRequestData data { get; set; }

            /// <summary>

            /// 模板需要放大的关键词,不填则默认无放大

            /// </summary>

            public string emphasis_keyword { get; set; }

     

        }

        public class XcxRequestData

        {

            public XcxRequestDataKeyword keyword1 { get; set; }

            public XcxRequestDataKeyword keyword2 { get; set; }

            public XcxRequestDataKeyword keyword3 { get; set; }

        }

        public class XcxRequestDataKeyword

        {

            public string value { get; set; }

        }

        public class XcxReturnResult

        {

            public int errcode { get; set; }

            public string errmsg { get; set; }

        }

  • 相关阅读:
    Find a way(两个BFS)
    ACM代码模板
    ElasticSearch-集群
    ElasticSearch-倒排索引
    ElasticSearch-IK分词器
    ElasticSearch-数据类型
    ElasticSearch-REST APIS
    cmd命令行中的errorlevel和延迟赋值
    ubuntu 12.04内核升级到3.13.1
    ubuntu 12.04安装TP-LINK TL-WN725N v2
  • 原文地址:https://www.cnblogs.com/randy619/p/11687819.html
Copyright © 2020-2023  润新知