1.配置接口信息进行验证
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
/**
* 访问没认证的地址跳转
*
* @param request
* @return 登录页面
* @throws exception
*/
@requestmapping (value = "/checkwxdomainurl" , method = requestmethod.get)
public void checkwxdomainurl(httpservletrequest request) throws exception {
try {
// 开发者提交信息后,微信服务器将发送get请求到填写的服务器地址url上,get请求携带参数
string signature = request.getparameter( "signature" ); // 微信加密签名(token、timestamp、nonce。)
string timestamp = request.getparameter( "timestamp" ); // 时间戳
string nonce = request.getparameter( "nonce" ); // 随机数
string echostr = request.getparameter( "echostr" ); // 随机字符串
// 将token、timestamp、nonce三个参数进行字典序排序
string[] params = new string[] { token, timestamp, nonce };
arrays.sort(params);
// 将三个参数字符串拼接成一个字符串进行sha1加密
string cleartext = params[ 0 ] + params[ 1 ] + params[ 2 ];
string algorithm = "sha-1" ;
string sign = new string(hex.encodehex(
messagedigest.getinstance(algorithm).digest((cleartext).getbytes()), true ));
// 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
if (signature.equals(sign)) {
response.getwriter().print(echostr);
}
} catch (exception e) {
e.printstacktrace();
}
}
|
2.js配置
3.获取分享页面js需要参数 其中获取token、ticket加入缓存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
/**
* 方法名:getwxconfig</br>
* 详述:获取微信的配置信息 </br>
* 开发人员:gy
* @param request
* @return 说明返回值含义
* @throws 说明发生此异常的条件
*/
@override
public map<string, object> getwxconfig(httpservletrequest request) {
map<string, object> ret = new hashmap<string, object>();
string appid = wxconfigure.getappid(); // 必填,公众号的唯一标识
string requesturl = request.getrequesturl().tostring();
string accesstoken = null ;
string jsapiticket = null ;
string url = "" ;
string timestamp = long .tostring(system.currenttimemillis() / 1000 ); // 必填,生成签名的时间戳
string noncestr = uuid.randomuuid().tostring(); // 必填,生成签名的随机串
//此处先在缓存中查询,查询不到在调用接口查询 缓存中需要设置access-token的有效时间
// redistemplate.opsforvalue().getoperations().delete(prefix);
// accesstoken = (string) redistemplate.opsforvalue().get(prefix);
token accesstokenfromredis = getaccesstokenfromredis();
accesstoken = accesstokenfromredis.getaccesstoken();
if (accesstokenfromredis.getaccesstoken() != null ) {
jsapiticket = (string) redistemplate.opsforvalue().get(prefixticket);
if (jsapiticket== null ) {
url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accesstoken
+ "&type=jsapi" ;
jsonobject json = httprequest(url, "get" , null );
if (json != null ) {
jsapiticket = json.getstring( "ticket" );
redistemplate.opsforvalue().set(prefixticket, jsapiticket);
redistemplate.expire(prefixticket, integer.parseint(wxconfigure.getexpiretime()),
timeunit.seconds);
}
}
}
string signature = "" ;
// 注意这里参数名必须全部小写,且必须有序
string sign = "jsapi_ticket=" + jsapiticket + "&noncestr=" + noncestr + "×tamp="
+ timestamp + "&url=" + requesturl;
try {
messagedigest crypt = messagedigest.getinstance( "sha-1" );
crypt.reset();
crypt.update(sign.getbytes( "utf-8" ));
signature = bytetohex(crypt.digest());
} catch (nosuchalgorithmexception e) {
e.printstacktrace();
} catch (unsupportedencodingexception e) {
e.printstacktrace();
}
ret.put( "appid" , appid);
ret.put( "timestamp" , timestamp);
ret.put( "noncestr" , noncestr);
ret.put( "signature" , signature);
return ret;
}
/**
* 方法名:bytetohex</br>
* 详述:字符串加密辅助方法 </br>
* 开发人员:gy </br>
* @param hash
* @return 说明返回值含义
* @throws 说明发生此异常的条件
*/
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;
}
/**
* 从redis中获取accesstoken,指定key的string值,过期时间7200s
*
* @param key
* @return
*/
public token getaccesstokenfromredis() {
token token = null ;
string assesstoken = (string) redistemplate.opsforvalue().get(wxconfigure.gettokenkey());
if ( null != assesstoken && ! "" .equals(assesstoken)) {
token = new token();
token.setaccesstoken(assesstoken);
return token;
} else {
token = commonwxutil.gettoken(wxconfigure.getappid(), wxconfigure.getsecret());
redistemplate.opsforvalue().set(wxconfigure.gettokenkey(), token.getaccesstoken());
redistemplate.expire(wxconfigure.gettokenkey(), integer.parseint(wxconfigure.getexpiretime()),
timeunit.seconds);
return token;
}
}
|
4.页面的相关js的引入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
<script type= "text/javascript" src= "http://res.wx.qq.com/open/js/jweixin-1.0.0.js" ></script>
<script type= "text/javascript" src= "https://res.wx.qq.com/open/js/jweixin-1.0.0.js" ></script>
<script type= "text/javascript" >
// 微信信息的以及调用的配置
// 微信信息的以及调用的配置
var signature=$( "#signature" ).val();
var appid=$( "#appid" ).val();
var timestamp=$( "#timestamp" ).val();
var noncestr=$( "#noncestr" ).val();
var userid=$( "#userid" ).val();
var productname= 1 ;
alert(signature);
wx.config({
debug: false ,
appid:appid ,
timestamp:timestamp,
noncestr: noncestr,
signature:signature,
jsapilist: [ 'onmenusharetimeline' , 'onmenushareappmessage' , 'onmenushareqq' , 'onmenushareweibo' , 'onmenushareqzone' ]
});
wx.ready(function(){
var isok = true ;
wx.checkjsapi({
jsapilist: [ 'onmenusharetimeline' ],
fail: function (res) {
alert( "微信版本太低,不支持分享给朋友的功能!" );
isok = false ;
},
success: function (res) {
alert( "支持qq分享。" );
}
});
// 获取“分享到朋友圈”按钮点击状态及自定义分享内容接口
wx.onmenusharetimeline({
title: '第六篇 :微信公众平台开发实战java版之如何自定义微信公众号菜单' ,
desc: '第六篇 :微信公众平台开发实战java版之如何自定义微信公众号菜单' ,
link: 'http://4d536256.ngrok.io/login' ,
imgurl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png' ,
success: function (res) {
alert(json.stringify(res));
if (res.errmsg== 'sharetimeline:ok' ) {
/* $.ajax({
type:"get",
url:'insertcollectshare',
data:{
userid:userid,
},
datatype:"json",
async: false,
success:function(data){
alert(200);
},
error:function(data){
var rurl = xhr.getresponseheader('contentpath');
window.location.href = rurl;
}
}); */
// 用户确认分享后执行的回调函数
/* window.location.href = contextroot + 'insertcollectshare?userid=' + userid; */
}
},
cancel: function (res) {
// 用户取消分享后执行的回调函数
alert(res);
}
});
// 获取“分享给朋友”按钮点击状态及自定义分享内容接口
wx.onmenushareappmessage({
title: '第七篇 :微信公众平台开发实战java版之如何获取微信用户基本信息' , // 分享标题
desc: "第七篇 :微信公众平台开发实战java版之如何获取微信用户基本信息" , // 分享描述
link: 'http://4d536256.ngrok.io/login' ,
imgurl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png' , // 分享图标
type: 'link' , // 分享类型,music、video或link,不填默认为link
});
//获取“分享到qq”按钮点击状态及自定义分享内容接口
wx.onmenushareqq({
title: '第六篇 :微信公众平台开发实战java版之如何自定义微信公众号菜单' , // 分享标题
desc: '第六篇 :微信公众平台开发实战java版之如何自定义微信公众号菜单' , // 分享描述
link: 'http://4d536256.ngrok.io/login' , // 分享链接
imgurl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png' , // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
//获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口
wx.onmenushareweibo({
title: '分享到腾讯微博标题' , // 分享标题
desc: '分享到腾讯微博描述' , // 分享描述
link: 'http://4d536256.ngrok.io/login' , // 分享链接
imgurl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png' , // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
//获取“分享到qq空间”按钮点击状态及自定义分享内容接口
wx.onmenushareqzone({
title: '分享到qq空间标题11111111111111111' , // 分享标题
desc: '分享到qq空间描述2222222222222222222' , // 分享描述
link: 'http://4d536256.ngrok.io/login' ,
imgurl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png' , // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
});
</script>
|
备注:调转的路径为配置的域名路径,不然无法调用,图片大小不可以大于300k
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/gyadmin/p/7877682.html