clazz=Class.forName(handler);MessageProcessingHandlerprocessingHandler=(MessageProcessingHandler)clazz.newInstance();//取得消息类型Stringtype=msg.getMsgType();Methodmt=clazz.getMethod(type"TypeMsg",InMessage.class);oms=(OutMessage)mt.invoke(processingHandler,msg);if(oms==null){oms=newTextOutMessage();((TextOutMessage)oms).setContent("系统错误!");}setMsgInfo(oms,msg);}catch(Exceptione){logger.error(e);oms=newTextOutMessage();((TextOutMessage)oms).setContent("系统错误!");try{setMsgInfo(oms,msg);}catch(Exceptione1){logger.error(e);}}//把发送发送对象转换为xml输出xs=XStreamFactory.init(true);xs.alias("xml",oms.getClass());xs.alias("item",Articles.class);Stringxml=xs.toXML(oms);logger.debug("输出消息:["xml"]");response.getWriter().write(xml);}privatevoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{Stringsignature=request.getParameter("signature");//微信加密签名Stringtimestamp=request.getParameter("timestamp");//时间戳Stringnonce=request.getParameter("nonce");//随机数Stringechostr=request.getParameter("echostr");////验证if(Tools.checkSignature(_token,signature,timestamp,nonce)){response.getWriter().write(echostr);}}privatevoidsetMsgInfo(OutMessageoms,InMessagemsg)throwsException{//设置发送信息ClassoutMsg=oms.getClass().getSuperclass();FieldCreateTime=outMsg.getDeclaredField("CreateTime");FieldToUserName=outMsg.getDeclaredField("ToUserName");FieldFromUserName=outMsg.getDeclaredField("FromUserName");ToUserName.setAccessible(true);CreateTime.setAccessible(true);FromUserName.setAccessible(true);CreateTime.set(oms,newDate().getTime());ToUserName.set(oms,msg.getFromUserName());FromUserName.set(oms,msg.getToUserName());}/***启动的时候加载wechat.properties配置可以在过滤器配置wechat.properties路径*/@Overridepublicvoidinit(FilterConfigconfig)throwsServletException{Stringcf=config.getInitParameter("conf");if(cf!=null){conf=cf;}StringclassPath=this.getClass().getResource("/").getPath().replaceAll("%20","");conf=conf.replace("classPath:",classPath);p=newProperties();Filepfile=newFile(conf);if(pfile.exists()){try{p.load(newFileInputStream(pfile));}catch(FileNotFoundExceptione){logger.error("未找到wechat.properties",e);}catch(IOExceptione){logger.error("wechat.properties读取异常",e);}}logger.info("WeChatFilter已经启动!");}}-IMDN开发者社群-imdn.cn"> clazz=Class.forName(handler);MessageProcessingHandlerprocessingHandler=(MessageProcessingHandler)clazz.newInstance();//取得消息类型Stringtype=msg.getMsgType();Methodmt=clazz.getMethod(type"TypeMsg",InMessage.class);oms=(OutMessage)mt.invoke(processingHandler,msg);if(oms==null){oms=newTextOutMessage();((TextOutMessage)oms).setContent("系统错误!");}setMsgInfo(oms,msg);}catch(Exceptione){logger.error(e);oms=newTextOutMessage();((TextOutMessage)oms).setContent("系统错误!");try{setMsgInfo(oms,msg);}catch(Exceptione1){logger.error(e);}}//把发送发送对象转换为xml输出xs=XStreamFactory.init(true);xs.alias("xml",oms.getClass());xs.alias("item",Articles.class);Stringxml=xs.toXML(oms);logger.debug("输出消息:["xml"]");response.getWriter().write(xml);}privatevoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{Stringsignature=request.getParameter("signature");//微信加密签名Stringtimestamp=request.getParameter("timestamp");//时间戳Stringnonce=request.getParameter("nonce");//随机数Stringechostr=request.getParameter("echostr");////验证if(Tools.checkSignature(_token,signature,timestamp,nonce)){response.getWriter().write(echostr);}}privatevoidsetMsgInfo(OutMessageoms,InMessagemsg)throwsException{//设置发送信息ClassoutMsg=oms.getClass().getSuperclass();FieldCreateTime=outMsg.getDeclaredField("CreateTime");FieldToUserName=outMsg.getDeclaredField("ToUserName");FieldFromUserName=outMsg.getDeclaredField("FromUserName");ToUserName.setAccessible(true);CreateTime.setAccessible(true);FromUserName.setAccessible(true);CreateTime.set(oms,newDate().getTime());ToUserName.set(oms,msg.getFromUserName());FromUserName.set(oms,msg.getToUserName());}/***启动的时候加载wechat.properties配置可以在过滤器配置wechat.properties路径*/@Overridepublicvoidinit(FilterConfigconfig)throwsServletException{Stringcf=config.getInitParameter("conf");if(cf!=null){conf=cf;}StringclassPath=this.getClass().getResource("/").getPath().replaceAll("%20","");conf=conf.replace("classPath:",classPath);p=newProperties();Filepfile=newFile(conf);if(pfile.exists()){try{p.load(newFileInputStream(pfile));}catch(FileNotFoundExceptione){logger.error("未找到wechat.properties",e);}catch(IOExceptione){logger.error("wechat.properties读取异常",e);}}logger.info("WeChatFilter已经启动!");}} - IMDN开发者社群-imdn.cn">
登录
首页 » Java » 微信公众平台开发模式(JAVA) SDK/微信app

微信公众平台开发模式(JAVA) SDK/微信app

于 2014-01-21 发布
0 51
下载积分: 1 下载次数: 0

代码说明:

【核心代码】package com.gson;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.Date;import java.util.Properties;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletInputStream;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Logger;import com.gson.bean.Articles;import com.gson.bean.InMessage;import com.gson.bean.OutMessage;import com.gson.bean.TextOutMessage;import com.gson.inf.MessageProcessingHandler;import com.gson.util.Tools;import com.gson.util.XStreamFactory;import com.thoughtworks.xstream.XStream;/** * 请求拦截 * * @author GodSon * */public class WeChatFilter implements Filter { private final Logger logger = Logger.getLogger(WeChatFilter.class); private String _token; private String conf = "classPath:wechat.properties"; private String defaultHandler = "com.gson.inf.DefaultMessageProcessingHandlerImpl"; private Properties p; @Override public void destroy() { logger.info("WeChatFilter已经销毁"); } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; Boolean isGet = request.getMethod().equals("GET"); String path = request.getServletPath(); String pathInfo = path.substring(path.lastIndexOf("/")); if (pathInfo == null) { response.getWriter().write("error"); } else { _token = pathInfo.substring(1); if (isGet) { doGet(request, response); } else { doPost(request, response); } } } private void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setCharacterEncoding("UTF-8"); response.setContentType("text/xml"); OutMessage oms = new OutMessage(); ServletInputStream in = request.getInputStream(); // 转换微信post过来的xml内容 XStream xs = XStreamFactory.init(false); xs.alias("xml", InMessage.class); String xmlMsg = Tools.inputStream2String(in); logger.debug("输入消息:[" xmlMsg "]"); InMessage msg = (InMessage) xs.fromXML(xmlMsg); // 获取自定消息处理器,如果自定义处理器则使用默认处理器。 String handler = p.getProperty("MessageProcessingHandlerImpl"); if (handler == null) handler = defaultHandler; try { // 加载处理器 Class clazz = Class.forName(handler); MessageProcessingHandler processingHandler = (MessageProcessingHandler) clazz.newInstance(); // 取得消息类型 String type = msg.getMsgType(); Method mt = clazz.getMethod(type "TypeMsg", InMessage.class); oms = (OutMessage) mt.invoke(processingHandler, msg); if (oms == null) { oms = new TextOutMessage(); ((TextOutMessage) oms).setContent("系统错误!"); } setMsgInfo(oms,msg); } catch (Exception e) { logger.error(e); oms = new TextOutMessage(); ((TextOutMessage) oms).setContent("系统错误!"); try { setMsgInfo(oms,msg); } catch (Exception e1) { logger.error(e); } } // 把发送发送对象转换为xml输出 xs = XStreamFactory.init(true); xs.alias("xml", oms.getClass()); xs.alias("item", Articles.class); String xml = xs.toXML(oms); logger.debug("输出消息:[" xml "]"); response.getWriter().write(xml); } private void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { String signature = request.getParameter("signature");// 微信加密签名 String timestamp = request.getParameter("timestamp");// 时间戳 String nonce = request.getParameter("nonce");// 随机数 String echostr = request.getParameter("echostr");// // 验证 if (Tools.checkSignature(_token, signature, timestamp, nonce)) { response.getWriter().write(echostr); } } private void setMsgInfo(OutMessage oms,InMessage msg) throws Exception { // 设置发送信息 Class outMsg = oms.getClass().getSuperclass(); Field CreateTime = outMsg.getDeclaredField("CreateTime"); Field ToUserName = outMsg.getDeclaredField("ToUserName"); Field FromUserName = outMsg.getDeclaredField("FromUserName"); ToUserName.setAccessible(true); CreateTime.setAccessible(true); FromUserName.setAccessible(true); CreateTime.set(oms, new Date().getTime()); ToUserName.set(oms, msg.getFromUserName()); FromUserName.set(oms, msg.getToUserName()); } /** * 启动的时候加载wechat.properties配置 可以在过滤器配置wechat.properties路径 */ @Override public void init(FilterConfig config) throws ServletException { String cf = config.getInitParameter("conf"); if (cf != null) { conf = cf; } String classPath = this.getClass().getResource("/").getPath().replaceAll("%20", " "); conf = conf.replace("classPath:", classPath); p = new Properties(); File pfile = new File(conf); if (pfile.exists()) { try { p.load(new FileInputStream(pfile)); } catch (FileNotFoundException e) { logger.error("未找到wechat.properties", e); } catch (IOException e) { logger.error("wechat.properties读取异常", e); } } logger.info("WeChatFilter已经启动!"); }}

下载说明:请别用迅雷下载,失败请重下,重下不扣分!

发表评论

0 个回复

  • android视频录制(支持闪光灯以及前置后置摄像头拍摄) 实例源码下载
    支持闪光灯、前置、后置摄像头拍摄,有预览功能,非常不错
    2015-03-06下载
    积分:1
  • Android实现Windows风格的Dialog 实例源码下载
    Android实现Windows风格的Dialog 实例源码下载
    2014-08-21下载
    积分:1
  • android 预约挂号系统源码,全屏展示 效果实例源码
    android 预约挂号
    2014-08-15下载
    积分:1
  • tab host
    tab host
    2013-06-09下载
    积分:1
  • android 静态壁纸实例源码下载
    一款还不错的静态壁纸代码 核心代码:package com.example.wallpaperchange;import android.os.Bundle;import android.app.Activity;import android.app.AlarmManager;import android.app.PendingIntent;import android.app.Service;import android.content.Intent;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast; public class MainActivity extends Activity { AlarmManager aManager; Button start,stop; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); start = (Button)findViewById(R.id.start); stop = (Button)findViewById(R.id.stop); aManager = (AlarmManager)getSystemService(Service.ALARM_SERVICE); //指定ChangeService组件 Intent intent = new Intent(MainActivity.this,ChangeService.class); //创建PendingIntent对象 final PendingIntent pi = PendingIntent.getService( MainActivity.this, 0, intent, 0); start.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub aManager.setRepeating(AlarmManager.RTC_WAKEUP, 0, 5000, pi); start.setEnabled(false); stop.setEnabled(true); Toast.makeText(MainActivity.this, "壁纸定时更换启动成功", 5000).show(); } }); stop.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub start.setEnabled(true); stop.setEnabled(false); aManager.cancel(pi); } }); } }
    2014-06-03下载
    积分:1
  • android wifi 搜索 连接 创建 等相关实例源码下载
    android wifi 搜索 连接 创建 等相关实例源码下载
    2014-08-27下载
    积分:1
  • 安卓社区android端app源码下载
    安卓社区平台android端app源码下载
    2015-01-30下载
    积分:1
  • android tab切换效果示例源码
    android tab切换效果示例源码
    2014-05-17下载
    积分:1
  • android 视频通话 例子(webrtc)
    服务器端源码 看这里 https://github.com/simplehappy2600/simple-webrtc-video-chat
    2015-07-02下载
    积分:1
  • android百度地图经典实例app源码
    百度地图Android SDK v4.3.1 Sample共有28个Demo,每个Demo的说明如下:-------------------------------------------------------------------------------------一、Demo名称:基本地图功能文件名:  BaseMapDemo.java简介:创建一张百度地图并管理地图的生命周期详述:(1)创建一张最简单的百度地图;(2)管理地图的生命周期,具体请参看代码部分的相关注释;(3)可监听地图加载完成事件;(4)给出示例个性化地图、普通地图动态切换-------------------------------------------------------------------------------------二、Demo名称:MapFragment使用文件名:  MapFragmentDemo.java简介:介绍在Fragment框架下使用地图详述:(1)介绍了如何在Fragment框架下添加一个地图地图控件;-------------------------------------------------------------------------------------三、Demo名称:图层展示功能文件名:  LayersDemo.java简介:展示普通图、卫星图、交通流量图和百度城市热力图详述:(1)选择展示地图的图层为普通图或卫星图;(2)在普通图或卫星图上叠加交通流量图;(3)在普通图或卫星图上叠加百度城市热力图;-------------------------------------------------------------------------------------四、Demo名称:多地图展示文件名:  MultiMapViewDemo.java简介:介绍多MapView的使用详述:(1)在一个界面内,同时建立四个MapView控件;(2)地图Logo位置变更,支持6个位置,多图展示中只展示了4个位置-------------------------------------------------------------------------------------五、Demo名称:地图操作功能文件名:  MapControlDemo.java简介:介绍平移和缩放地图,双指操作地图,监听地图点击事件详述:(1)介绍地图缩放级别、旋转度和俯视度的get和set方法;(2)监听单击和长按地图事件;(3)单击、双击和长按地图获取该点的经纬度坐标;(4)对地图显示内容进行截图,截图保存地址为:/mnt/sdcard/test.png;-------------------------------------------------------------------------------------六、Demo名称:UI控制功能文件名:  UISettingsDemo.java简介:介绍开关手势功能和显示隐藏UI控件详述:(1)地图操作开关:平移、缩放、双击放大、双指操作(旋转度和俯视度);(2)控件显示开关:显示/隐藏缩放按钮;(3)指南针位置控制:显示在地图左上角或者右上角(仅举例),开发者可据实际情况任意改变位置;(4)底图标注开关:控制显示/隐藏底图POI,隐藏POI可得到仅显示道路信息的地图(5)禁用所有手势:控制是否一并禁止所有手势。(6)设置地图setPadding,防止UI遮挡Logo等。-------------------------------------------------------------------------------------七、Demo名称:定位图层展示文件名:  LocationOverlayDemo.java简介:介绍定位图层的基本用法详述:(1)可自定义更换位置图标,精度圈填充及边框颜色;(2)支持定位三态效果显示(普通态、跟随态、罗盘态);(3)百度地图SDK从2.0.0版本起,将定位功能进行了分离,具体使用方法请见定位SDK;(4)定位SDK开发指南详见http://developer.baidu.com/map/geosdk-android.htm;(5)支持开发者自定义精度圈边框和填充区域的颜色。-------------------------------------------------------------------------------------八、Demo名称:自定义绘制功能文件名:  GeometryDemo.java简介:介绍自定义绘制点、线、多边形、圆等几何图形和文字详述:(1)支持绘制凸多边形,如要绘制凹多边形请用三角形进行拼接;(2)支持绘制文字;-------------------------------------------------------------------------------------九、Demo名称:覆盖物功能文件名:  OverlayDemo.java简介:介绍添加覆盖物并响应点击功能和弹出pop功能详述:(1)在popup中添加弹出自定义View的示例;(2)点击周围4个Marker,弹出popup,可更新marker位置和更新marker图标;(3)中间显示的为图片图层,该图层可随地图的移动、缩放等做出相应的操作;(4)支持Maker设置透明度的方法,利用滑动条可以展示maker透明度变化;(5)支持Marker设置动画的能力,包含两种方式:从地上生长和从天上落下-------------------------------------------------------------------------------------十、Demo名称:热力图功能文件名:  HeatMapDemo.java简介绘制自有数据热力图详述:(1)设置热力图颜色;(2)准备数据、生成热力图;(3)删除热力图;-------------------------------------------------------------------------------------十一、Demo名称:地理编码功能文件名:  GeoCodeDemo.java简介:介绍地址信息与坐标之间的相互转换详述:(1)正向地理编码:将地址信息转换为经纬度坐标;(2)反向地理编码:将经纬度坐标转换为地址信息;-------------------------------------------------------------------------------------十二、Demo名称:POI搜索功能文件名:  POISearchDemo.java简介:介绍关键词查询、suggestion查询和查看餐饮类Place详情页功能详述:(1)点击某些关键词查询后的结果(如“餐厅”)可跳转到Place详情页;(2)提供suggestion查询进行联想查询,例如输入“天安门”则会弹出联想查询的列表;-------------------------------------------------------------------------------------十三、Demo名称:路径规划功能文件名:  RoutePlanDemo.java, CustomRouteOverlay.java简介:介绍跨城交通、公交、驾车、步行、骑行五种线路规划方法和自设路线方法详述:(1)驾车查询新增路径点查询功能,具体使用方法详见开发者指南路径规划部分,只需重载接口;(2)自设路线功能演示开发者如何自己设定一条路线,包括如何设定起点、终点、途径站点和路段;(3)自设路线功能同时也介绍如何在两个Activity之间切换的时候管理Mapview的生命周期;(4)可自定义路线的起终点图标;----------------------------------------------------------------------------------十四、Demo名称:行政区域边界数据检索文件名称:DistrictSearchDemo.java简介:介绍如何使用行政区域边界数据检索功能,绘制行政区覆盖物和边框详述:(1)通过输入省、市、区/县的名称,绘制出行政区覆盖物和边框----------------------------------------------------------------------------------十五、Demo名称:公交线路查询功能文件名:  BusLineDemo.java简介:介绍查询公交线路功能(1)点击“开始”按钮可查询公交线路;(2)搜索出公交线路后点击“下一条”按钮可查询该线路的反方向公交线路;-------------------------------------------------------------------------------------十六、Demo名称:短串分享功能文件名:  ShareDemo.java简介:将POI点、反Geo点和公交/驾车/骑行/步行线路规划,生成短链接以分享给好友详述:(1)将POI点、反Geo点和公交/驾车/骑行/步行线路规划,生成短链接串,此链接可通过短信等形式分享给好友;(2)好友在终端设备点击此链接可快速打开Web地图、百度地图客户端进行信息展示;(3)暂时开放了“POI搜索结果分享”、“公交/驾车/骑行/步行线路规划”和“反向地理编码结果分享”;(4)日后会开放更多的功能,欢迎广大开发者使用短串分享功能;-------------------------------------------------------------------------------------十七、Demo名称:离线地图功能文件名:  OfflineDemo.java简介:介绍如何下载和使用离线地图详述:(1)可以搜索、下载、删除、查看离线地图;-------------------------------------------------------------------------------------十八、Demo名称:周边雷达功能--RadarDemo文件名:RadarDemo.java注意:需要把应用的key在官网的雷达注册页面进行相关的注册才能使用!注册网址:http://developer.baidu.com/map/index.php?title=radar简介:介绍如果使用周边雷达功能上传位置、检索周边的人详述:(1)获取位置信息并单次上传服务端;(2)获取位置信息连续上传服务端;(3)检索周边用户的位置;(4)用列表的形式及地图的形式展示周边用户的位置等信息;-------------------------------------------------------------------------------------十九、Demo名称:调启百度地图文件名:  OpenBaiduMap.java简介:介绍如果利用简单接口调用,开启百度地图客户端实现复杂逻辑业务详述:(1)调启百度地图导航(Native);(2)调启百度地图导航(Web);(3)调启百度地图POI周边检索;(4)调启百度地图POI详情检索;(5)调启百度地图步行线路规划;(6)调启百度地图驾车线路规划;(7)调启百度地图公交线路规划;(8)调启百度地图步行导航;(需百度地图App 8.6.6以上版本支持)(9)调启百度地图骑行导航(需百度地图App 8.6.6以上版本支持) (10) 调启百度地图poi点全景展示; (11) 调启百度地图步行AR导航;-------------------------------------------------------------------------------------二十、Demo名称:点收藏功能--FavoriteDemo文件名:FavoriteDemo.java简介:介绍如何创建、管理本地点数据详述:(1)新建本地点收藏;(2)查看已收藏本地点;(3)删除已收藏本地点;-------------------------------------------------------------------------------------二十一、Demo名称:LBS.云检索功能文件名:  CloudSearchDemo.java简介:介绍如何使用LBS.云检索用户自有数据注意:自v2.2.0起,SDK支持LBS云v2版的检索,使用v1版的用户请尽快完成升级或使用较低SDK版本。详述:(1)LBS.云是百度地图针对LBS开发者推出的平台级服务;(2)提供海量位置数据存储、检索、展示一体化解决方案;(3)该服务对开发者免费开放;(4)Demo中放入了测试用ak,开发者若使用自己的数据,请更换为自己的ak;(5)LBS.云检索使用方法请参考开发指南“LBS云服务”部分;(6)详细了解LBS.云,欢迎访问:http://developer.baidu.com/map/lbs-cloud.htm(7)申请ak及管理数据等问题,欢迎访问LBS开放平台官网:http://lbsyun.baidu.com/-------------------------------------------------------------------------------------二十二、Demo名称:OpenGL绘制功能文件名:  OpenGLDemo.java简介:介绍如何使用OpenGL在地图上实现自定义绘制详述:(1)利用OpenGL绘制基本折线;(2)利用OpenGL在地图上进行纹理绘制;-------------------------------------------------------------------------------------二十三、Demo名称:点聚合功能--MakerClusterDemo文件名:  MarkerClusterDemo.java简介:新增点聚合功能,可通过缩小地图层级,将定义范围内的多个标注点,聚合显示成一个标注点详述:(1)支持缩放地图,实现点聚合功能-------------------------------------------------------------------------------------二十四、Demo名称:瓦片图功能--TileOverlayDemo文件名:TileOverlayDemo.java简介:瓦片图层支持开发者添加自有瓦片数据,包括在线下载和本地加载两种方式。详述:(1)在线下载方式(2)本地加载方式(3)将地图类型设置为NONE,不下载地图底图瓦片(4)控制了地图显示范围,仅显示设置范围内的地图-------------------------------------------------------------------------------------二十五、Demo名称:地图由TextureView渲染文件名:TextureMapViewDemo.java使用前提:Android 4.0以上系统,并开启强制GPU渲染简介:新增了TextureMapView类,实现地图由TextureView渲染。解决原MapView基于系统GLSurfaceView导致在TabHost和scrollView中等闪黑屏、白边、压盖等问题。-------------------------------------------------------------------------------------二十六、Demo名称: 室内图--IndoorMapDemo文件名称: IndoorMapDemo.java简介:介绍如何进行室内图展示及室内路线规划详述:    (1)室内图展示,包含打开、关闭室内图方法    (2)室内路线规划(只支持起终点在同一建筑物内),绘制室内规划路线----------------------------------------------------------------------------------二十七、Demo名称: 室内图检索文件名称: IndoorSearchDemo.java简介:介绍在室内图中进行室内poi检索----------------------------------------------------------------------------------二十八、Demo名称: 小车轨迹平滑移动文件名称: TrackShowDemo.java简介:介绍小车轨迹平滑移动的实现----------------------------------------------------------------------------------
    2019-03-12下载
    积分:1
  • 696524资源总数
  • 103938会员总数
  • 55今日下载