2017-11-10 09:05:47 towtotow 阅读数 1350
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

    3680 人正在学习 去看看 秦子恒

用微信公众号做营销互动,

都会用到一个功能,

让用户在公众号后台回复一个关键词,

然后会自动推送对应的内容给用户。


微信开发消息推送


这个功能在微信开发中,

我们叫它消息管理。


用户除了使用关键词回复之外,

还可以回复图片,用户地理位置,小视频等等。


从这一节课程开始,

子恒老师将跟你分享微信开发中的消息管理,

学完后,你将很容易实现上面说的功能…

微信开发推送消息案例视频教程在线观看

http://edu.csdn.net/course/detail/2946/48500

2017-08-24 20:14:34 kisscatforever 阅读数 1417
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

    3680 人正在学习 去看看 秦子恒

一、前言

      在上一篇博客中,小编简单向大家介绍了微信的各个模块。相信大家也会宏观的了解了一点,不过要想真正的熟悉微信,还是应该动手敲一些项目,下面小编就向大家介绍一下微信公众平台中的——微信消息推送。

二、项目说明

      小编的这个项目需求是与考试相关的。项目需求学生可以在考试之前或者考试之后查询自己的考场情况。然后在考试之前的前一天会在微信定时推送消息到用户。

      俗话说,一张图胜过前言万语:

这里写图片描述

      这里小编就重点给大家分享一下,如何使用微信发送定时消息。

三、代码实战

3.1 技术选型

      小编的项目使用了Quartz+微信群发消息+.Net三层架构+MySQL数据库这些技术点。

3.2 项目宏观图

这里写图片描述

3.3 定时系统搭建

      下载定时系统demo:https://www.quartz-scheduler.net/download.html

      Quartz.Net.Job项目中,包含了两个文件,一个是quartz_jobs.xml文件,这个文件主要配置定时任务job和触发器,另个是任务具体执行的方法DemoJob1:

quartz_jobs.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!-- This file contains job definitions in schema version 2.0 format -->

<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">

  <processing-directives>
    <overwrite-existing-data>true</overwrite-existing-data>
  </processing-directives>

  <schedule>
    <!--定时查询是否有考试信息 Job-->
    <job>
      <name>DemoJob1</name>
      <group>DeomJobGroup</group>
      <description>Quartz.Net任务</description>
      <job-type>Quartz.Net.Job.DemoJob1,Quartz.Net.Job</job-type>
      <durable>true</durable>
      <recover>false</recover>
    </job>



    <!--定时查询是否有考试信息 触发器 每30秒执行一次DemoJob1任务-->
    <trigger>
      <cron>
        <name>DemoJob1Trigger</name>
        <group>DeomJobTriggerGroup</group>
        <job-name>DemoJob1</job-name>
        <job-group>DeomJobGroup</job-group>
        <cron-expression>0 25 21 * * ?</cron-expression>
      </cron>
    </trigger>

  </schedule>
</job-scheduling-data>

      Quartz.Net.Service项目中,包含了App.config、program.cs、PushWechatService.cs、quartz.config

3.4 Windows服务调用Quartz.net 实现消息调度

      借鉴http://blog.csdn.net/lenovouser/article/details/46048199

3.4 定时器执行向微信群发消息

      微信群发消息接口介绍:

      在微信的官方文档中,发送消息-群发接口和原创校验,规定“在公众平台网站上,为订阅号提供了每天一条的群发权限,为服务号提供每月(自然月)4条的群发权限。而对于某些具备开发能力的公众号运营者,可以通过高级群发接口,实现更灵活的群发能力。”

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

      执行的定时发送推送消息任务:

 #region 执行的定时发送推送消息任务-王雷-2017年7月17日21:32:58
        /// <summary>
        /// 执行的定时发送推送消息任务-王雷-2017年7月17日21:32:58
        /// </summary>
        /// <param name="context"></param>
        public void Execute(IJobExecutionContext context)
        {
            _logger.InfoFormat("推送电子准考证成功执行" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));

            //1.获取服务器时间
            string date = publicbll.GetDate();
            //2.获取所有明天有考试的学生的考试信息
            date = Convert.ToDateTime(date).AddDays(1).ToString("yyyy-MM-dd");
            List<StudentWechatViewModel> list = pullwechatBll.QueryStudentWechatInfoByDate(date);

            string access_token = getAccessToken();

            string url = "https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=" + access_token;

            //3.依次遍历执行
            if (list != null)
            {
                for (int i = 0; i < list.Count; i++)
                {
                    if (list[i] != null)
                    {
                        SendWechat(list, i,url);
                    }
                }
            }
        }
        #endregion

      获取accesstoken:

 #region 获取accesstoken-李鑫超-2017年7月19日10:52:41
        /// <summary>
        /// 获取accesstoken-李鑫超-2017年7月19日10:52:41
        /// </summary>
        /// <returns></returns>
        public static string getAccessToken()
        {
            string appid = System.Configuration.ConfigurationManager.AppSettings["appid"];
            string appsecret = System.Configuration.ConfigurationManager.AppSettings["appsecret"];
            string access_token = null;

            string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + appsecret;
            string jsonReturn = "";

            HttpWebRequest httprequest = (HttpWebRequest)WebRequest.Create(url);
            httprequest.Method = "GET";
            HttpWebResponse response = (HttpWebResponse)httprequest.GetResponse();
            using (Stream steam = response.GetResponseStream())
            {
                StreamReader reader = new StreamReader(steam, Encoding.GetEncoding("gb2312"));
                jsonReturn = reader.ReadToEnd();
                steam.Close();
            }

            JObject jo = JObject.Parse(jsonReturn);
            access_token = jo["access_token"].ToString();
            return access_token;

        }
        #endregion

      向微信发送指定推送消息:

  #region 向微信发送指定推送消息-李鑫超-2017年7月17日21:31:52
        /// <summary>
        /// 向微信发送指定推送消息-李鑫超-2017年7月17日21:31:52
        /// </summary>
        /// <param name="list">考试消息泛型</param>
        /// <param name="i"></param>
        private static void SendWechat(List<StudentWechatViewModel> list, int i, string url)
        {
            //string postText = "{\"touser\":[\"ozxdo1oRTknxNiem6MDdRh0_4nR8\",\"ozxdo1p4TEfA2xVXE-IGj8Mt0b-0\"],\"msgtype\": \"text\",\"text\": { \"content\": \"您明天有考试呦~\\n请提前准备纸笔和学生证\\n\\n\\n考试信息详情可点击下方\n【查询考试】" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "\"}}";

            string postText = "{\"touser\":[\"" + list[i].WeChatId + "\",\"\"],\"msgtype\": \"text\",\"text\": { \"content\": \"【 考试提醒 】\\n\\n\\n" + list[i].StudentName + "同学,你好!\\n明天有考试,请做好准备\\n\\n考试科目:" + list[i].ExamName + "\\n考试日期:" + list[i].Date + "\\n考试时间:" + list[i].StartTime + " - " + list[i].EndTime + "\\n考试地点:" + list[i].ExamPlace + "-" + list[i].SeatNo + "号\\n\\n" + "请提前准备好文具和证件\\n详细情况可点击“查考场”进行查询\\n\\n" + "祝您考试顺利~~\\n\\n\\n" + "-------------------------------\\n" + "大米时代 · 技术支持\\n" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "\\n\\n▄▆█ 雷哥搞事情 █▆▄\"}}";
            Encoding encoding = Encoding.GetEncoding("utf-8");
            byte[] bytesToPost = encoding.GetBytes(postText);
            string res = Post(url, bytesToPost);

            Console.WriteLine(res);
        }
        #endregion

      通过post方式把数据推送:

#region 通过post方式把数据推送-李鑫超-2017年7月17日17:22:21
        /// <summary>
        /// 通过post方式把数据推送-李鑫超-2017年7月17日17:22:21
        /// </summary>
        /// <param name="url"></param>
        /// <param name="bytesToPost"></param>
        /// <returns></returns>
        private static string Post(string url, byte[] bytesToPost)
        {
            if (String.IsNullOrEmpty(url))
                return "url参数为空值";
            if (bytesToPost == null)
                return "post数据为空值";
            string ResponseString = "";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            System.Net.ServicePointManager.DefaultConnectionLimit = 50;
            request.KeepAlive = false;
            request.Method = "POST";
            request.ContentType = "text/xml";//提交xml   
            request.ContentLength = bytesToPost.Length;
            Stream writer = request.GetRequestStream();
            writer.Write(bytesToPost, 0, bytesToPost.Length);
            HttpWebResponse HttpWebRespon = (HttpWebResponse)request.GetResponse();
            StreamReader myStreamReader = new StreamReader(HttpWebRespon.GetResponseStream(), Encoding.UTF8);
            ResponseString = myStreamReader.ReadToEnd();
            myStreamReader.Close();

            writer.Flush();
            if (writer != null)
            {
                writer.Close();
            }
            if (request != null)
            {
                request.Abort();
            }
            return ResponseString;
        }
        #endregion

      小编效果:

这里写图片描述

四、小结

      代码如人生,自己的代码还是得自己写。

      如果不深刻的理解自己的代码就会感到很蒙。多多总结,就会有收获。

2017-05-12 15:46:54 bao_smart 阅读数 10991
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

    3680 人正在学习 去看看 秦子恒
/**
 * 注册成功,通知模板消息实体类
 */
public class TemplateMessage {
    private String touser; //用户OpenID
    private String template_id; //模板消息ID
    private String url; //URL置空,在发送后,点模板消息进入一个空白页面(ios),或无法点击(android)。
    private String topcolor; //标题颜色
    private Map<String, TemplateData> templateData; //模板详细信息
   //此处省略get/set 方法
   }
/**
 * 模板详细信息 
 */
public class TemplateData {
    private String value;
    private String color;
    public TemplateData(String value,String color){
        this.value = value;
        this.color = color;
    }
    //此处省略get/set 方法
}
/*
*AccessToken 对象
*/
public class AccessToken  implements Serializable{
    //获取到的凭证
    private String accessToken;
    //凭证有效时间,单位:秒
    private int expiresin;    
    //此处省略get/set 方法
}
/**
 * 微信请求 - 信任管理器
 */
public class MyX509TrustManager implements X509TrustManager {
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    }
    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    }
    @Override
    public X509Certificate[] getAcceptedIssuers() {
    //        return new X509Certificate[0];
        return  null;
    }
}
/**
 * 微信枚举
 * /
public class WeiXinEnum {    
     // 缓存类型     
    public enum CACHE_TYPE {
        CACHE_WX_ACCESS_TOKEN,   //模板消息access_token
    }    
    // 模板消息编号
    public enum WX_TEMPLATE_MSG_NUMBER{
        USER_REGISTER_SUCCESS(0,"OPENTM407796225", "注册成功"),
        ORDER_PAYED_SUCCESS(1, "OPENTM207421553","订单支付"),
        ORDER_...;
        private int code;
        private String msgNumber;
        private String label;
        WX_TEMPLATE_MSG_NUMBER(int code, String msgNumber,String label){
            this.code = code;
            this.msgNumber = msgNumber;
            this.label = label;
        }
        public int getCode(){
            return code;
        }
        public String getMsgNumber(){
            return msgNumber;
        }
        public String getLabel(){
            return label;
        }
    }
}
import com.alibaba.fastjson.JSONObject;
import com.qyuedai.crm.weixin.vo.MyX509TrustManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
public class WX_HttpsUtil {
    private static Logger log = LoggerFactory.getLogger(WX_HttpsUtil.class);
    /**
     * 发送https请求
     * @param requestUrl 请求地址
     * @param requestMethod 请求方式(GET、POST)
     * @param outputStr 提交的数据
     * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
     */
    public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
        JSONObject jsonObject = null;
        try {
            // 创建SSLContext对象,并使用我们指定的信任管理器初始化
            TrustManager[] tm = { new MyX509TrustManager() };
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            // 从上述SSLContext对象中得到SSLSocketFactory对象
            SSLSocketFactory ssf = sslContext.getSocketFactory();
            URL url = new URL(requestUrl);
            HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
            conn.setSSLSocketFactory(ssf);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            // 设置请求方式(GET/POST)
            conn.setRequestMethod(requestMethod);
            // 当outputStr不为null时向输出流写数据
            if (null != outputStr) {
                OutputStream outputStream = conn.getOutputStream();
                // 注意编码格式
                outputStream.write(outputStr.getBytes("UTF-8"));
                outputStream.close();
            }
            // 从输入流读取返回内容
            InputStream inputStream = conn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String str = null;
            StringBuffer buffer = new StringBuffer();
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            // 释放资源
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            inputStream = null;
            conn.disconnect();
            jsonObject = JSONObject.parseObject(buffer.toString());
        } catch (ConnectException ce) {
            log.error("连接超时:{}", ce);
        } catch (Exception e) {
            log.error("https请求异常:{}", e);
        }
        return jsonObject;
    }
}
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.qyuedai.common.redis.Redis;
import com.qyuedai.crm.weixin.vo.AccessToken;
import com.qyuedai.crm.weixin.vo.WeiXinEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class WX_TokenUtil {
    private static Logger log = LoggerFactory.getLogger(WX_TokenUtil.class);
   /**
     *  获得微信 AccessToken
     * access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。
     * 开发者需要access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取
     * 的access_token失效。  
     * (此处我是把token存在Redis里面了)   
     */
    public static AccessToken getWXToken() {
        AccessToken access_token = Redis.getInstance().get(WeiXinEnum.CACHE_TYPE.CACHE_WX_ACCESS_TOKEN.name());
        if(access_token == null || access_token.getAccessToken().equals("")){
            String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appId+"&secret="+ appSecret;
            JSONObject jsonObject = WX_HttpsUtil.httpsRequest(tokenUrl, "GET", null);
            if (null != jsonObject) {
                try {
                    access_token = new AccessToken();
                    access_token.setAccessToken(jsonObject.getString("access_token"));
                    access_token.setExpiresin(jsonObject.getInteger("expires_in"));
                } catch (JSONException e) {
                    access_token = null;
                    // 获取token失败
                    log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInteger("errcode"), jsonObject.getString("errmsg"));
                }
            }
            Redis.getInstance().set(WeiXinEnum.CACHE_TYPE.CACHE_WX_ACCESS_TOKEN.name(), access_token,7100);
        }
        return access_token;
    }
}
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class WX_UserUtil {
    private static Logger log = LoggerFactory.getLogger(WX_UserUtil.class);
    /**
     * 根据微信openId 获取用户是否订阅
     * @param openId 微信openId
     * @return 是否订阅该公众号标识
     */
    public static Integer subscribeState(String openId){
        String tmpurl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="+WX_TokenUtil.getWXToken().getAccessToken() +"&openid="+openId;
        JSONObject result = WX_HttpsUtil.httpsRequest(tmpurl, "GET",null);
        JSONObject resultJson = new JSONObject(result);
        log.error("获取用户是否订阅 errcode:{} errmsg:{}", resultJson.getInteger("errcode"), resultJson.getString("errmsg"));
        String errmsg = (String) resultJson.get("errmsg");
        if(errmsg==null){
            //用户是否订阅该公众号标识(0代表此用户没有关注该公众号 1表示关注了该公众号)。
            Integer subscribe = (Integer) resultJson.get("subscribe");
            return subscribe;
        }
        return -1;
    }

}
import com.alibaba.fastjson.JSONObject;
import com.qyuedai.crm.weixin.vo.TemplateData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
public class WX_TemplateMsgUtil {
    private static Logger log = LoggerFactory.getLogger(WX_TemplateMsgUtil.class);

    /**
     * 封装模板详细信息
     * @return
     */
    public static JSONObject packJsonmsg(Map<String, TemplateData> param) {
        JSONObject json = new JSONObject();
        for (Map.Entry<String,TemplateData> entry : param.entrySet()) {
            JSONObject keyJson = new JSONObject();
            TemplateData  dta=  entry.getValue();
            keyJson.put("value",dta.getValue());
            keyJson.put("color", dta.getColor());
            json.put(entry.getKey(), keyJson);
        }
        return json;
    }

    /**
     * 根据模板的编号 新增并获取模板ID
     * @param templateSerialNumber 模板库中模板的 "编号"
     * @return 模板ID
     */
    public static String getWXTemplateMsgId(String templateSerialNumber){
        String tmpurl = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token="+ WX_TokenUtil.getWXToken().getAccessToken();
        JSONObject json = new JSONObject();
        json.put("template_id_short", templateSerialNumber);
        JSONObject result = WX_HttpsUtil.httpsRequest(tmpurl, "POST", json.toString());
        JSONObject resultJson = new JSONObject(result);
        String errmsg = (String) resultJson.get("errmsg");
        log.info("获取模板编号返回信息:" + errmsg);
        if(!"ok".equals(errmsg)){
            return "error";
        }
        String templateId = (String) resultJson.get("template_id");
        return templateId;
    }

    /**
     * 根据模板ID 删除模板消息
     * @param templateId 模板ID
     * @return
     */
    public static String deleteWXTemplateMsgById(String templateId){
        String tmpurl = "https://api.weixin.qq.com/cgi-bin/template/del_private_template?access_token="+ WX_TokenUtil.getWXToken().getAccessToken();
        JSONObject json = new JSONObject();
        json.put("template_id", templateId);
        try{
            JSONObject result = WX_HttpsUtil.httpsRequest(tmpurl, "POST", json.toString());
            JSONObject resultJson = new JSONObject(result);
            log.info("删除"+templateId+"模板消息,返回CODE:"+ resultJson.get("errcode"));
            String errmsg = (String) resultJson.get("errmsg");
            if(!"ok".equals(errmsg)){
                return "error";
            }
        }catch(Exception e){
         e.printStackTrace();
        }
        return "success";
    }


    /**
     * 发送微信消息(模板消息)
     * @param touser 用户 OpenID
     * @param templatId 模板消息ID
     * @param clickurl URL置空,则在发送后,点击模板消息会进入一个空白页面(ios),或无法点击(android)。
     * @param topcolor 标题颜色
     * @param data 详细内容
     * @return
     */
    public static String sendWechatMsgToUser(String touser, String templatId, String clickurl, String topcolor, JSONObject data) {
        String tmpurl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+ WX_TokenUtil.getWXToken().getAccessToken();
        JSONObject json = new JSONObject();
        json.put("touser", touser);
        json.put("template_id", templatId);
        json.put("url", clickurl);
        json.put("topcolor", topcolor);
        json.put("data", data);
        try{
            JSONObject result = WX_HttpsUtil.httpsRequest(tmpurl, "POST", json.toString());
            JSONObject resultJson = new JSONObject(result);
            log.info("发送微信消息返回信息:" + resultJson.get("errcode"));
            String errmsg = (String) resultJson.get("errmsg");
            if(!"ok".equals(errmsg)){  //如果为errmsg为ok,则代表发送成功,公众号推送信息给用户了。
                return "error";
            }
         }catch(Exception e){
            e.printStackTrace();
            return "error";
        }finally {
            if(templatId!=null) {
                //删除新增的 微信模板
                deleteWXTemplateMsgById(templatId);
            }
        }
        return "success";
   }
}
import com.qyuedai.crm.weixin.util.WX_TemplateMsgUtil;
import com.qyuedai.crm.weixin.util.WX_UserUtil;
import com.qyuedai.crm.weixin.vo.TemplateData;
import com.qyuedai.crm.weixin.vo.WeiXinEnum;
import java.util.HashMap;
import java.util.Map;
import static com.qyuedai.crm.weixin.util.WX_TemplateMsgUtil.getWXTemplateMsgId;
import static com.qyuedai.crm.weixin.util.WX_TemplateMsgUtil.packJsonmsg;
public class Test {

    public static void main(String[] args) {
        //新增用户成功 - 推送微信消息
        senMsg("oUBBZwTa7qxb0vP98X8WhAazdvUE");
    }
   static void senMsg(String openId){
        //用户是否订阅该公众号标识 (0代表此用户没有关注该公众号 1表示关注了该公众号)
        Integer  state= WX_UserUtil.subscribeState(openId);
        // 绑定了微信并且关注了服务号的用户 , 注册成功-推送注册短信
        if(state==1){
            Map<String,TemplateData> param = new HashMap<>();
            param.put("first",new TemplateData("恭喜您注册成功!","#696969"));
            param.put("keyword1",new TemplateData("15618551533","#696969"));
            param.put("keyword2",new TemplateData("2017年05月06日","#696969"));
            param.put("remark",new TemplateData("祝投资愉快!","#696969"));
            //注册的微信-模板Id
            String regTempId =  getWXTemplateMsgId(WeiXinEnum.WX_TEMPLATE_MSG_NUMBER.USER_REGISTER_SUCCESS.getMsgNumber());
            //调用发送微信消息给用户的接口
            WX_TemplateMsgUtil.sendWechatMsgToUser(openId,regTempId, "", "#000000", packJsonmsg(param));
        }
    }
}

其他消息模板请参考 微信服务号 - 模板消息-模板库 里面的消息模板。
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183&token=&lang=zh_CN

2019-02-02 10:14:23 h1418792278 阅读数 698
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

    3680 人正在学习 去看看 秦子恒

推送文本类消息:

def __push_to_wechat(self, content):
    """
    文本类消息推送至企业微信
    :return:
    """
    data = {
        "touser": "XXXXXXX",  
        #"toparty": '3',
        # "totag": "TagID1 | TagID2",
        "msgtype": "text",
        "agentid": 1000002,
        "text": {
            "content": content
        },
        "safe": 1
    }
    ''''''
    try:
        curl = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={token}'.format(
            token=self.__get_token())
        res = self.__http_request.post(curl, data)
        self.__check_push_result(res['errcode'])
    except Exception:
        self.__logger.error("消息推送失败,请检查网络连接.")

推送临时图片类消息:

#获取图片的media_id
def get_media_id(self):
    gurl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={}&corpsecret={}".format(self.__corp_id,
                                                                                         self.__corpsecret)
    r = requests.get(gurl)
    dict_result = (r.json())
    Gtoken = dict_result['access_token']
    path = "C:\\Users\\XXX\\Desktop\\screen.png"
    curl = 'https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token={token}&type=image'.format(token=Gtoken)
    files = {'image': open(path, 'rb')}
    r = requests.post(curl, files=files)
    re = json.loads(r.text)
    print(re['media_id'])
    return re['media_id']

# 根据图片ID推送至企业维信
def message_push_media(self):
    """
    图片类消息推送至企业微信
    :return:
    """
    content = self.__get_content()
    data = {
        # "touser": "XXXX",  
        "toparty": '3',
        # "totag": "TagID1 | TagID2",
        "msgtype": "image",
        "agentid": 1000002,
        "image": {
            "media_id": self.get_media_id()
        },
        "safe": 1
    }
    try:
        curl = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={token}'.format(
            token=self.__get_token())
        res = self.__http_request.post(curl, data)
        self.__check_push_result(res['errcode'])
        self.__logger.add_to_message(content)
    except Exception:
        self.__logger.error("消息推送失败,请检查网络连接.")
2019-09-08 22:10:03 sJzao 阅读数 11
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

    3680 人正在学习 去看看 秦子恒
微信服务器向开发者的URL推送消息

根据官方文档描述,当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。

  1. 图片消息内容结构及说明
    在这里插入图片描述
    用户向公众号推消息的处理不必太关心,因为这是由微信服务器来处理的。我们需要关心的是下面要说的开发者如何向用户推送图片消息
被动回复用户图片消息(开发者向微信服务器推送消息)
  1. 推送的数据包结构如下
    在这里插入图片描述
    这里要注意的是:MediaId是通过微信提供的上传素材的方式成功后,返回的媒体id,具体的如何操作,点击这里查看如何操作
  2. 封装消息的实体类结构
    在这里插入图片描述
    因为Image标签里面还有子标签,故而Image字段应该是个自定义的对象,所以在对象转XML的时候也与文本消息有些不同:
    在这里插入图片描述
    日志打印如下:在这里插入图片描述
    关注扫码或搜索【gh_fca4391fa4ed】体验
    在这里插入图片描述在这里插入图片描述
没有更多推荐了,返回首页