云计算开发者社区

用新浪微博连接

一步搞定

查看: 17887|回复: 27

微信大屏幕基本功能实现 [复制链接]

Rank: 1

发表于 2014-5-15 14:48:06 |显示全部楼层
本帖最后由 黑蛤蟆 于 2014-5-15 14:48 编辑

   微信大屏幕,实时显示用户发送的信息,主要参考微信公众平台应用开发:方法、技巧与案例》一书。

效果图:

核心代码:

一、数据库连接

public class MySQLUtil {
    private Connection getConn(HttpServletRequest request){
      Connection conn = null;
      String url = "jdbc:mysql://w.rdc.sae.sina.com.cn:3307/app_ ‘应用名’";
      String username = "‘数据库用户名’";
      String password = "‘数据库密码'";
      
      try {
        // 加载MySQL驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 获取数据库连接
        conn = DriverManager.getConnection(url, username, password);
      } catch (Exception e) {
        e.printStackTrace();
      }
      return conn;
    }
    
    //保存上墙内容
      public static void saveShangQiang(HttpServletRequest request, String openId, String ShangQiangContent) {
        String sql = "insert into ShangQiang(open_id, ShangQiangContent,status,rand_num) values (?, ?,0,rand())";
        MySQLUtil mysqlUtil = new MySQLUtil();
        Connection conn = null;
        try {
            conn = mysqlUtil.getConn(request);
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, openId);
            ps.setString(2, ShangQiangContent);
            
          ps.executeUpdate();
            ps.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
      }
    //保存关注用户的信息    
      public static void saveUserInfo(HttpServletRequest request,String openid, String nickname,int sex, String language,String city, String province,String country, String headimgurl) {
        String sql = "insert into alluser(open_id, nickname,sex,language,city,province,country,headimgurl) values (?,?,?,?,?,?,?,?)";
        MySQLUtil mysqlUtil = new MySQLUtil();
        Connection conn = null;
        try {
            conn = mysqlUtil.getConn(request);
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, openid);
            ps.setString(2, nickname);
            ps.setInt(3, sex);
            ps.setString(4, language);
            ps.setString(5, city);
            ps.setString(6, province);
            ps.setString(7, country);
            ps.setString(8, headimgurl);
                    
            ps.executeUpdate();
          ps.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
            }
        
        }
        
    public static void delUserInfo(HttpServletRequest request,String openid) {
        String sql = "delete from alluser where open_id=?";
        MySQLUtil mysqlUtil = new MySQLUtil();
        Connection conn = null;
        try {
            conn = mysqlUtil.getConn(request);
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, openid);
                      
            ps.executeUpdate();
            ps.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }  
        }
}

二、coreServlet:处理用户发送信息及事件。

public class CoreService {
    /**
    * 处理微信发来的请求
    */
    public static String processRequest(HttpServletRequest request) {
      String respXml = null;
      String respContent = null;
      try {
        Map<String, String> requestMap = MessageUtil.parseXml(request);
        String fromUserName = requestMap.get("FromUserName");      
        String toUserName = requestMap.get("ToUserName");
        String msgType = requestMap.get("MsgType");
        String createTime = requestMap.get("CreateTime");        
        // 事件推送
        if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
            // 事件类型
            String eventType = requestMap.get("Event");
            // 订阅
            if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
              
              //获取openid即fromUserName对应的用户信息。
              String accessToken = CommonUtil.getToken("‘APPID’", "'SECRET’").getAccessToken();
              WeixinUserInfo weixinUserInfo = AdvancedUtil.getUserInfo(accessToken, fromUserName);
              MySQLUtil.saveUserInfo(request, weixinUserInfo.getOpenId(),weixinUserInfo.getNickname(),weixinUserInfo.getSex(),weixinUserInfo.getLanguage(),
                    weixinUserInfo.getCity(),weixinUserInfo.getProvince(),weixinUserInfo.getCountry(),weixinUserInfo.getHeadImgUrl());
              
              TextMessage textMessage = new TextMessage();
              textMessage.setToUserName(fromUserName);
              
              textMessage.setFromUserName(toUserName);
              textMessage.setCreateTime(new Date().getTime());
              textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
              textMessage.setContent("谢谢您的关注,请发送“#恭喜发财#+内容”参与上墙。");
              respXml = MessageUtil.messageToXml(textMessage);
              return respXml;
            }
            // 取消订阅时,删除用户信息
            else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
              MySQLUtil.delUserInfo(request, fromUserName);
            }
        }
        
        // 捕获以#恭喜发财#开头的内容
        
        else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){
            String content=requestMap.get("Content").trim();        
            if (content.startsWith("#恭喜发财#") ){
            String ShangQiangContent = content.replaceAll("#恭喜发财#", "").trim(); 
              MySQLUtil.saveShangQiang(request, fromUserName,ShangQiangContent);
              
            }      
            else {
                // 当用户发其它消息时
            respContent = "请发送“#恭喜发财#+内容”参与上墙。";
              TextMessage textMessage = new TextMessage();
              textMessage.setToUserName(fromUserName);
              textMessage.setFromUserName(toUserName);
              textMessage.setCreateTime(new Date().getTime());
              textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
              textMessage.setContent(respContent);
              respXml = MessageUtil.messageToXml(textMessage);
                // return respXml;
              }                            
            }          
      }
        catch (Exception e) {
        e.printStackTrace();
      }
      return respXml;
    }
}
附件: 你需要登录才可以下载或查看附件。没有帐号?立即注册
一直在模仿,却未从超越。

使用道具 举报

Rank: 1

发表于 2014-5-15 14:48:07 |显示全部楼层
本帖最后由 黑蛤蟆 于 2014-5-15 14:43 编辑

三、jsp代码,结合ajax实现自动刷新

data.jsp代码后台获取数据

<html>
<body >
<%
  String driverClass="com.mysql.jdbc.Driver";
  String url="jdbc:mysql://w.rdc.sae.sina.com.cn:3307/app_应用名";
  String username="用户名";
  String password="密码";
  Class.forName(driverClass);
  Connection conn=DriverManager.getConnection(url, username,password);
  Statement stmt=conn.createStatement();
  ResultSet rs=stmt.executeQuery("SELECT ShangQiang.id, alluser.headimgurl, alluser.nickname, ShangQiang.ShangQiangContent" +
        " FROM ShangQiang, alluser " +
        "WHERE ShangQiang.open_id = alluser.open_id " +
        "ORDER BY ShangQiang.id DESC " +
        "LIMIT 0 , 6");
%>
<table  frame=below rules=rows align="center" width="1200" border="1">
<% while (rs.next()){ %> 
  <tr>    
  <td width ="100" height= "150"><img src=<%=rs.getString(2)%> width="100" height="100"/>
  </td>
  <td width ="200" height= "150"><font color="ForestGreen" size="8"><%out.println(rs.getString(3)+":");%> </font>
  </td>
  <td width ="900" height= "150" style="vertical-align:middle; text-align:center;">
  <font color="SeaGreen" size="10"><%out.println(rs.getString(4));%> </font>
  </td>  
  </tr>  
  <% 
  } %>
  </table>
<%
  rs.close();
  stmt.close();
  conn.close();
%>

</body>
</html>
index.jsp代码,前台展示
<html>
 
 <script type="text/javascript">  
<!--  
var xmlHttp;  
function createXMLHttpRequest(){  
  if(window.ActiveXObject){  
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");  
  }  
  else if(window.XMLHttpRequest){  
    xmlHttp = new XMLHttpRequest();  
  }  
}  
function startshow(){  
  createXMLHttpRequest();  
  var url="data.jsp";  
  xmlHttp.open("GET",url,true);  
  xmlHttp.onreadystatechange = callback;  
  xmlHttp.send(null);
  cache : false;  
}  
function callback(){  
  if(xmlHttp.readyState == 4){  
    if(xmlHttp.status == 200){  
    document.getElementById("showcontent").innerHTML = xmlHttp.responseText;  
    setTimeout("startshow()",1000);  
    }  
  }  
}  
// -->  
</script>  
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" /> 
</head>
  
  <body>  

<input type="button" value="开始上墙" id="go" onclick="startshow()" />  
 <p><font color="red"><span id="showcontent"></span></font></p>  
</body>  
 
</html>

四、XML

 <servlet>
    <servlet-name>coreServlet</servlet-name>
    <servlet-class>
      com.servlet.CoreServlet
    </servlet-class>
  </servlet>

  <!-- /coreServlet用于指定该Servlet的访问路径 -->
  <servlet-mapping>
    <servlet-name>coreServlet</servlet-name>
    <url-pattern>/coreServlet</url-pattern>
  </servlet-mapping>

五、SAE上创建数据库


alluser表,保存关注用户信息

CREATE TABLE alluser(
id int NOT NULL AUTO_INCREMENT PRIMARY KEY ,
open_id varchar( 50 ) NOT NULL ,
nickname varchar( 20 ) NOT NULL ,
sex int( 2 ) ,
language varchar( 10 ) ,
city varchar( 10 ) ,
province varchar( 10 ) ,
country varchar( 10 ) ,
headimgurl varchar( 1000 ) 
)

ShangQiang表:保存用户openid及发送内容,随机数此处可不理会。

CREATE TABLE alluser(
id int NOT NULL AUTO_INCREMENT PRIMARY KEY ,
open_id varchar( 50 ) NOT NULL ,
nickname varchar( 20 ) NOT NULL ,
sex int( 2 ) ,
language varchar( 10 ) ,
city varchar( 10 ) ,
province varchar( 10 ) ,
country varchar( 10 ) ,
headimgurl varchar( 1000 ) 
)

六、项目结构及参考代码



http://download.csdn.net/detail/blacktoad1986/7351043




附件: 你需要登录才可以下载或查看附件。没有帐号?立即注册
一直在模仿,却未从超越。

使用道具 举报

Rank: 1

发表于 2014-5-15 14:49:27 |显示全部楼层
一直在模仿,却未从超越。
一直在模仿,却未从超越。

使用道具 举报

Rank: 3Rank: 3

发表于 2014-5-15 15:43:10 |显示全部楼层
还不错,感谢分享!

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2014-5-15 17:42:21 |显示全部楼层
感谢楼主分享~~

使用道具 举报

Rank: 3Rank: 3

发表于 2014-5-15 18:54:25 |显示全部楼层
感谢分享,有点像人人墙,挺有趣的

使用道具 举报

Rank: 1

发表于 2014-5-16 15:09:36 |显示全部楼层
很好很强大

使用道具 举报

Rank: 1

发表于 2014-5-23 21:11:35 |显示全部楼层
哈哈,,还不错哦,,希望继续完善分享,添加更多功能,同时优化界面。

使用道具 举报

Rank: 1

发表于 2014-5-30 22:13:21 |显示全部楼层
ziyi3201090119 发表于 2014-5-23 21:11
哈哈,,还不错哦,,希望继续完善分享,添加更多功能,同时优化界面。

有空把抽奖也学着做下就更好了
一直在模仿,却未从超越。

使用道具 举报

Rank: 8Rank: 8

发表于 2014-5-31 00:37:42 |显示全部楼层
感谢分享

使用道具 举报

Rank: 1

发表于 2014-6-8 08:41:50 |显示全部楼层
LZ,我在获取用户信息的时候老是出错,请问怎么破啊,有提示500

使用道具 举报

Rank: 3Rank: 3

发表于 2014-6-11 23:57:36 |显示全部楼层
感谢楼主分享,确实可用

使用道具 举报

Rank: 1

发表于 2014-6-21 17:01:44 |显示全部楼层
感谢分享!

使用道具 举报

Rank: 4

发表于 2014-6-22 08:38:40 |显示全部楼层
感谢分享!

使用道具 举报

Rank: 1

发表于 2014-7-1 16:10:03 |显示全部楼层
楼主  data.jsp 多个 import sae上总编译错误  遇到过么?

使用道具 举报

Rank: 1

发表于 2014-7-4 11:08:36 |显示全部楼层
本人作为一个小白 弱弱的问句有没有这个项目的整个源码   我拿你给的资源拼不出来啊  好多包要导入还有其他错误  太乱了。。。

使用道具 举报

Rank: 16Rank: 16Rank: 16Rank: 16

发表于 2014-7-13 15:53:25 |显示全部楼层
感谢分享!

使用道具 举报

Rank: 1

发表于 2014-7-28 13:27:43 |显示全部楼层
不知道怎么用啊

使用道具 举报

Rank: 1

发表于 2014-8-2 07:42:58 |显示全部楼层
wwlweihai 发表于 2014-6-8 08:41
LZ,我在获取用户信息的时候老是出错,请问怎么破啊,有提示500

订阅号只能获取openid吧。服务号才能获取用户的其他信息。

使用道具 举报

Rank: 7Rank: 7Rank: 7

发表于 2014-8-2 08:24:20 |显示全部楼层
显示界面可以再美化些~~~~
IT早报网              我的导航站         FarisLee

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|云计算开发者社区 ( 京ICP证000007-137 )

GMT+8, 2018-4-23 00:25 , Processed in 0.181670 second(s), Total 13, Slave 12 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部