Solo  当前访客:4 登录 注册

喧哗博客-http://blog.xuahua.com

繁华过后的沉寂--技术经验分享
浏览次数: 94,390    文章总数: 91    评论总数: 3
存档:
2016 年 07 月 (13)

微信接口开发系列之八批量获取用户信息 有更新!

1,微信提供了批量获取用户信息以及union_id;

文档请见 https://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.html 



批量获取用户基本信息

开发者可通过该接口来批量获取用户基本信息。最多支持一次拉取100条。

接口调用请求说明

http请求方式: POST
https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=ACCESS_TOKEN
POST数据示例

{
    "user_list": [
        {
            "openid": "otvxTs4dckWG7imySrJd6jSi0CWE", 
            "lang": "zh-CN"
        }, 
        {
            "openid": "otvxTs_JZ6SEiP0imdhpi50fuSZg", 
            "lang": "zh-CN"
        }
    ]
}
参数说明

参数	是否必须	说明
openid	是	用户的标识,对当前公众号唯一
lang	否	国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN
返回说明

正常情况下,微信会返回下述JSON数据包给公众号(示例中为一次性拉取了2个openid的用户基本信息,第一个是已关注的,第二个是未关注的):

{
   "user_info_list": [
       {
           "subscribe": 1, 
           "openid": "otvxTs4dckWG7imySrJd6jSi0CWE", 
           "nickname": "iWithery", 
           "sex": 1, 
           "language": "zh_CN", 
           "city": "Jieyang", 
           "province": "Guangdong", 
           "country": "China", 
           "headimgurl": "http://wx.qlogo.cn/mmopen/xbIQx1GRqdvyqkMMhEaGOX802l1CyqMJNgUzKP8MeAeHFicRDSnZH7FY4XB7p8XHXIf6uJA2SCunTPicGKezDC4saKISzRj3nz/0", 
           "subscribe_time": 1434093047, 
           "unionid": "oR5GjjgEhCMJFyzaVZdrxZ2zRRF4", 
           "remark": "", 
           "groupid": 0
       }, 
       {
           "subscribe": 0, 
           "openid": "otvxTs_JZ6SEiP0imdhpi50fuSZg", 
           "unionid": "oR5GjjjrbqBZbrnPwwmSxFukE41U", 
       }
   ]
}
参数说明

参数	说明
subscribe	用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息,只有openid和UnionID(在该公众号绑定到了微信开放平台账号时才有)。
openid	用户的标识,对当前公众号唯一
nickname	用户的昵称
sex	用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
city	用户所在城市
country	用户所在国家
province	用户所在省份
language	用户的语言,简体中文为zh_CN
headimgurl	用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
subscribe_time	用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
unionid	只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。详见:获取用户个人信息(UnionID机制)
remark	公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注
groupid	用户所在的分组ID
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):

{"errcode":40013,"errmsg":"invalid appid"}

实现代码要点:


//微信批量定义每次最多100条记录,做循环获取。
		    Page page = userService.findAllTMemBind(1, i, 100);
		    while(page!=null && page.getResult()!=null && !page.getResult().isEmpty()){
		    	count = count + page.getResult().size();
		    	
		    	//调用本地的方法,获取之前保存的access_token 此token也称为全局acess_token;区别于网页用户显示授权acess_token
		    	String access_token = loadGZWXtoken();
		    	
		    	//具体拼接方法,并请求微信服务器,返回数据
		    	batchupdate(page.getResult(),access_token);
		    	
		    	//处理完成以后,再次拉取。重复循环
		    	page = userService.findAllTMemBind(1, i++, 100);
		    }
batchupdate 方法实现



private void batchupdate(List<TMemBinduser> userlist,String access_token){
		if(userlist ==null || userlist.isEmpty()) return ;
		
		JSONArray ary  =new JSONArray();
		for(TMemBinduser user:userlist){
			Map<String,String> openids = new HashMap<String,String>();
			openids.put("openid",user.getBindid());
			openids.put("lang","zh-CN");
			ary.add(JSON.toJSON(openids));
		}
		Map<String,Object> ulist = new HashMap<String,Object>();
		ulist.put("user_list",ary);
		String url = PropertiesUtil.getValue("wx.gz.batchget");
		url = url.replaceFirst("ACCESS_TOKEN", access_token);
		String result = Posturl.postRequestJson(url, ulist, "", "");
		//正确返回的
		//{"user_info_list":[{"subscribe":1,"openid":"oPMQVwqVrRlrr6Pdmgxr-P3Zh6aI","nickname":"kingman","sex":1,"language":"zh_CN","city":"Shenzhen","province":"Guangdong","country":"China","headimgurl":"http:\/\/wx.qlogo.cn\/mmopen\/6gxkh8CsLWewtkLGib6vxW6NrkJMgChp8ibAIH8SEBEKHYeADeibuDAAv8G5EibjvXAYbjQBwedoJD5lrVKSsic25Qx4smSxRQSqib\/0","subscribe_time":1458718222,"unionid":"oIzlcwLjHriVyXG9KsqJ6i7ggbjg","remark":"","groupid":0,"tagid_list":[]},{"subscribe":1,"openid":"oPMQVwlPuNN0Dztus7oGi2UeFv14","nickname":"Bdb","sex":0,"language":"zh_CN","city":"","province":"","country":"","headimgurl":"http:\/\/wx.qlogo.cn\/mmopen\/Q3auHgzwzM7VtmYVicjQhxcLJGkefRWz6HJN4PNmYibyKicB231FgOwj8dlxQTcDXAbIGN2a1SOgDy4ROJwaHXOzQ\/0","subscribe_time":1459932319,"unionid":"oIzlcwGRoh8JDn8rP3AXvSjSGOy4","remark":"","groupid":0,"tagid_list":[]}]}
		if(log.isInfoEnabled()){
			log.debug("==微信通知-批量拉取用户id==="+result);
		}
	}



spring实战汇总

1,
    spring实战系列一MAVEN工程建立
2,
    spring实战之二maven文件配置


3,

    spring实战之三web配置

4,



    spring实战之四run



完整工程源码下载

如果你也需要jar包,此处也有lib打包下载



spring实战之四run 有更新!

前面讲了这么多,到了最关键的时候了,让他跑起来吧。

1,生成文件路径,java ,source,webapp各目录下的文件。




文件目录路径必须与applicationContext.xml ,spring-webmvc.xml中配置的一致。



至此,已经编译成功。可以在工程target目录下的 把war复制到运行容器中即可运行。

效果图如下

spring实战之三web配置 有更新!

1,除了需要配置pom.xml需要引用的jar包以外,还需要配置其他的配置文件;如web.xml,spring-mvc.xml,applicationContext.xml等。

现在一一详细解说

web.xml



<!-- spring初始化时,容器调用监听 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
 <!--  spring初始化时,引用文件工程目录下所有以applicationContext_开头的.xml,包括jar包中也会搜索进来。
    	classpath:applicationContext.xml 仅指工程classes目录下的applicationContext.xml;
    	classpath:applicationContext_*.xml 仅指工程classes目录下的applicationContext_开头的.xml文件;
    	classpath*:applicationContext_.xml 指工程classes目录下包括lib包中,包含有application_开头的.xml文件。	
    	 文件以及全局参数,此处默认了一个参数product来控制是否使用生产联接串或开发联接串-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:applicationContext.xml
        </param-value>
    </context-param>
    <context-param>
        <param-name>spring.profiles.default</param-name>
        <param-value>product</param-value>
    </context-param>
  <!-- 不多说了,编码过滤器 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter </filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
 <!-- spring mvc的初始化,文件为classes目录下的 spring-webmvc.xml web请求处理参数,以及 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-webmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
  <!--MySQL数据库JNDI数据  可在程序手动lookup 到数据源-->
    <resource-ref>
       <description>xuahua</description>
       <res-ref-name>jdbc/xuahua</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
       <res-auth>Container</res-auth>
   </resource-ref>
 <!-- druid web监控使用,如果不需要监控,可不用 -->
   <servlet>  
        <servlet-name>DruidStatView</servlet-name>  
        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>  
    </servlet>    
    <servlet-mapping>  
        <servlet-name>DruidStatView</servlet-name>  
        <url-pattern>/druid/*</url-pattern>  
    </servlet-mapping> 
        
以上为一般工程所需要的基本文件.


其中文件提到了  applicationContext.xml  spring-webmvc.xml

applicationContext.xml 内容如下

<!-- 加载属性文件,如果没有,可不使用 -->
	<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location">
			<value>classpath:parameter.properties</value>
		</property>
	</bean>


<!-- Hibernate 联接配置 -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		
		<!-- 指定数据源 -->
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		
		<!-- 指定实体映射文件 -->
		<property name="packagesToScan">
			<list>
				<value>com.xuahua.model</value>
			</list>
		</property>
		
		<!-- 属性文件 -->
		<property name="hibernateProperties">
			<value>
				hibernate.dialect=org.hibernate.dialect.MySQLDialect
				hibernate.show_sql=true
				hibernate.format_sql=true
				hibernate.cache.use_second_level_cache=false
				hibernate.use_sql_comments=false
				hibernate.jdbc.batch_size=30
				hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
			</value>
		</property>
	</bean>
 <!-- hibernate事务管理 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
<!-- 事务切入点 -->
	<aop:config>
		<aop:pointcut id="crudMethodsCoreMaster"
			expression="execution(* com.xuahua.service..*.*(..))" />
		<aop:advisor advice-ref="txAdviceCoreMaster" pointcut-ref="crudMethodsCoreMaster" />
	</aop:config>
	
<!-- hibernate 代理事务,定义哪些service 开头的应该需要事务。哪些只需要只读事务 -->
	<tx:advice id="txAdviceCoreMaster" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="mng*" propagation="REQUIRED" rollback-for="Exception" />
			<tx:method name="create*" propagation="REQUIRED"
				rollback-for="Exception" />
			<tx:method name="save*" propagation="REQUIRED"
				rollback-for="Exception" />
			<tx:method name="update*" propagation="REQUIRED"
				rollback-for="Exception" />
			<tx:method name="insert*" propagation="REQUIRED"
				rollback-for="Exception" />
			<tx:method name="delete*" propagation="REQUIRED"
				rollback-for="Exception" />
			<tx:method name="do*" propagation="REQUIRED" rollback-for="Exception" />
			<tx:method name="load*" read-only="true" />
			<tx:method name="get*" read-only="true" />
			<tx:method name="list*" read-only="true" />
			<tx:method name="find*" read-only="true" />
			<tx:method name="view*" read-only="true" />
			<tx:method name="show*" read-only="true" />
			<tx:method name="valid*" read-only="true" />
			<tx:method name="query*" read-only="true" />
		</tx:attributes>
	</tx:advice>

		<!-- 生产数据源(JNDI)(生产环境、UAT环境、测试环境用) -->
	<beans profile="product">
		<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
			<property name="jndiName">
				<value>${jndiName}</value>
			</property>
		</bean>
	</beans>
<!-- druid web监控使用。 -->
	<beans>
		<bean id="druid-stat-interceptor"
			class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
		</bean>
	
	
		<bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
			scope="prototype">
			<property name="patterns">
				<list>
					<value>com.xuahua.service.*</value>
				</list>
			</property>
		</bean>
	
		<aop:config>
			<aop:advisor advice-ref="druid-stat-interceptor"
				pointcut-ref="druid-stat-pointcut" />
		</aop:config>
 	</beans>


spring-mvc.xml文件内容如下

<!-- 定义自动代理 -->
	<aop:aspectj-autoproxy proxy-target-class="true" />
	
	<!-- spring 定义扫描的包,对应工程路径.com.xuahua.controller;dao;service,意味着这三个包下面的所有类,spring会把注解的类名,方法名都会扫描进来 -->
	<context:component-scan base-package="com.xuahua">
		<context:include-filter type="regex"
			expression=".controller..*" />
		<context:include-filter type="regex"
			expression=".dao..*" />
		<context:include-filter type="regex"
			expression=".service..*" />
	</context:component-scan>
    
	<!-- 启动注解的方式 -->
	<context:annotation-config />  
	
 <!-- spring mvc 请求映射处理默认-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
    
    <!-- spring mvc Adapter 请求适配 转换json使用-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <!-- 处理JSON数据转换的-->
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/html;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
    </bean>

	<!-- 使用默认的Servlet来响应静态文件-->
	<mvc:default-servlet-handler />
<!-- 视图解释类,定义文件路径,以及文件后缀。 -->
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/" />
		<property name="suffix" value=".jsp" />
	</bean>
	<!-- 上传文件支持 -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

完整文件下载地址  web.xml http://file.xuahua.com/images/blog/2016/0728/web.xml

                          applicationContext.xml  http://file.xuahua.com/images/blog/2016/0728/applicationContext.xml

                         spring-webmvc.xml   http://file.xuahua.com/images/blog/2016/0728/spring-webmvc.xml


spring实战之二maven文件配置

1,建立工程以后,就可以先运行pom.xml可以看到成功,并产生一个空的war包。 如何建工程?请见 spring实战之一maven工程建立

2, 打开编辑pom.xml

在根节点project下,dependencies 节点前添加以下内容

<modelVersion>4.0.0</modelVersion>
  <groupId>blog</groupId>
  <artifactId>com.xuahua</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>com.xuahua Maven Webapp</name>
  <url>http://maven.apache.org</url>
  
  <!-- 定义本pom.xml引用版本属性, org.springframework-version,org.hibernate-version,project.build.sourceEncodeing 此名可随便取,必须与下面引用相匹配。 -->
  <properties>
		<org.springframework-version>4.0.0.RELEASE</org.springframework-version>
		<org.hibernate-version>4.3.1.Final</org.hibernate-version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>
dependencies 节点内,可添加相关联的包

<!-- 下面是springframwork 4.xx 引用的包 -->
    <!-- spring 4 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
   	 <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

Apache Commons 基础组件


<dependency>
			<groupId>commons-lang</groupId>
			<artifactId>commons-lang</artifactId>
			<version>2.6</version>
		</dependency>
		<dependency>
			<groupId>commons-collections</groupId>
			<artifactId>commons-collections</artifactId>
			<version>3.2.1</version>
		</dependency>
		<dependency>
			<groupId>commons-beanutils</groupId>
			<artifactId>commons-beanutils</artifactId>
			<version>1.8.3</version>
		</dependency>

		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3</version>
		</dependency>
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.8</version>
		</dependency>
		<dependency>
			<groupId>commons-configuration</groupId>
			<artifactId>commons-configuration</artifactId>
			<version>1.10</version>
		</dependency>
		
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>4.3.6</version>
		</dependency>
返回json串时,使用到的处理相关包 Jackson 

<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
			<version>2.5.1</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>2.5.1</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.5.1</version>
		</dependency>
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
			<version>1.9.13</version>
		</dependency>
slf4j 日志文件框架使用的jar包

<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.2</version>
		</dependency>
mysql driver 数据库驱动包

	<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.15</version>
		</dependency>
 数据库联接池使用的

<!-- c3p0 datasource  数据库联接池使用的,此处是c3p0-->
		<dependency>
			<groupId>c3p0</groupId>
			<artifactId>c3p0</artifactId>
			<version>0.9.1.2</version>
		</dependency>
		<!-- druid 联接池,同时也提供内部默认的监控,个人推荐 -->
		 <dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.23</version>
		</dependency>
		<!-- dbcp使用的默认联接池  配合 commons-pool 使用-->
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>
		<dependency>
			<groupId>commons-pool</groupId>
			<artifactId>commons-pool</artifactId>
			<version>1.5.4</version>
		</dependency>
		
		
		<!-- 中间件 ibatis -->
		<dependency>
			<groupId>org.apache.ibatis</groupId>
			<artifactId>ibatis-core</artifactId>
			<version>3.0</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.3</version>
		</dependency>
 hiberante 4

<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>${org.hibernate-version}</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>${org.hibernate-version}</version>
		</dependency>
		<dependency>
			<groupId>org.javassist</groupId>
			<artifactId>javassist</artifactId>
			<version>3.18.1-GA</version>
		</dependency>
		<!-- http-client -->
		<dependency>
			<groupId>commons-httpclient</groupId>
			<artifactId>commons-httpclient</artifactId>
			<version>3.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpcore</artifactId>
			<version>4.3.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpmime</artifactId>
			<version>4.3.3</version>
		</dependency>
		
其他可以用到的

<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>1.7.4</version>
		</dependency>

		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.7.4</version>
		</dependency>
		<!-- json-lib -->
		<dependency>
			<groupId>net.sf.json-lib</groupId>
			<artifactId>json-lib</artifactId>
			<version>2.4</version>
			<classifier>jdk15</classifier>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.7</version>
		</dependency>
		<!-- memcached -->
		<dependency>
			<groupId>com.whalin</groupId>
			<artifactId>Memcached-Java-Client</artifactId>
			<version>3.0.2</version>
		</dependency>
		<dependency>
			<groupId>com.google.code.maven-play-plugin.spy</groupId>
			<artifactId>spymemcached</artifactId>
			<version>2.6</version>
		</dependency>
		
		<!-- servlet3 -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.0.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.3</version>
			<scope>provided</scope>
		</dependency>

完整的文件可以下载地址 http://file.xuahua.com/images/blog/2016/0728/pom.xml

spring实战系列一MAVEN工程建立 有更新!

1,前提,maven工程需要的nexus 另外自己搭建;

2,eclipse开发工具流程


2.1 选择maven project

maven-喧哗博客


 指定工程目录


maven-喧哗博客

 建立maven工程对应配置

maven-喧哗博客

maven pom.xml文件指定的groupid


点 Fisnish 。至此 maven工程已经建立起来了。。如果需要运行,请见spring实战系列二配置

微信开发系列 有更新!

1,配置 

               http://blog.xuahua.com/articles/2016/06/30/1467251027592.html

2,授权 

        http://blog.xuahua.com/articles/2016/06/30/1467254772371.html

3,获取用户信息 

        http://blog.xuahua.com/articles/2016/06/30/1467255584587.html

4,模版消息 

         http://blog.xuahua.com/articles/2016/06/30/1467256108292.html

5,微信支付服务器接收通知 

        http://blog.xuahua.com/articles/2016/06/30/1467256973822.html

6,移动应用获取微信用户信息 

        http://blog.xuahua.com/articles/2016/07/13/1468397068875.html

7,微信开放平台支付加密java类 

        http://blog.xuahua.com/articles/2016/07/13/1468399623674.html

8, 微信批量获取用户信息 

    http://blog.xuahua.com/articles/2016/07/30/1469860455915.html

j2ee开发之druid联接池配置,监控 有更新!

数据库联接池有很多种,除了c3p0,dbcp,还有druid,而且现在用的也比较火。

今天把配置过程记录下来。

1,pom.xml 配置

  <dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.23</version>
</dependency>


2,jndi配置

  jndi配置-喧哗博客


3,web.xml 配置


 <servlet>  
        <servlet-name>DruidStatView</servlet-name>  
        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>  
    </servlet>    
    <servlet-mapping>  
        <servlet-name>DruidStatView</servlet-name>  
        <url-pattern>/druid/*</url-pattern>  
    </servlet-mapping> 
4,启动服务,在浏览器输入 http://localhost:8080/druid/index.html 就会展示默认的html页面


druid监控-喧哗博客


如果还需要使用Web应用、URI监控、Session监控、Spring监控等则还需要继续增加配置。

5、Wen应用配置

WebStatFilter用于采集web-jdbc关联监控的数据

在Web.xml中增加配置,就可以使用Web应用、URI监控、Session监控等功能

 <filter>
    <filter-name>DruidWebStatFilter</filter-name>
    <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
    <init-param>
        <param-name>exclusions</param-name>
        <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/console/*</param-value>
    </init-param>
    <init-param>
    	<param-name>profileEnable</param-name>
    	<param-value>true</param-value>
	</init-param>
	<init-param>
        <param-name>principalCookieName</param-name>
        <param-value>USER_COOKIE</param-value>
    </init-param>
    <init-param>
        <param-name>principalSessionName</param-name>
        <param-value>USER_SESSION</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>DruidWebStatFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

6,spring配置
<bean id="druid-stat-interceptor"
		class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
	</bean>
	<bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
		scope="prototype">
		<property name="patterns">
			<list>
				<value>com.bdbvip.*.service.*</value>
				<value>com.bdbvip.*.dao.*</value>
			</list>
		</property>
	</bean>

	<aop:config proxy-target-class="true">
		<aop:advisor advice-ref="druid-stat-interceptor"
			pointcut-ref="druid-stat-pointcut" />
	</aop:config>

至此已经全部配置完毕。


spring3定时任务之定时任务管理(一) 有更新!

在web互联网时代,定时任务随处可见,做一个定时任务管理界面,由后端操作人员来控制可省不少事情,而且时间可动态变更。也可由开发人员根据业务需求手动动态变更时间。

现在提供一个简单的可用的定时任务管理。

定时任务把任务保存在数据库,也可保存在文件中。下面的例子为保存在服务器文件。

准备工作

1.定义定时任务--包括定时任务名称以及对应的执行方法类;此类任务保存在 taskClass.properties文件中。

2,定义定时任务运行的业务,包括定时任务名称,定时任务的分组,定时任务执行频率,开始执行时间;此类任务定义保存在task.properties文件中。

3,后端的管理操作界面有展示有定时任务名称,执行方法,定时任务操作有(增加,删除,修改,暂停)。

样例图片--喧哗-blog.xuahua.com

关键执行代码:


 @RequestMapping("/taskindex.shtml")
    public String index(Model model){
        try{
            Map<String,String > map= TaskClassPropertiesUtil.getTaskClass();
            model.addAttribute("selectClass",map);

        }catch (Exception e){

        }
        return "admin/task/taskindex";
    }
jsp  下载页面 http://file.xuahua.com/js/blog/taskindex.jsp


js  下载页面   http://file.xuahua.com/js/blog/taskindex.js


TaskClassPropertiesUtil类文件,关键代码


public static String pathUrl=TaskClassPropertiesUtil.class.getResource("/").getPath()+"taskClass.properties";
    public static Map<String ,String> getTaskClass() throws Exception {
        Map<String ,String> map=new HashMap<String ,String>();
            Properties properties =new Properties();
            InputStream in=new FileInputStream(pathUrl);
            BufferedReader bf = new BufferedReader(new  InputStreamReader(in));
            properties.load(bf);
            in.close();
            Enumeration enu=properties.keys();
            while(enu.hasMoreElements()){
                String key=enu.nextElement().toString();
                String value=properties.getProperty(key);
                map.put(key,value);
        
            }
           return  map;
    }

 taskClass.properties 示例下载 http://file.xuahua.com/blog/taskClass.properties

 后续的如何操作定时任务以及动态变更定时任务请见定时任务管理(二)


微信接口开发系列之七微信开放平台支付加密java类 有更新!

如题。微信开放平台支付加密类代码如下


// 微信支付 md5认证
	public static  String getMd5WeixinToPay(String str) {
		MessageDigest md;
		try {
			md = MessageDigest.getInstance("MD5");
			md.reset();
			md.update(str.getBytes("UTF-8"));
			return  byteToStr(md.digest()).toUpperCase();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}
/**
	* 将字节数组转换为十六进制字符串
	* 
	* @param byteArray
	* @return
	*/
	public static String byteToStr(byte[] byteArray) {
		 String strDigest = "";
		 for (int i = 0; i < byteArray.length; i++) {
			 strDigest += byteToHexStr(byteArray[i]);
		 }
	 return strDigest;
	}
/**
	* 将字节转换为十六进制字符串
	* 
	* @param btyes
	* @return
	*/
	public static String byteToHexStr(byte bytes) {
		 char[] Digit = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
		 char[] tempArr = new char[2];
		 tempArr[0] = Digit[(bytes >>> 4) & 0X0F];
		 tempArr[1] = Digit[bytes & 0X0F];
		 String s = new String(tempArr);
		 return s;
	}
源地址 :http://blog.xuahua.com/articles/2016/07/13/1468399623674.html


微信接口开发系列之六微信开放平台-移动应用获取微信用户信息 有更新!

如题,如果之前已经申请了微信公众号并且通过审核。那么你还需要移动应用,网站以及其他的应用,那么申请一个微信开放平台账号是不二之选。

今天我们要讲的是微信开放平台移动应用获取微信用户信息。此获取方式有别于微信公众号获取。

具体步骤如下:

1,申请微信开放平台账号,并通过资质审核。

2,登录账号  ,点击 “管理中心”--》移动应用--》创建移动应用,提交相关资料等待微信审核通过。

3,此时,移动应用审核通过后,可以添加移动应用相关的开发信息。获取移动应用微信登录代码如下

1)移动应用获取服务器返回的appid,appsecret,通过此参数调用本地微信应用接口,获取微信应用用户临时授权code。

2)根据临时授权code,交互微信服务器取得登录用户access_token,openid,unionid,scope。

3)如果scope不包含有snsapi_userinfo授权说明用户禁止获取微信用户基本信息。如果有,则进入获取用户信息代码

关键代码:

//=================================================================================微信公众平台账号调用代码
	
	private String getGZURLTokenByCode(String code,String appid,String secret){
		String url = PropertiesUtil.getValue("wx.accessTokenCode");
		//https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
		// url = url.replace("CODE", code);
		String result = "";
		try {
			result = Posturl.getRequest(url);
			if (log.isInfoEnabled()) {
				log.info("根据网页授权code,获取openid,网页授权access_token:---------" + result);
			}
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}

//========
Object obj = resultmap.get("access_token");
						if (obj != null) {
							Object scope = resultmap.get("scope");
							Object openid = resultmap.get("openid");
							Object unionid = resultmap.get("unionid");
							result.put("openid", openid == null ? "" : openid);
							result.put("scope", scope == null ? "" : scope);
							result.put("unionid", unionid == null ? "" : unionid);
							if(scope!=null && scope.toString().indexOf("snsapi_userinfo")<0){
								result.put("status", "-1");
								result.put("msg", "用户禁止授权,无snsapi_userinfo权限");
								return result;
							}
							// D:获取微信用户信息
							Map<String,Object> resulttmp = getGZWeiXinUserinfo(obj.toString(), String.valueOf(openid));
							if(resulttmp.get("status") == null){
								result.put("data",JSON.toJSON(resulttmp));
							}else{
								result.putAll(resulttmp);
							}
						}else{
							result.putAll(resultmap);
						}
						return result;


注意:此处有坑,,,很大的坑

微信开放平台移动应用获取微信用户信息请求接口地址为  https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

而微信公众号获取微信用户信息请求接口为 https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

微信公众号需要通过code获取access_token以后,再根据微信基础接口调用的 access_token 去取微信用户信息。
d

数据库-改变字符校验规则

ALTER TABLE `t_mem_notify`
MODIFY COLUMN `openid` varchar(40) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL AFTER `result`;

SVN update cache 有更新!

SVN update cache

当打开这个页面的时候,肯定很烦恼吧,,,每次保存,eclipse 右下角总是会出现 svn update cache。

想要干掉他,请按以下操作

1. 右键  TortiosSVN --> setting  点开

2,选中 Icon Overlays ,右侧  status cache 选择 none 

再想优化下

Exclude Paths 选择所有盘符加入,一行一个;如  c:\

Include Paths 选择源码目录加入 如: d:\source\*

 

 

公告

喧哗博客--繁华过后的沉寂--技术经验分享^-^
Copyright (c) 2009-2019, b3log.org & hacpai.com