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