您的位置:首页 > 移动开发 > 微信开发

【移动】微信公众好网页分享开发

2017-11-17 08:45 357 查看
/**
* 【方法用途】
*   获得微信分享接口初始化配置参数
* 【方法说明】
*   第一步,从数据库获取token和ticket的信息:access_token码、ticket码、ex_access_token产生的timestamp。
* 	 第二步,如果access_token失效,发送请求进行刷新。
*	 第三步,发送请求获得许可码jsapi_ticket,需要的请求参数:access_token。
*	 第四步,使用jsapi_ticket,进行签名。签名需要内容按顺序有:jsapi_ticket、随机字符串(未规定长度)、时间戳、当前页面的url。
* url不含#以后的内容。将所需内容合并后使用sha1签名,生成signature。
*  最后返回初始化配置信息:
*    ticket: 下次可以使用,放在前端浏览器缓存
*    expires_ticket:下次调用时判断ticket是否过期,需要重新申请。
*    signature: sha1签名后的字符串
* 【备注】(废弃)
*   在调用分享接口前,需要对微信JS-JDK进行初始化,首先要取得初始化参数。
*
*
* @return
*/
public String requestSign1(){

String web_url = httpServletRequest.getParameter("url");
if(web_url==null || "".equals(web_url)){
map = new HashMap<String, Object>();
map.put("flag", "error");
map.put("message", "您的网络出现异常,请关闭该页面,稍后重试");
json = (JSON) JSON.toJSON(map);
return "error";
}
/*
* 如果上次使用的ticket存在,且不超时,可直接进行签名。
*/
try {
String access_token="",ticket="";			//
Long ex_access_token=null,ex_ticket=null;	//
List<Sysconfig> list = sysconfigService.getSysconfigByConfigType("WECHATCONFIG");
Sysconfig tokenSysconfig = null;
Sysconfig ticketSysconfig = null;
for(Sysconfig sys : list){
if("access_token".equals(sys.getConfigName())){
access_token = sys.getConfigValue();
ex_access_token = sys.getRemark()==null||"".equals(sys.getRemark())? null:Long.parseLong(sys.getRemark());
tokenSysconfig = sys;
}
if("ticket".equals(sys.getConfigName())){
ticket = sys.getConfigValue();
ex_ticket = sys.getRemark()==null||"".equals(sys.getRemark())? null:Long.parseLong(sys.getRemark());
ticketSysconfig = sys;
}
}

System.out.println("access_token:"+access_token);
System.out.println("ex_access_token:"+ex_access_token);
System.out.println("ticket:"+ticket);
System.out.println("ex_ticket:"+ex_ticket);
/*
* 判断ticket是否过期,若有效则直接开始签名
* 若ticket过期,再判断token码是否过期,若没过期,使用token申请新的ticket
* 若token也过期了,则重新申请token,然后再申请ticket
*/
if(ex_ticket==null || (System.currentTimeMillis()-ex_ticket)>7000000){
System.out.println("无ticket或ticket过期");
if(ex_access_token==null || (System.currentTimeMillis()-ex_access_token)>7000000){
System.out.println("token过期,重新申请……");
//请求token的地址
String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&"
+ "appid=" + WeChatUtil.APPID + "&secret=" + WeChatUtil.SECRET;
//请求token
String result = HttpRequestUtil.getRequest(token_url);
/*
* 判断返回错误信息的话只有两个内容
* 示例:{"errcode":40029,"errmsg":"invalid code"}
*
* 正确时返回的JSON数据包如下:
* {
*   "access_token":"ACCESS_TOKEN",
*   "expires_in":7200,
* }
*/
System.out.println(result);
JSONObject token_message = JSONObject.fromObject(result);
//判断是否成功获得token
if(token_message.getString("access_token")!=null){
access_token = token_message.getString("access_token");
ex_access_token = System.currentTimeMillis();
//更新数据库中的请求数据
tokenSysconfig.setConfigValue(access_token);
tokenSysconfig.setRemark(ex_access_token.toString());
this.sysconfigService.updateSysconfig(tokenSysconfig);
System.out.println("成功更新token数据……");
}else{
map = new HashMap<String, Object>();
map.put("flag", "error");
map.put("message", "服务器异常,无法从微信公众平台获得授权");
json = (JSON) JSON.toJSON(map);
return "error";
}
}
//下一步需要来获得ticket(到此已经成功获得新的token码,并更新入数据库)
System.out.println("开始申请ticket……");
//生成ticket的参考时间,该变量在本分支中也用于签名
String jsapi_ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?"
+ "access_token="+access_token+"&type=jsapi";
String result = HttpRequestUtil.getRequest(jsapi_ticket_url);
System.out.println(result);
JSONObject jsapi_ticket_message = JSONObject.fromObject(result);

if(!"ok".equals(jsapi_ticket_message.getString("errmsg"))){
System.out.println("申请ticket失败……");
map = new HashMap<String, Object>();
map.put("flag", "error");
map.put("message", "身份信息过期,请关闭页面,重新点击公众菜单入口");
map.put("errcode", jsapi_ticket_message.getString("errcode"));
json = (JSON) JSON.toJSON(map);
return "error";
}

ab8a
ticket = jsapi_ticket_message.getString("ticket");
Timestamp timestamp = new Timestamp(System.currentTimeMillis());

ticketSysconfig.setConfigValue(ticket);
ticketSysconfig.setRemark(String.valueOf(timestamp.getTime()));
this.sysconfigService.updateSysconfig(ticketSysconfig);
System.out.println("成功获得ticket……");
}
System.out.println("开始使用ticket签名……");
//随机字符串
String noncestr = getRandomString(11);
Timestamp timestamp = new Timestamp(ex_ticket);
String str = "jsapi_ticket=" + ticket
+ "&noncestr=" + noncestr
+ "×tamp=" + timestamp.getTime()
+ "&url=" + web_url;
//进行sha1签名
String signature = DigestUtils.sha1Hex(str);
//返回内容
map = new HashMap<String, Object>();
//初始化配置必须参数
map.put("flag", "success");
map.put("timestamp", timestamp.getTime());
map.put("nonceStr", noncestr);
map.put("signature", signature);
map.put("appId", WeChatUtil.APPID);
json = (JSON) JSON.toJSON(map);
System.out.println("签名完毕……");
System.out.println(map.toString());
return "success";

} catch (Exception e) {
e.printStackTrace();
}
return "error";
}


/**
* 生成随机字符串
* @param length 需要生成字符串的长度
* @return
*/
public static String getRandomString(int length) {
String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}
$.ajax({
type: 'POST',
url: url,
dataType: 'JSON',
data: {
'url' : window.location.href.split('#')[0]
},
async : false,
success: function(msg){
console.log(msg);
if (msg.flag == 'success')
{
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: msg.appId, // 必填,公众号的唯一标识
timestamp: msg.timestamp, // 必填,生成签名的时间戳
nonceStr: msg.nonceStr, // 必填,生成签名的随机串
signature: msg.signature,// 必填,签名,见附录1
jsApiList: [
'checkJsApi',
'openLocation',
'getLocation',
'onMenuShareTimeline',
'onMenuShareAppMessage'
] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
var sysUrl = window.localStorage.getItem('shareUrl');
wx.ready(function(){
$('#wechat_share').hide();
alertX('您要分享的内容已经复制到剪贴板,请点击窗口右上角的菜单,选择发送给朋友。');
wx.onMenuShareAppMessage({
title: '个性化保单', // 分享标题
desc: window.localStorage.getItem("shareTip"), // 分享描述
link: window.localStorage.getItem("shareToWechatHref"), // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: sysUrl+"me/img/app_logo.png", // 分享图标
type: 'link', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
onSuccess();
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
});

}
else
{
if(msg.errcode)
{
alertX(msg.errcode);
}
}
},
error : function(msg){
alertX('服务器繁忙请稍后重试');
}

});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐