mvc spring 微信开发_spring mvc开发微信公用号 - CSDN
  • 说明:URL填写你服务器80端口的URL,比如楼主的是(http://******/weixinTest.jspx),这里还需要与微信握手,以确保次连接有效;  Token数字和英文组成的字符串,最大长度为32字符,比如楼主的是xb1236

    第一步:填写服务器配置

    兵车未动,粮草先行,首先你得有台服务器,80端口未被占用~

    想必这里的api大家都看过的


    说明:URL填写你服务器80端口的URL,比如楼主的是(http://******/weixinTest.jspx),这里还需要与微信握手,以确保次连接有效;

                Token数字和英文组成的字符串,最大长度为32字符,比如楼主的是xb12369;

                EncodingAESKey直接用后面的随机生成,到目前为止还没用用到这个;


    第二步:验证服务器地址的有效性


    刚才也说过,微信会校验你的URL是否有效,那么接下来开始正式握手!!!



    说明:1,字典排序

    ArrayList list = new ArrayList();
    				list.add(token);
    				list.add(timestamp);
    				list.add(nonce);
    
    				Collections.sort(list, new SpellComparator());
    
    
    /**
    	 * 汉字拼音排序比较器
    	 */
    	static class SpellComparator implements Comparator{
    		public int compare(Object o1, Object o2) {
    			try {
    				// 取得比较对象的汉字编码,并将其转换成字符串
    				String s1 = new String(o1.toString().getBytes("GB2312"), "ISO-8859-1");
    				String s2 = new String(o2.toString().getBytes("GB2312"), "ISO-8859-1");
    				// 运用String类的 compareTo()方法对两对象进行比较
    				return s1.compareTo(s2);
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    			return 0;
    		}
    	}


    2,sha1加密,关于这种加密,百度一下到处都是

    //将三个参数字符串拼接成一个字符串进行sha1加密
    				String digest = new SHA1Utils().getDigestOfString(temp.getBytes());


    3,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

    之前就一直卡在这里,没有搞清楚啥叫原样返回,后面终于弄明白了,然来是要printwriter到微信

    if(digest.equalsIgnoreCase(signature)){
    					try{
    						System.out.println("我成功了~~~~");
    						//开发者通过检验signature对请求进行校验(下面有校验方式)。
    						//若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
    
    						PrintWriter out = response.getWriter();
    						out.print(echostr);
    						out.flush();
    						out.close();
    
    						System.out.println("这次你再改成功改了吧~~~");
    					}catch (Exception e) {
    						e.printStackTrace();
    					}
    				}else{
    					System.out.println("sha1加密后:" +digest+ "微信返回的是:"+signature);
    				}

    部分代码如下,仅供参考:



    认证通过后,微信公共平台将会得到一个AppID,AppSecret,有了这两个你就可以往下高更深入的东西了!!!

    展开全文
  • 第一次开发微信版网页,对最重要的获取微信OpenId,特此记录下来

    这里写图片描述
    第一次开发微信版网页,对最重要的获取微信OpenId,特此记录下来

    1.首先得有appid和appsecret
    复制代码

    1 1. public class WeiXin {
    2
    3 public static string appid {
    4 get {
    5 string _appid = “wx3xxxxxxxxxxxxxxx”;
    6 return _appid;
    7 }
    8 }
    9 public static string aseret {
    10 get {
    11 string appsecret = “b6719276d539796d94bxxxxxxxxxxxxxxx”;
    12 return appsecret;
    13 }
    14 }
    15
    16 }

    复制代码

    2.只获取用户的openID,,在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面,以snsapi_base为scope发起的网页授权,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(下面代码中的url参数就是回调页,静态的可以写成:string url = https://wx.baidu.com/controller/GetOpenId,注意URL需要进行HttpUtility.UrlEncode(url)编码,还有回调页的域名需要和微信公众号里面设置的回调域名相同)
    复制代码

    1 public class ApplyVIPController : Controller
    2 {
    3
    4 // GET: /ApplyVIP/
    5
    6 public ActionResult Index(string url)
    7 {
    8 string _url = string.Format(“https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_base&state={2}#wechat_redirect”,
    9 WeiXin.appid,
    10 url,//回调页URL
    11 Guid.NewGuid().ToString(“N”));
    12 return Redirect(_url);//这里微信会自动取出回调页URL,并且跳转到该url所属的页面
    13 }

    复制代码

    3.获取code,并且通过code获取Openid,正确时返回的JSON数据包如下:{ “access_token”:”ACCESS_TOKEN”, “expires_in”:7200, “refresh_token”:”REFRESH_TOKEN”, “openid”:”OPENID”, “scope”:”SCOPE” },这里面就包含了所需要的OPENID
    复制代码

       //controller
    

    public string GetOpenId() {
    string code = requset.querystring[“code”];
    string openid = “”;
    string json = “”;
    string url = string.Format(“https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code “//通过appid,appaseret,code
    , WeiXin.appid, WeiXin.aseret, code);
    HttpQuery.Get(url, null, msg => {
    json = msg;
    });
    JObject job = (JObject)JsonConvert.DeserializeObject(json);
    openid = job[“openid”].ToString();
    return openid;
    }

    复制代码

    4.请求获取Openid的httpquery.get()方法
    复制代码

    public class HttpQuery {
        private static readonly string DefaultUserAgent =
            "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
    
        public static void Get(string url, object data, Action<string> callback) {
            IDictionary<string, string> parameters = Getparameters(data);
    
            if (!(parameters == null || parameters.Count == 0)) {
                url += "?";
                foreach (var item in parameters) {
                    url += item.Key + "=" + item.Value + "&";
                }
            }
            CreateGetHttpResponse(url, null, null, null, callback);
        }
        /// <summary>  
        /// 创建GET方式的HTTP请求  
        /// </summary>  
        /// <param name="url">请求的URL</param>  
        /// <param name="timeout">请求的超时时间</param>  
        /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>  
        /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>  
        /// <returns></returns>  
        private static HttpWebResponse CreateGetHttpResponse(string url, int? timeout, string userAgent,
            CookieCollection cookies, Action<string> callback, string encoding = "utf-8") {
            if (string.IsNullOrEmpty(url)) {
                return null;
                //throw new ArgumentNullException("url");
            }
            try {
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                request.Method = "GET";
                request.UserAgent = DefaultUserAgent;
                if (!string.IsNullOrEmpty(userAgent)) {
                    request.UserAgent = userAgent;
                }
                if (timeout.HasValue) {
                    request.Timeout = timeout.Value;
                }
                if (cookies != null) {
                    request.CookieContainer = new CookieContainer();
                    request.CookieContainer.Add(cookies);
                }
    
                HttpWebResponse httpWebResponse = request.GetResponse() as HttpWebResponse;
    
                StreamReader reader = new StreamReader(httpWebResponse.GetResponseStream(),
                    System.Text.Encoding.GetEncoding(encoding));
    
                string html = "";
                //获取请求到的数据
                html = reader.ReadToEnd();
                //关闭
                httpWebResponse.Close();
                reader.Close();
    
                    callback(html);
                    return httpWebResponse;
                }
            } catch {
                callback(null);
            }
            return null;
        }
    

    }

    展开全文
  • 使用springmvc做的微信公众号开发,初学的可以参考下,
  • 看前须知: 本项目是微信小程序占座系统,功能还没有写完,但是其他问题都解决的七七八八了。微信小程序端的与连接和传输数据及数据使用无关的js代码,wxml代码就省略不写了,只写最核心的代码,...--spring mvc...

    看前须知:
    本项目是微信小程序占座系统,功能还没有写完,但是其他问题都解决的七七八八了。微信小程序端的与连接和传输数据及数据使用无关的js代码,wxml代码就省略不写了,只写最核心的代码,并且项目是基于注解和xml配置的,没有直接使用servlet类,都是封装好的,使用起来更加方便。

    首先,进行导入依赖,导入依赖的时候不要忘记打开网络,否则jar包无法下载

       <!--spring mvc需要导入的依赖-->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
      </dependency>
    
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
      </dependency>
    
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
      </dependency>
    
      <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
      </dependency>
    
      <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.0</version>
        <scope>provided</scope>
      </dependency>
    
    
        <!--spring 需要导入依赖-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>5.0.2.RELEASE</version>
        </dependency>
    
        <dependency>
          <groupId>c3p0</groupId>
          <artifactId>c3p0</artifactId>
          <version>0.9.1.2</version>
        </dependency>
    
        <dependency>
          <groupId>net.sf.json-lib</groupId>
          <artifactId>json-lib</artifactId>
          <version>2.4</version>
          <classifier>jdk15</classifier>
        </dependency>
    
        <dependency>
          <groupId>commons-beanutils</groupId>
          <artifactId>commons-beanutils</artifactId>
          <version>1.7.0</version>
        </dependency>
    
        <dependency>
          <groupId>commons-collections</groupId>
          <artifactId>commons-collections</artifactId>
          <version>3.1</version>
        </dependency>
    
        <dependency>
          <groupId>commons-lang</groupId>
          <artifactId>commons-lang</artifactId>
          <version>2.5</version>
        </dependency>
    
        <dependency>
          <groupId>net.sf.ezmorph</groupId>
          <artifactId>ezmorph</artifactId>
          <version>1.0.3</version>
        </dependency>
    
        <dependency>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
    
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-test</artifactId>
          <version>5.1.6.RELEASE</version>
        </dependency>
    
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
        </dependency>
    
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.2</version>
        </dependency>
    

    当导入完成之后,也就是IDEA下方提示加载完成之后,一定要去(如图所示)中看一看是否导入完成,我因为在添加依赖的时候只看了下面的加载提示,没有看是否导入进去了,结果没有导入进去,换了其他的依赖也导不进去,不知道是项目除了什么问题,建了一个新的项目才导入进去,浪费了好多时间,
    在这里插入图片描述

    接下来,进行springmvc.xml的配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--开启注解扫描,在springmvc容器中只需要扫描Controller即可-->
        <context:component-scan base-package="demo.Controller"></context:component-scan>
    
    <!--
        &lt;!&ndash;配置jsp视图解析器对象,用以跳转到指定对象&ndash;&gt;
        <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/"></property>&lt;!&ndash;指定路径&ndash;&gt;
            <property name="suffix" value=".jsp"></property>&lt;!&ndash;指定后缀名&ndash;&gt;
        </bean>
    -->
        
    
        <!--开启Spring MVC框架注解的支持(解析器,处理器,映射器)-->
        <mvc:annotation-driven />
        <mvc:default-servlet-handler/>
    </beans>
    

    易错点:此处需注意,如果开启Spring MVC框架的支持的时候写成如下样式,则会报500错误,并且控制台会显示很多错误,让人心里很慌

    <mvc:annotation-driven conversion-service="conversionService"/><!--只有将conversion-service="conversionService"/属性去掉才不会报错-->
    

    提示错误为:

    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'conversionService' available
    

    在这里插入图片描述
    补充:

        <mvc:default-servlet-handler/><!--这个配置可以不要-->
    

    关于这个配置的理解
    在我的另一篇博客里

    配置bean.xml(配置Spring)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--告知spring在创建容器时要扫描的包,注解配置-->
        <context:component-scan base-package="demo.Dao"/>
        <context:component-scan base-package="demo.Service"/>
        <context:component-scan base-package="demo.pojo"/>
        <!--配置jdbcTemplate-->
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
    
        <!--配置数据源-->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <!--注入连接数据库的必备信息-->
            <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/seat"></property>
            <property name="user" value="root"></property>
            <property name="password" value="047139"></property>
        </bean>
    </beans>
    

    此处没有什么大问题,只要依赖添加正确就可以使用

    下面进入正题:微信小程序和后台连接并进行数据传输

    Dao层和Server层我就不写了,源代码在我的github仓库里,如果需要可以去clone

    https://github.com/SHUANGYANPI/WxSeatDemo.git

    微信小程序发送请求

    wx.request({
        url: 'http://localhost:8080/studentController/Login',              //自己请求的服务器的地址
        
          data:{                                               		//发送请求时传给后台的数据,用后台处理数据是从wxml页面中获取的
            "uno":that.data.uno,
            "password":that.data.password
            },
            
          method: 'POST',											       //以post形式发送请求
          header: {
            'content-type': 'application/json;charset=UTF-8', // 默认值,用json格式传数据
            'dataType':'json'
          },
          
          success: function (req) {   //请求成功自动执行
            var getdata = req.data;    //获取后台传过来的数据,赋值给一个变量
            that.setData({
             f: getdata            //用f得到getdata的数据,如果要使用f,必须要在data中声明,否则会报错:f未定义,声明如下
            })
           
            if (that.data.f.flag){
              wx.switchTab({
                url: '../person/person'                //跳转页面
              });
            }else{
              wx.showModal({
                title: '提示:',
                content: '学号或密码输入错误!',
              })
            }
          }
        })
    
    //声明需要用到的变量
      data: {
        userNo:'',
        userPwd:'',
        f:''
      },
    

    wxml使用后端返回信息

    <view class="ifm" hover-class='hv'>
    我是获取的数据:{{f.flag}}
        </view>
    

    后台响应数据,并返回数据给前端

       /**
         * 用户登录
         * @param userno
         * @return
         */
        @RequestMapping(value = "/Login",produces="text/html;charset=UTF-8")//登录
        public @ResponseBody String Login(@RequestBody String userno){
        
            JSONObject jsonObject = JSONObject.fromObject(userno);
            String uno = jsonObject.getString("uno");
            String password = jsonObject.getString("password");  //解析前端传来的json数据并获取值的的基本语句,得到后就可以直接使用了
            
            System.out.println(uno);
            if (jsonObject==null||uno.equals("")||password.equals("")){
                return "{\"flag\":\"false\"}";
            }
            Map<String,Object> map = userService.FindUserByNo(uno);
            if (map.get("password").equals(password)){
                return "{\"flag\":\"true\"}";
            }
            else {
                return "{\"flag\":\"false\"}";
            }
        }
    

    易错点:注解@RequestMapping中必须要加上produces="text/html;charset=UTF-8属性,否则前端获取的汉字会乱码!!!!!!!!

    JSONObject类用来解析前端传过来的json数据,只要依赖不添加错,此类都能用,获取数据时,要加@RequestBody注解说明接收类型

    返回json类型数据:用"{“flag”:“true”}"这种形式,以键值对的形式传输,返回类型要响应成String类型@ResponseBody String

    难点基本就这么多了,还有传数组还没有尝试,尝试完再贴出来

    展开全文
  • MVC微信扫码登录.rar

    2020-07-30 23:31:42
    C# .aspnet MVC web 实现微信扫码登录,网站微信扫码登录
  • servicepackage cn.bluemobi.service;import java.util.Arrays;import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import ...

    码农的世界

    期待各位码友在欣赏我的无私创作之时,也请大家多多支持我码农的世界,谢谢各位!

    service

    package cn.bluemobi.service;
    
    import java.util.Arrays;
    
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import cn.bluemobi.entity.weixin.CheckModel;
    import cn.bluemobi.util.sha1;
    
    /**
     * Description: <br/>
     * Date: 2015年7月8日 下午12:05:54 <br/>
     * 
     * @author fang
     * @version
     * @see
     */
    @Service
    public class TokenService {
        /**
         * 微信开发者验证
         * 
         * @param wxAccount
         * 
         * @param signature
         * @param timestamp
         * @param nonce
         * @param echostr
         * @return
         */
        @Transactional
        public String validate(String wxToken, CheckModel tokenModel) {
            String signature = tokenModel.getSignature();
            String timestamp = tokenModel.getTimestamp();
            String nonce = tokenModel.getNonce();
            String echostr = tokenModel.getEchostr();
            if (signature != null && timestamp != null & nonce != null) {
                String[] str = { wxToken, timestamp + "", nonce + "" };
                Arrays.sort(str); // 字典序排序
                String bigStr = str[0] + str[1] + str[2];
                // SHA1加密
                String digest = sha1.encode("SHA1", bigStr).toLowerCase();
                // 确认请求来至微信
                if (digest.equals(signature)) {
                    // 最好此处将echostr存起来,以后每次校验消息来源都需要用到
                    return echostr;
                }
            }
            return "error";
        }
    }
    

    sha1加密类

    package cn.bluemobi.util;
    
    import java.io.InputStream;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    /**
     * 
     * 验证微信响应过来的参数以及拼接成字符串进行sha1加密 <br/>
     * date: 2015年7月7日 下午4:44:51 <br/>
     * 
     * @author fang
     * @version
     */
    public class sha1 {
        // 与接口配置信息中的Token要一致
        private static String token = "2013wh";
    
        /**
         * 验证微信响应过来的参数以及拼接成字符串进行sha1加密
         * 
         * @param signature
         * @param timestamp
         * @param nonce
         * @return
         */
        public static boolean checkSignature(String signature, String timestamp, String nonce) {
            String[] arr = new String[] { token, timestamp, nonce };
            // 将token、timestamp、nonce三个参数进行字典序排序
            Arrays.sort(arr);
            StringBuilder content = new StringBuilder();
            for (int i = 0; i < arr.length; i++) {
                content.append(arr[i]);
            }
            MessageDigest md = null;
            String tmpStr = null;
    
            try {
                md = MessageDigest.getInstance("SHA-1");
                // 将三个参数字符串拼接成一个字符串进行sha1加密
                byte[] digest = md.digest(content.toString().getBytes());
                tmpStr = byteToStr(digest);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
    
            content = null;
            // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
            return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
        }
    
        /**
         * 将字节转换为十六进制字符串
         * 
         * @param mByte
         * @return
         */
        private static String byteToHexStr(byte mByte) {
            char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
            char[] tempArr = new char[2];
            tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
            tempArr[1] = Digit[mByte & 0X0F];
    
            String s = new String(tempArr);
            return s;
        }
    
        /**
         * 将字节数组转换为十六进制字符串
         * 
         * @param byteArray
         * @return
         */
        private static String byteToStr(byte[] byteArray) {
            String strDigest = "";
            for (int i = 0; i < byteArray.length; i++) {
                strDigest += byteToHexStr(byteArray[i]);
            }
            return strDigest;
        }
    
        /**
         * 解析XML
         * 
         * 
         * @param req
         * @return
         */
        public static Map<String, String> parseWikiMsg(HttpServletRequest req) throws Exception {
    
            // 将解析结果存储在HashMap中
            Map<String, String> map = new HashMap<String, String>();
    
            // 从request中取得输入流
            InputStream inputStream = req.getInputStream();
            // 读取输入流
            SAXReader reader = new SAXReader();
            Document document = reader.read(inputStream);
            // 得到xml根元素
            Element root = document.getRootElement();
            // 得到根元素的所有子节点
            List<Element> elementList = root.elements();
            // 遍历所有子节点
            for (Element e : elementList)
                map.put(e.getName(), e.getText());
            // 释放资源
            inputStream.close();
            inputStream = null;
            return map;
        }
    
        /**
         * @author fanglf 需要微信端自行输入token,也就是随意输入token。
         */
        private static final String ALGORITHM = "MD5";
    
        private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',
                'e', 'f' };
    
        /**
         * encode string
         * 
         * @param algorithm
         * @param str
         * @return String
         */
        public static String encode(String algorithm, String str) {
            if (str == null) {
                return null;
            }
            try {
                MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
                messageDigest.update(str.getBytes());
                return getFormattedText(messageDigest.digest());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
    
        }
    
        /**
         * encode By MD5
         * 
         * @param str
         * @return String
         */
        public static String encodeByMD5(String str) {
            if (str == null) {
                return null;
            }
            try {
                MessageDigest messageDigest = MessageDigest.getInstance(ALGORITHM);
                messageDigest.update(str.getBytes());
                return getFormattedText(messageDigest.digest());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
    
        }
    
        /**
         * Takes the raw bytes from the digest and formats them correct.
         * 
         * @param bytes the raw bytes from the digest.
         * @return the formatted bytes.
         */
        private static String getFormattedText(byte[] bytes) {
            int len = bytes.length;
            StringBuilder buf = new StringBuilder(len * 2);
            // 把密文转换成十六进制的字符串形式
            for (int j = 0; j < len; j++) {
                buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
                buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
            }
            return buf.toString();
        }
    }
    

    Controller类

    /**
     * Project Name:xbrcw
     * File Name:TokenController.java
     * Package Name:cn.bluemobi.controller.weixin
     * Date:2015年7月8日下午12:04:57
     * Copyright (c) 2015, bluemobi.cn All Rights Reserved.
     *
     */
    
    package cn.bluemobi.controller.weixin;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.text.ParseException;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import cn.bluemobi.MicroServiceUtil.MicroServiceUtil;
    import cn.bluemobi.entity.weixin.CheckModel;
    import cn.bluemobi.service.TokenService;
    
    /**
     * Description: <br/>
     * Date: 2015年7月8日 下午12:04:57 <br/>
     * 
     * @author fang
     * @version
     * @see
     */
    @Controller
    @RequestMapping("/wechat")
    public class TokenController {
        @Autowired
        private TokenService tokenService;
    
        // private Logger log = Logger.getLogger(TokenController.class);
        /**
         * 开发者模式token校验
         * 
         * @param wxAccount 开发者url后缀
         * @param response
         * @param tokenModel
         * @throws ParseException
         * @throws IOException
         */
        @RequestMapping(method = { RequestMethod.GET })
        @ResponseBody
        public String validate(String wxToken, CheckModel tokenModel) throws ParseException, IOException {
            return tokenService.validate(wxToken, tokenModel);
        }
    
        /**
         * 微信消息的处理
         * 
         * @param request
         * @param out
         * @throws IOException
         */
        @RequestMapping(method = { RequestMethod.POST })
        public void dispose(HttpServletRequest request, HttpServletResponse response) throws IOException {
            /* 消息的接收、处理、响应 */
    
            // 将请求、响应的编码均设置为UTF-8(防止中文乱码)
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
    
            // 调用核心业务类接收消息、处理消息
            String respMessage = MicroServiceUtil.processRequest(request);
            // log.info(respMessage);
            // 响应消息
            PrintWriter out = response.getWriter();
            out.print(respMessage);
            out.close();
        }
    }
    

    以上代码即可实现通过springmvc的方式和微信公众平台token对接。需要的相对应jar包,请自行下载。找不到的留言,我会提供。
    码农的世界

    期待各位码友在欣赏我的无私创作之时,也请大家多多支持我码农的世界,谢谢各位!

    展开全文
  • java版微信公众号开发之自定义菜单的创建代码中使用的SQL,创建自定义菜单的代码链接:https://www.blog-china.cn/liuzaiqingshan/home/10/1519376790015
  • 本文将详细的介绍微信小程序的登录流程以及在ssm框架下如何实现小程序用户登录(日后补上过滤器的配置。。。) 登录流程概要 主要的登录流程可以参考官方提供的一张流程图: 1.微信前台页面: 在微信版本...
  • 一个真实的项目源码,项目主要包含两个模块,一个是微信公众号,一个是后台管理系统.采用的技术有spring mvc,hibernate,oracle,jsp,jQuery,源码文档中有项目需求.
  • 首先 这个微信支付 官网的demo 是有bug的 研究了好几天 吸取了一些大神的指点才成功,还有csdn一些人发的代码都不全太坑,资源还少,今天我就整合一下, 把我的一些心得分享给大家 。 之前遇到的一些问题: 预...
  • [code="java"] package com.meiparty.controller; import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import javax.servlet....
  • 最近咨询微信的人很多...在前面两篇两篇随笔《C#-MVC开发微信应用(1)--开始使用微信接口》和《C#-MVC开发微信应用(2)--开始使用微信接口》里面,大致介绍了我微信应用的框架构建,本随笔继续介绍这一主题,介绍消息...
  • 1、微信账号 要开发使用微信的平台API,就需要到微信的公众平台(https://mp.weixin.qq.com/)去注册,拥有一个服务号或者订阅号,服务号主要面对... 为了使用一些高级的接口,你可能需要拥有服务号和高级的认证。...
  • 前台代码 //获取随机串 var createNonceStr = function() { return Math.random().toString(36).substr(2, 15); }; // timestamp var createTimeStamp = function () { ... return parseInt(new Date().getT
  • java版微信授权认证登录spring-mvc by WangJx
  • 您好。 我想咨询一下用spring mvc开发微信公众号,在填写服务器配置时的url时应该写哪些?我的项目名是:weixinGo RequestMapping是valid.do
  • 前面一篇有说道如何在MyEclipse中搭建maven项目,这里将继续介绍如何在搭建好的基础maven项目中引入我们常用的javaweb框架——SpringMVC! ①在建立好的maven项目中的pom.xml文件引入依赖,代码如下: ...
  • 在做公众号开发的时候,用spingMVC的控制器返回xml数据,即微信的文本消息格式信息,发现出现乱码,部署到服务器后公众号收到的是一串问号。在request和response上都设置了UTF-8编码 request....
1 2 3 4 5 ... 20
收藏数 9,001
精华内容 3,600
关键字:

mvc spring 微信开发