微信小程序-發送模板消息


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; }

    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM