2019-04-02 23:06:02 weixin_38361347 阅读数 273
  • 微信公众平台深度开发v2.0第2季——获取微信服务器IP...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    27782 人正在学习 去看看 翟东平

接收服务器推送普通消息

接收普通消息

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

服务器介入获取微信推送消息代码:

    /**
     * 此方法用于微信回复消息
     * @param request
     * @return
     */
    @PostMapping("getToken")
    @ResponseBody
    public String getUserMessage(HttpServletRequest request){
        String responseString = "";
        try {
            //处理消息与事件推送
            Map<String, String> xmlData = RequestParamType.getXmlData(request.getInputStream());
            logger.info(xmlData.toString());//接受到的消息
             responseString = RequestParamType.dealBean2Xml(xmlData);
             logger.info("消息回复ing..." + responseString);
             return responseString;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

解析xml工具类

    /**
     * 解析xml 获取key-value
     * @param inputStream
     * @return
     */
    public static Map<String,String> getXmlData(InputStream inputStream){
        Map<String,String> map =  new HashMap<>();
        //截取xml
        SAXReader reader = new SAXReader();
        try {
            Document document = reader.read(inputStream);
            Element rootElement = document.getRootElement(); //获取根节点
            List<Element>  elements = rootElement.elements(); // h获取所有的节点
            for (Element e: elements) {
                map.put(e.getName(),e.getStringValue());
            }

        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return map;
    }

处理xml消息

    /**
     * 处理文本消息
     */
    public static String dealBean2Xml(Map<String,String> xmlData ){

        //获取 消息类型
        String msgType = xmlData.get("MsgType");
        BaseMsg baseMsg = null;
        switch (msgType){
            //普通文本消息
            case "text":
                baseMsg = dealText(xmlData);
                break;

            //图片消息
            case "image":
                break;

            //语音消息
            case "voice":
                break;

            //视频消息
            case "video":
                break;

            //小视频消息
            case "shortvideo":
                break;

            //地理位置消息
            case "location":
                break;
            //链接消息

            case "link":
                break;

            case "event":
                baseMsg = dealTicket(xmlData);
                break;

            default:
                break;
        }
        //把消息对象处理为xml数据包
        String xml = bean2Xml(baseMsg);
        if(xml!=null){
            return xml;
        }
        return null;
    }

处理文本工具类

    /**
     * 处理文本消息
     * @param xmlData
     * @return TextMsg
     */
    private static BaseMsg dealText(Map<String, String> xmlData) {
        //获取请求聊天信息
        String content = xmlData.get("Content");
        //回复文本消息
        BaseMsg bm = new TextMsg(xmlData,"欢迎访问公众号哟!");
        return bm;
    }

将对象转为xml

    /**
     *  javaBean 转xml
     * @param baseMsg
     * @return  xml
     */
    public static String bean2Xml(BaseMsg baseMsg){

        XStream xStream = new XStream();
        //若没有这句,xml中的根元素会是<包.类名>;或者说:注解根本就没生效,所以的元素名就是类的属性
        xStream.processAnnotations(BaseMsg.class);
        xStream.processAnnotations(ImageMsg.class);
        xStream.processAnnotations(LinkMsg.class);
        xStream.processAnnotations(LocationMsg.class);
        xStream.processAnnotations(SmalleVideoMsg.class);
        xStream.processAnnotations(TextMsg.class);
        xStream.processAnnotations(VideoMsg.class);
        xStream.processAnnotations(VoiceMsg.class);
        xStream.processAnnotations(ScanTicket.class);
        String xml = xStream.toXML(baseMsg);
        return xml;
    }

消息对象实体

消息实体基类

/**
 *  base模板实体类
 */
@XStreamAlias("xml") //设置根节点名
public class BaseMsg {

    //置顶别名首字母大写
    @XStreamAlias("ToUserName")
    private String toUserName;//开发者微信号
    private String FromUserName;//发送方帐号(一个OpenID)
    private String CreateTime;//消息创建时间 (整型)
    private String MsgType;//MsgType 文本类型


    public String getToUserName() {
        return toUserName;
    }

    public void setToUserName(String toUserName) {
        toUserName = toUserName;
    }

    public String getFromUserName() {
        return FromUserName;
    }

    public void setFromUserName(String fromUserName) {
        FromUserName = fromUserName;
    }

    public String getCreateTime() {
        return CreateTime;
    }

    public void setCreateTime(String createTime) {
        CreateTime = createTime;
    }

    public String getMsgType() {
        return MsgType;
    }

    public void setMsgType(String msgType) {
        MsgType = msgType;
    }

    public BaseMsg(){}
    public BaseMsg(Map<String,String> map){
        this.CreateTime=System.currentTimeMillis()/1000+"";
        this.FromUserName=map.get("ToUserName");
        this.toUserName=map.get("FromUserName");
    }

}

消息文本模板实体类

/**
 *  消息文本模板实体类
 */
@XStreamAlias("xml")
public class TextMsg extends BaseMsg {


    private String Content;//文本消息内容

    public String getContent() {
        return Content;
    }

    public void setContent(String content) {
        Content = content;
    }



    public TextMsg(Map<String,String> map, String Content){
        super(map);
        this.Content=Content;
        this.setMsgType("text");
    }

}

maven 依赖

        <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.11.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.53</version>
        </dependency>
2016-10-05 21:09:22 SFNES 阅读数 2942
  • 微信公众平台深度开发v2.0第2季——获取微信服务器IP...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    27782 人正在学习 去看看 翟东平

​在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息。其中,某些事件推送在发生后,是允许开发者回复用户的,某些则不允许,详细说明请见本页末尾的微信推送消息与事件说明。

在用户触发事件后,微信会向开发者页面发送一组xml数据

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>

这个就是关注/取消关注事件后 触发的数据;

参数说明:
参数 	描述
ToUserName 	开发者微信号
FromUserName 	发送方帐号(一个OpenID)
CreateTime 	消息创建时间 (整型)
MsgType 	消息类型,event
Event 	事件类型,subscribe(订阅)、unsubscribe(取消订阅) 

我们要做的是

①判断数据类型

<pre name="code" class="html">if ($msgType=='event'){
                $contentStr = "为关注或取消关注类型";
if($event==''){
//继续判断事件类型
 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType,                                $contentStr);
                echo $resultStr;
     }
} 
最后根据事件类型作出反应.
其余事件类型与此相同,可以自己尝试测试;


2017-04-22 11:47:35 hq0556 阅读数 1660
  • 微信公众平台深度开发v2.0第2季——获取微信服务器IP...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    27782 人正在学习 去看看 翟东平

本例中有些引用的类与方法不做过多介绍,之后会提供完整源码下载,请自行查看。

本篇根据开发者文档-接收事件推送编写。请对照查看,一些传入与返回参数就不过多介绍。地址为:https://mp.weixin.qq.com/wiki/14/f79bdec63116f376113937e173652ba2.html


​在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息。其中,某些事件推送在发生后,是允许开发者回复用户的,某些则不允许

关注/取消关注事件

用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL。方便开发者给用户下发欢迎消息或者做帐号的解绑。

微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次

关于重试的消息排重,推荐使用FromUserName + CreateTime 排重。

假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。

/*
 * 接收事件推送消息
 * http://mp.weixin.qq.com/wiki/2/5baf56ce4947d35003b86a9805634b1e.html
 */
@XmlRootElement
public class MsgBaseEvent {

    @XmlElement(name = "ToUserName")  
    private String ToUserName;      //开发者微信号

    @XmlElement(name = "FromUserName")  
    private String FromUserName;    //发送方帐号(一个OpenID)

    @XmlElement(name = "CreateTime")  
    private long CreateTime;        //消息创建时间 (整型)

    @XmlElement(name = "MsgType")  
    private String MsgType;         //消息类型,event

    @XmlElement(name = "Event")  
    private String Event;           //事件类型
}

扫描带参数二维码事件

用户扫描带场景值二维码时,可能推送以下两种事件:

  • 如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
  • 如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者。
    /*
     * 用户未关注时,进行关注后的事件推送
     * Event    事件类型,subscribe
     * EventKey 事件KEY值,qrscene_为前缀,后面为二维码的参数值
     * 
     * 用户已关注时的事件推送
     * Event    事件类型,SCAN
     * EventKey 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id
     */
    @XmlRootElement
    public class MsgScanCodeEvent extends MsgBaseEvent {
    
        @XmlElement(name = "EventKey")
        private String EventKey;    //事件KEY值,qrscene_为前缀,后面为二维码的参数值 
    
        @XmlElement(name = "Ticket")
        private String Ticket;      //二维码的ticket,可用来换取二维码图片
    
        public String getEventKey() {
            return EventKey;
        }
        public void setEventKey(String eventKey) {
            EventKey = eventKey;
        }
    
        public String getTicket() {
            return Ticket;
        }
        public void setTicket(String ticket) {
            Ticket = ticket;
        }
    
        /*
         * 接收到的文本示例
         * <xml>
         *  <ToUserName><![CDATA[toUser]]></ToUserName>
         *  <FromUserName><![CDATA[FromUser]]></FromUserName>
         *  <CreateTime>123456789</CreateTime>
         *  <MsgType><![CDATA[event]]></MsgType>
         *  <Event><![CDATA[subscribe|SCAN]]></Event>
         *  <EventKey><![CDATA[qrscene_123123|SCENE_VALUE]]></EventKey>
         *  <Ticket><![CDATA[TICKET]]></Ticket>
         * </xml>
         */
        public static MsgScanCodeEvent requestMessage(String xmlStr) throws JAXBException {
            xmlStr = xmlStr.replace("xml", "msgScanCodeEvent");
            JAXBContext context = JAXBContext.newInstance(MsgScanCodeEvent.class);  
            Unmarshaller unmarshaller = context.createUnmarshaller();  
            return (MsgScanCodeEvent)unmarshaller.unmarshal(new StringReader(xmlStr));
        }
    }

上报地理位置事件

用户同意上报地理位置后,每次进入公众号会话时,都会在进入时上报地理位置,或在进入会话后每5秒上报一次地理位置,公众号可以在公众平台网站中修改以上设置。上报地理位置时,微信会将上报地理位置事件推送到开发者填写的URL。

/*
 * Event--->
 * LOCATION
 */
@XmlRootElement
public class MsgLocationEvent extends MsgBaseEvent {

    @XmlElement(name = "Latitude") 
    private float Latitude;     //地理位置纬度

    @XmlElement(name = "Longitude") 
    private float Longitude;    //地理位置经度

    @XmlElement(name = "Precision") 
    private float Precision;    //地理位置精度

    public float getLatitude() {
        return Latitude;
    }
    public void setLatitude(float latitude) {
        Latitude = latitude;
    }

    public float getLongitude() {
        return Longitude;
    }
    public void setLongitude(float longitude) {
        Longitude = longitude;
    }

    public float getPrecision() {
        return Precision;
    }
    public void setPrecision(float precision) {
        Precision = precision;
    }

    /*
     * 接收到的文本示例
     * <xml>
     *   <ToUserName><![CDATA[toUser]]></ToUserName>
     *   <FromUserName><![CDATA[fromUser]]></FromUserName>
     *   <CreateTime>1348831860</CreateTime>
     *   <MsgType><![CDATA[event]]></MsgType>
     *   <Event><![CDATA[LOCATION]]></Event>
     *   <Latitude>23.137466</Latitude>
     *   <Longitude>113.352425</Longitude>
     *   <Precision>119.385040</Precision>
     * </xml>
     */
    public static MsgLocationEvent requestMessage(String xmlStr) throws JAXBException {
        xmlStr = xmlStr.replace("xml", "msgLocationEvent");
        JAXBContext context = JAXBContext.newInstance(MsgLocationEvent.class);  
        Unmarshaller unmarshaller = context.createUnmarshaller();  
        return (MsgLocationEvent)unmarshaller.unmarshal(new StringReader(xmlStr));
    }
}

自定义菜单事件

用户点击自定义菜单后,微信会把点击事件推送给开发者,请注意,点击菜单弹出子菜单,不会产生上报。

点击菜单拉取消息时的事件推送

/*
 * Event--->
 * click:点击菜单拉取消息时的事件推送
 */
@XmlRootElement
public class MenuClickEvent extends MenuBaseEvent {

    /*
     * 接收到的文本示例
     * <xml>
     *  <ToUserName><![CDATA[toUser]]></ToUserName>
     *  <FromUserName><![CDATA[FromUser]]></FromUserName>
     *  <CreateTime>123456789</CreateTime>
     *  <MsgType><![CDATA[event]]></MsgType>
     *  <Event><![CDATA[CLICK]]></Event>
     *  <EventKey><![CDATA[EVENTKEY]]></EventKey>
     * </xml>
     */
    public static MenuClickEvent requestMessage(String xmlStr) throws JAXBException {
        xmlStr = xmlStr.replace("xml", "menuClickEvent");
        JAXBContext context = JAXBContext.newInstance(MenuClickEvent.class);  
        Unmarshaller unmarshaller = context.createUnmarshaller();  
        return (MenuClickEvent)unmarshaller.unmarshal(new StringReader(xmlStr));
    }
}

点击菜单跳转链接时的事件推送

/*
 * Event--->
 * view:点击菜单跳转链接时的事件推送
 */
@XmlRootElement
public class MenuViewEvent extends MenuBaseEvent {

    @XmlElement(name = "MenuId")  
    private String MenuId ;         //指菜单ID,如果是个性化菜单,则可以通过这个字段,知道是哪个规则的菜单被点击了。

    public String getMenuId() {
        return MenuId;
    }
    public void setMenuId(String menuId) {
        MenuId = menuId;
    }

    /*
     * 接收到的文本示例
     * <xml>
     *  <ToUserName><![CDATA[toUser]]></ToUserName>
     *  <FromUserName><![CDATA[FromUser]]></FromUserName>
     *  <CreateTime>123456789</CreateTime>
     *  <MsgType><![CDATA[event]]></MsgType>
     *  <Event><![CDATA[VIEW]]></Event>
     *  <EventKey><![CDATA[www.qq.com]]></EventKey>
     *  <MenuId>MENUID</MenuId>
     * </xml>
     */
    public static MenuViewEvent requestMessage(String xmlStr) throws JAXBException {
        xmlStr = xmlStr.replace("xml", "menuViewEvent");
        JAXBContext context = JAXBContext.newInstance(MenuViewEvent.class);  
        Unmarshaller unmarshaller = context.createUnmarshaller();  
        return (MenuViewEvent)unmarshaller.unmarshal(new StringReader(xmlStr));
    }
}
2017-04-05 20:02:14 sinat_35861727 阅读数 1098
  • 微信公众平台深度开发v2.0第2季——获取微信服务器IP...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    27782 人正在学习 去看看 翟东平

在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息。其中,某些事件推送在发生后,是允许开发者回复用户的,某些则不允许。

//回复事件
private function _doEvent($postObj){
	switch($postObj->Event){
		case 'subscribe':              //关注
			$str = "终于等到你!\n这是启军的测试公众号!\n\n你可以回复'图文','图片','语音','单图文','多图文','音乐'或者直接发送你的地理位置~\n\n你还可以在这里闲聊哦^_^试试吧!";
			$this->_replayText($postObj,$str); 
			break;
		case 'LOCATION':
			{
				$latitude = $postObj->Latitude;   //纬度
				$longitude = $postObj->Longitude;  //经度
				$contentStr = "您的当前所在的\n纬度:{$latitude}\n纬度:{$longitude}\n位置是:{$result->formatted_address}";
				$this->_replayText($postObj,$contentStr);
			}
			break;
		case 'CLICK':              
			switch($postObj->EventKey){
				case 'TODAY_MUSIC':
					$this->_doMusic($postObj); 
					break;
				case 'TALK':
					$this->_doNews($postObj); 
					break;
				default:
					break;
			}
			break;
		default:
			break;
	}
}

当关注和上报地理位置时会触发相应的事件。


2019-01-29 11:50:00 weixin_40205234 阅读数 7698
  • 微信公众平台深度开发v2.0第2季——获取微信服务器IP...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    27782 人正在学习 去看看 翟东平

一般在微信企业号下做软件开发,基本都会用到消息推送,用户在完成一个操作之后,会在企业号中推送一条消息,这条消息可能是文本、图文等不同类型,在具有审批流程的消息推送中,下一级人员审批完成会给上一级推送一条审批消息,后者可以直接点开推送消息进入审批页面,进行审批。下面是消息推送接口代码:

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import net.sf.json.JSONObject;
import net.sf.json.JSONArray;

@Service
public class SendInfoServiceImpl implements SendInfoService {
    @Resource
    private MessageDao messageDao;
    @Resource
    private DetailInfoDao detailInfoDao;

    /**
     * 发送文本卡片消息
     *
     * @param "UserID1|UserID2|UserID3", -> openId
     * @param title                      标题
     * @param url                        审批页面地址
     * @return
     */
    @Override
    public ResultBean<Object> sendTextCardInfo(String openId, String title, String url, String content) {
        ResultBean<Object> result = new ResultBean<Object>();
        JSONObject jSONObject = null;
        String userId = null;
        try {
            //根据url获取userId
            String[] strs = url.split("[\\/]");
            userId = strs[strs.length - 1];
            //查看用户是否打开勿扰模式
            String isOpen = detailInfoDao.getIsOpenByUserId(userId);
            if (!"0".equals(isOpen)) {
                // 调取凭证
                String access_token = QiYeUtil.getAccessToken(Constants.CORPID, Constants.Secret).getToken();
                SimpleDateFormat tempDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String createTime = tempDate.format(new java.util.Date());
                // 新建文本卡片消息
                TextCard textCard = new TextCard();
                textCard.setTitle(title);
                String description = "<div class=\"gray\">" + createTime + "</div><div class=\"highlight\">" + content + "</div>";
                textCard.setDescription(description);
                textCard.setUrl(url);
                textCard.setBtntxt("点击查看:");
                // 文本卡片转json
                String textCardList = JSONObject.fromObject(textCard).toString();
                //生成文本卡片消息的json数据
                String jsonData = SMessage.textcardMsg(openId, Constants.AGENTID + "", textCardList);
                //发送模板消息
                jSONObject = SMessage.sendMsg(access_token, jsonData);
                if (jSONObject != null) {
                    if ("0".equals(jSONObject.getString("errcode"))) {
                        Message message = new Message();
                        message.setId(ApplicationUtils.randomUUID());
                        message.setUserId(userId);
                        message.setTitle(title);
                        message.setUrl(url);
                        message.setCreateTime(createTime);
                        message.setStatus("0");
                        messageDao.insert(message);
                        result.setCode(0);
                        result.setData(jSONObject);
                        result.setMsg("消息发送成功");
                    } else {
                        result.setCode(1);
                        result.setMsg("消息发送失败");
                    }
                }
            } else {
                result.setCode(1);
                result.setData("");
                result.setMsg("消息已屏蔽");
            }
        } catch (Exception e) {
            result.setCode(1);
            result.setMsg("消息发送失败");
        }
        return result;
    }

    /**
     * 发送图文消息
     *
     * @param userId=> openId
     * @param partyId
     * @param tagId
     * @param title    标题
     * @param picUrl   图片地址
     * @param url      审批页面地址
     * @return
     */
    @Override
    public JSONObject sendNewsInfo(String userId, String partyId, String tagId, String title,
                                   String picUrl, String url) {
        // 调取凭证
        String access_token = QiYeUtil.getAccessToken(Constants.CORPID, Constants.Secret).getToken();
        // 新建图文
        Article article = new Article();
        article.setTitle(title);
        String description = "<div class=\"gray\">2016年9月26日</div> <div class=\"normal\">系统审批提醒</div><div class=\"highlight\">请您尽快审批本次申请</div>";
        article.setDescription(description);
        article.setPicUrl(picUrl);
        article.setUrl(url);
        // 整合图文
        List<Article> list = new ArrayList<Article>();
        list.add(article);
        // 图文转json
        String articlesList = JSONArray.fromObject(list).toString();
        //生成news消息的json数据
        String jsonData = SMessage.SNewsMsg(userId, partyId, tagId, Constants.AGENTID + "", articlesList);
        //发送模板消息
        JSONObject jSONObject = SMessage.sendMsg(access_token, jsonData);
        return jSONObject;
    }


}

 

没有更多推荐了,返回首页