java 重写微信分享_java实现微信自定义分享,老是报config:invalid signature

1.WeixinUtil.class

package com.weixin.util;

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.UnsupportedEncodingException;

import java.net.ConnectException;

import java.net.URL;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.Formatter;

import java.util.HashMap;

import java.util.Map;

import java.util.UUID;

import javax.net.ssl.HttpsURLConnection;

import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLSocketFactory;

import javax.net.ssl.TrustManager;

import javax.servlet.http.HttpServletRequest;

import net.sf.json.JSONObject;

public class WeixinUtil {

/**

* 方法名:httpRequest

* 详述:发送http请求

* @param requestUrl

* @param requestMethod

* @param outputStr

* @return 说明返回值含义

* @throws 说明发生此异常的条件

*/

public static JSONObject httpRequest(String requestUrl,String requestMethod, String outputStr) {

JSONObject jsonObject = null;

StringBuffer buffer = new StringBuffer();

try {

TrustManager[] tm = { new MyX509TrustManager() };

SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");

sslContext.init(null, tm, new java.security.SecureRandom());

SSLSocketFactory ssf = sslContext.getSocketFactory();

URL url = new URL(requestUrl);

HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();

httpUrlConn.setSSLSocketFactory(ssf);

httpUrlConn.setDoOutput(true);

httpUrlConn.setDoInput(true);

httpUrlConn.setUseCaches(false);

httpUrlConn.setRequestMethod(requestMethod);

if ("GET".equalsIgnoreCase(requestMethod))

httpUrlConn.connect();

if (null != outputStr) {

OutputStream outputStream = httpUrlConn.getOutputStream();

outputStream.write(outputStr.getBytes("UTF-8"));

outputStream.close();

}

InputStream inputStream = httpUrlConn.getInputStream();

InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");

BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

String str = null;

while ((str = bufferedReader.readLine()) != null) {

buffer.append(str);

}

bufferedReader.close();

inputStreamReader.close();

inputStream.close();

inputStream = null;

httpUrlConn.disconnect();

jsonObject = JSONObject.fromObject(buffer.toString());

} catch (ConnectException ce) {

ce.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

return jsonObject;

}

/**

* 方法名:getWxConfig

* 详述:获取微信的配置信息

* @param request

* @return 说明返回值含义

* @throws 说明发生此异常的条件

*/

public static Map getWxConfig(HttpServletRequest request) {

Map ret = new HashMap();

String appId = "wxbf547a5a1d4c13f7"; // 必填,公众号的唯一标识

String secret = "d4624c36b6795d1d99dcf0547af5443d";

String requestUrl = request.getRequestURL().toString();

String access_token = "";

String jsapi_ticket = "";

String timestamp = Long.toString(System.currentTimeMillis() / 1000); // 必填,生成签名的时间戳

String nonceStr = UUID.randomUUID().toString(); // 必填,生成签名的随机串

String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appId + "&secret=" + secret;

JSONObject json = WeixinUtil.httpRequest(url, "GET", null);

if (json != null) {

//要注意,access_token需要缓存

access_token = json.getString("access_token");

url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+ access_token + "&type=jsapi";

json = WeixinUtil.httpRequest(url, "GET", null);

if (json != null) {

jsapi_ticket = json.getString("ticket");

}

}

String signature = "";

// 注意这里参数名必须全部小写,且必须有序

String sign = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonceStr+ "&timestamp=" + 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("token", access_token);

ret.put("ticket", jsapi_ticket);

ret.put("ksy", json);

ret.put("appId", appId);

ret.put("timestamp", timestamp);

ret.put("nonceStr", nonceStr);

ret.put("signature", signature);

return ret;

}

/**

* 方法名:byteToHex

* 详述:字符串加密辅助方法

* @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;

}

}

2.share.jsp

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%> --%>

"> --%>

微信分享测试

Map ret = new HashMap ();

ret=WeixinUtil.getWxConfig(request);

request.setAttribute("appId", ret.get("appId"));

request.setAttribute("timestamp", ret.get("timestamp"));

request.setAttribute("nonceStr", ret.get("nonceStr"));

request.setAttribute("signature", ret.get("signature"));

//自测参数

request.setAttribute("ticket", ret.get("ticket"));

request.setAttribute("token", ret.get("token"));

request.setAttribute("ksy", ret.get("ksy"));

request.setAttribute("ksy1", ret);

%>

--%>

a:link {

text-decoration: none;

}

点我进行分享

${ticket}+"*1"

${token}+"*2"

"json数据"${ksy}+"*3json"

"ret数据"${ksy1}+"*4"

alert("start");

// 微信信息的以及调用的配置

wx.config({

debug: true,

appId: '${appId}',

timestamp: '${timestamp}',

nonceStr: '${nonceStr}',

signature: '${signature}',

jsApiList: ['chooseImage','onMenuShareTimeline', 'onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone']

});

wx.ready(function(){

alert("wx.ready");

/* wx.checkJsApi({

jsApiList: ['onMenuShareAppMessage'], // 需要检测的JS接口列表,所有JS接口列表见附录2,

success: function(res) {

// 以键值对的形式返回,可用的api值true,不可用为false

// 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}

$.scojs_message(JSON.stringify(res),$.scojs_message.TYPE_OK);

}

}); */

//wx.hideOptionMenu();

// 获取“分享到朋友圈”按钮点击状态及自定义分享内容接口

wx.onMenuShareTimeline({

title: '第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息', // 分享标题

link:"http://www.cnblogs.com/liuhongfeng/p/5099149.html",

imgUrl: "http://images.cnblogs.com/cnblogs_com/liuhongfeng/737147/o_1442809977405.jpg", // 分享图标

success: function () {

// 用户确认分享后执行的回调函数

alert("成功分享到朋友圈");

},

cancel: function () {

// 用户取消分享后执行的回调函数

},

fail: function (res) {

alert('分享到朋友圈失败');

}

});

// 获取“分享给朋友”按钮点击状态及自定义分享内容接口

wx.onMenuShareAppMessage({

title: '第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息', // 分享标题

desc: "第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息", // 分享描述

link:"http://www.cnblogs.com/liuhongfeng/p/5057167.html",

imgUrl: "http://images.cnblogs.com/cnblogs_com/liuhongfeng/737147/o_QQ%E5%9B%BE%E7%89%8720151118180508.png", // 分享图标

type: 'link', // 分享类型,music、video或link,不填默认为link

success: function () {

// 用户确认分享后执行的回调函数

alert("成功分享给朋友");

},

cancel: function () {

// 用户取消分享后执行的回调函数

},

fail: function (res) {

alert('分享给朋友失败');

}

});

//获取“分享到QQ”按钮点击状态及自定义分享内容接口

wx.onMenuShareQQ({

title: '第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单', // 分享标题

desc: '第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单', // 分享描述

link: 'http://www.cnblogs.com/liuhongfeng/p/4857312.html', // 分享链接

imgUrl: 'http://images.cnblogs.com/cnblogs_com/liuhongfeng/737147/o_qrcode_for_gh_228cd30523bc_258.jpg', // 分享图标

success: function () {

// 用户确认分享后执行的回调函数

},

cancel: function () {

// 用户取消分享后执行的回调函数

}

});

});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值