微信公众号开发,分享功能,java,spring mvc

前台代码

//获取随机串
var createNonceStr = function() {
    return Math.random().toString(36).substr(2, 15);
};
    
// timestamp
var createTimeStamp = function () {
    return parseInt(new Date().getTime() / 1000) + '';
}; 


$.ajax($("#basePath").val()+'weixin/getSignature', {
		data: {
			url:location.href.split('#')[0], //url 如果写的是固定的值的话,分享之后在分享会报错
			timestamp:createTimeStamp,
			nonce_str:createNonceStr
		},
		type: 'post', //HTTP请求类型
		timeout: 10000, //超时时间设置为10秒;
		success: function(data) {
			//微信初始化
			wx.config({
			    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
			    appId: "wx591945********", // 必填,公众号的唯一标识
			    timestamp:data.timestamp , // 必填,生成签名的时间戳
			    nonceStr: data.nonceStr, // 必填,生成签名的随机串
			    signature: data.signature,// 必填,签名,见附录1
			    jsApiList: [
					"onMenuShareTimeline",
					"onMenuShareAppMessage",
					"onMenuShareQQ"
			                ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
			}); 
			
			wx.ready(function(){
			    var sdata = {
			    	title: "分享标题", // 分享标题
			 		desc: "分享描述", // 分享描述
			 		link: "www.123456.com",// 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 "http://m1.ecoip.cn?tjrsjh="+sjhm+"&&tjrid="+yhid, 
			 		imgUrl: "images/shouye/logo2x.png", // 分享图标
				    success: function () {
				    	alert("分享成功");
				    },
				    cancel: function () {
				    	alert("分享失败");
				    }
				    
				};
			    wx.onMenuShareTimeline(sdata);//分享到朋友圈
			    wx.onMenuShareAppMessage(sdata);// 发送给朋友
		    });
			wx.error(function(res){
		        // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
	     		alert("抱歉,服务器初始化错误。");
		    });
			
		},
		error: function(xhr, type, errorThrown) {
			//异常处理;
			console.log(xhr);
			console.log(type);
			console.log(errorThrown);
		}
	});

Controller 
@Controller
@RequestMapping("/weixin")
public class WeixinController {
	
	// 获取accessToken 微信地址
	public static final String GET_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";
	
	// 获取ticket  微信地址
	public static final String GET_SIGNATURE_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
	
    // appid (*代表是报保密的东西)
	public static final String APP_ID = "*******************";
	//appsecret(*代表是报保密的东西)
	public static final String SECRET = "*******************";
	
	
	@RequestMapping(value = "/getSignature", method = RequestMethod.POST)
	@ResponseBody
	public Map
    
    
     
      WeixinController(HttpServletRequest request) {
		
		Map
     
     
      
       ret = new HashMap
      
      
       
       ();
		
		//获取前台传来的三个参数
		String timestamp = request.getParameter("timestamp");
		String nonce_str = request.getParameter("nonce_str");
		String url = request.getParameter("url");
		
	    String accessToken = getToken(GET_TOKEN_URL, APP_ID, SECRET);// 获取token
	    
        String ticket = getTicket(GET_SIGNATURE_URL,accessToken);    // 获取ticket
        
        String signature =getSignature(ticket,url,nonce_str,timestamp); //获取签名
	 
        ret.put("nonceStr", nonce_str);
        ret.put("timestamp", timestamp);
        ret.put("signature", signature);

        return ret;
	}
}
      
      
     
     
    
    

获取的个别方法
public static String getSignature(String jsapi_ticket,String url,String nonce_str,String timestamp) {
        String string1;
        String signature = "";

        // 注意这里参数名必须全部小写,且必须有序
        string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str
                + "&timestamp=" + timestamp + "&url=" + url;

        try {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(string1.getBytes("UTF-8"));
            signature = byteToHex(crypt.digest());

            System.out.println("[signature] = " + signature);

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }


        return signature;
    }
    
	
	private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash) {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }
// 获取access_token
    public static String getToken(String apiurl, String appid, String secret){
    	//拼接访问地址
    	String turl = String.format("%s?grant_type=client_credential&appid=%s&secret=%s", apiurl,appid, secret);
       
        HttpClient client = new DefaultHttpClient();
        //get请求
        HttpGet get = new HttpGet(turl);
        // 初始化解析json格式的对象
        JsonParser jsonparer = new JsonParser();
        String result = null;
        try
        {
            HttpResponse res = client.execute(get);
            String responseContent = null; // 初始化响应内容
            HttpEntity entity = res.getEntity();
            //设置编码格式
            responseContent = EntityUtils.toString(entity, "UTF-8");
            // 将json字符串转换为json对象
            JsonObject json = jsonparer.parse(responseContent).getAsJsonObject();
            
            if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
            {
                if (json.get("errcode") != null){
                	// 错误时微信会返回错误码等信息,{"errcode":40013,"errmsg":"invalid appid"}
                	}
                else{
                	// 正常情况下{"access_token":"ACCESS_TOKEN","expires_in":7200}
                    result = json.get("access_token").getAsString();
                }
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally{
            // 关闭连接 ,释放资源
            client.getConnectionManager().shutdown();
            return result;
        }
    }
 // 获取getTicket
    public static String getTicket(String apiurl,String access_token){  
    	
    	String turl = String.format("%s?access_token=%s&type=jsapi",apiurl,access_token);
    	
        HttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet(turl);
        
        JsonParser jsonparer = new JsonParser();// 初始化解析json格式的对象
        String result = null;
        try
        {
            HttpResponse res = client.execute(get);
            String responseContent = null; // 响应内容
            HttpEntity entity = res.getEntity();
            responseContent = EntityUtils.toString(entity, "UTF-8");
            JsonObject json = jsonparer.parse(responseContent).getAsJsonObject();
            
            // 将json字符串转换为json对象
            if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
                if (json.get("errcode") == null){
                	// 错误时微信会返回错误码等信息,{"errcode":40013,"errmsg":"invalid appid"}
                }
                else{
                	// 正常情况下{"access_token":"ACCESS_TOKEN","expires_in":7200}
                    result = json.get("ticket").getAsString();
                }
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            // 关闭连接 ,释放资源
            client.getConnectionManager().shutdown();
            return result;
        }
    }








  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值