JAVA微信转发好友和朋友圈
首创
public class WxConfigUtil {
// 获取access_token的接口地址(GET)
public final static String access_token_url = "**********";
// 获取jsapi_ticket的接口地址(GET)
public final static String jsapi_ticket_url = "***********";
// 缓存添加的时间
public static String cacheAddTime = "";
// token,ticket缓存
public static Map<String, Token> TOKEN_TICKET_CACHE = new HashMap<String, Token>();
// token对应的key
private static final String TOKEN = "token";
// ticket对应的key
private static final String TICKET = "ticket";
/**
* 外部获取签名入口类
*
* @param appUrl 应用的url
* @return
*/
public static Map<String, Object> getSignature(String appUrl) {
String appId="********";
String secret="*******";
// 生成签名的随机串
String noncestr = create_nonce_str();
if (appUrl == null || "".equals( appUrl )) {
return null;
}
String signature = null;
//获得Token
Token accessTocken = getToken( appId, secret, System.currentTimeMillis() / 1000 );
Token accessTicket = getTicket( accessTocken.getToken(), System.currentTimeMillis() / 1000 );
signature = signature( accessTicket.getTicket(), cacheAddTime, noncestr, appUrl );
Map<String, Object> map = new HashMap<>();
map.put( "appId", appId );
map.put( "timestamp", cacheAddTime );
map.put( "nonceStr", noncestr );
map.put( "signature", signature );
return map;
}
private static String create_nonce_str() {
return UUID.randomUUID().toString();
}
/**
* 签名
*
* @param timestamp
* @return
*/
private static String signature(String jsapi_ticket, String timestamp, String noncestr, String url) {
jsapi_ticket = "jsapi_ticket=" + jsapi_ticket;
timestamp = "timestamp=" + timestamp;
noncestr = "noncestr=" + noncestr;
url = "url=" + url;
String[] arr = new String[]{jsapi_ticket, noncestr, timestamp, url};
Arrays.sort( arr );
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append( arr[i] );
if (i != arr.length - 1) {
content.append( "&" );
}
}
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();
}
return tmpStr;
}
/**
* 获取access_token
*
* @param appid 凭证
* @param appsecret 密钥
* @return
*/
public static Token getToken(String appid, String appsecret, long currentTime) {
Token tockenTicketCache = getTokenTicket( TOKEN );
Token Token = null;
if (tockenTicketCache != null && (currentTime - tockenTicketCache.getAddTime() <= tockenTicketCache.getExpiresIn())) {// 缓存存在并且没过期
System.out.println( "==========缓存中token已获取时长为:" + (currentTime - tockenTicketCache.getAddTime()) + "毫秒,可以重新使用" );
return tockenTicketCache;
}
System.out.println( "==========缓存中token不存在或已过期===============" );
String requestUrl = access_token_url.replace( "APPID", appid ).replace( "APPSECRET", appsecret );
JSONObject jsonObject = httpRequest( requestUrl, "GET", null );
// 如果请求成功
if (null != jsonObject) {
Token = new Token();
Token.setToken( jsonObject.getString( "access_token" ) );
Token.setExpiresIn( jsonObject.getInt( "expires_in" ) / 2 );// 正常过期时间是7200秒,此处设置3600秒读取一次
System.out.println( "==========tocket缓存过期时间为:" + Token.getExpiresIn() + "毫秒" );
Token.setAddTime( currentTime );
updateToken( TOKEN, Token );
}
return Token;
}
/**
* 获取ticket
*
* @param token
* @return
*/
private static Token getTicket(String token, long currentTime) {
Token tockenTicketCache = getTokenTicket( TICKET );
Token Token = null;
if (tockenTicketCache != null && (currentTime - tockenTicketCache.getAddTime() <= tockenTicketCache.getExpiresIn())) {// 缓存中有ticket
System.out.println( "==========缓存中ticket已获取时长为:" + (currentTime - tockenTicketCache.getAddTime()) + "毫秒,可以重新使用" );
return tockenTicketCache;
}
System.out.println( "==========缓存中ticket不存在或已过期===============" );
String requestUrl = jsapi_ticket_url.replace( "ACCESS_TOKEN", token );
JSONObject jsonObject = httpRequest( requestUrl, "GET", null );
// 如果请求成功
if (null != jsonObject) {
Token = new Token();
Token.setTicket( jsonObject.getString( "ticket" ) );
Token.setExpiresIn( jsonObject.getInt( "expires_in" ) / 2 );// 正常过期时间是7200秒,此处设置3600秒读取一次
System.out.println( "==========ticket缓存过期时间为:" + Token.getExpiresIn() + "毫秒" );
Token.setAddTime( currentTime );
updateToken( TICKET, Token );
}
return Token;
}
/**
* 发起https请求并获取结果
*
* @param requestUrl 请求地址
* @param requestMethod 请求方式(GET、POST)
* @param outputStr 提交的数据
* @return JSONObject(通过JSONObject.get ( key)的方式获取json对象的属性值)
*/
private static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
StringBuffer buffer = new StringBuffer();
try {
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = {new MyX509TrustManager()};
SSLContext sslContext = SSLContext.getInstance( "SSL", "SunJSSE" );
sslContext.init( null, tm, new java.security.SecureRandom() );
// 从上述SSLContext对象中得到SSLSocketFactory对象
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 );
// 设置请求方式(GET/POST)
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();
httpUrlConn.disconnect();
jsonObject = JSONObject.fromObject( buffer.toString() );
} catch (ConnectException ce) {
System.out.println( "Weixin server connection timed out." );
} catch (Exception e) {
System.out.println( "https request error:{}" + e.getMessage() );
}
return jsonObject;
}
/**
* 将字节数组转换为十六进制字符串
*
* @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;
}
/**
* 将字节转换为十六进制字符串
*
* @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;
}
/**
* 从缓存中读取token或者ticket
*
* @return
*/
private static Token getTokenTicket(String key) {
if (TOKEN_TICKET_CACHE != null && TOKEN_TICKET_CACHE.get( key ) != null) {
System.out.println( "==========从缓存中获取到了" + key + "成功===============" );
return TOKEN_TICKET_CACHE.get( key );
}
return null;
}
/**
* 更新缓存中token或者ticket
*
* @return
*/
private static void updateToken(String key, Token accessTocken) {
if (TOKEN_TICKET_CACHE != null && TOKEN_TICKET_CACHE.get( key ) != null) {
TOKEN_TICKET_CACHE.remove( key );
System.out.println( "==========从缓存中删除" + key + "成功===============" );
}
TOKEN_TICKET_CACHE.put( key, accessTocken );
cacheAddTime = String.valueOf( accessTocken.getAddTime() );// 更新缓存修改的时间
System.out.println( "==========更新缓存中" + key + "成功===============" );
}
创建Token
public class Token {
// 获取到的凭证
private String token;
// 获取到ticket
private String ticket;
// 凭证有效时间,单位:秒
private int expiresIn;
// 添加时间
private long addTime;
}
public class MyX509TrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException
{
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException
{
}
public X509Certificate[] getAcceptedIssuers()
{
return null;
}
}
前端页面需要添加
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script>
$(function () {
var ua = window.navigator.userAgent.toLowerCase(),
localUrl = location.href.split("#")[0];
if(ua.match(/MicroMessenger/i) == 'micromessenger'){
$.ajax({
url:"*.do",
type:"post",
datatype:"json",
data:{
url:localUrl
},
success:function(data) {
wx.config({
debug: true,
appId: data.wXMap.appId,
timestamp: data.wXMap.timestamp,
nonceStr: data.wXMap.nonceStr,
signature: data.wXMap.signature,
jsApiList: [
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'getNetworkType'
]
});
}
});
wx.ready(function () {
wx.checkJsApi({
jsApiList: [
'onMenuShareTimeline',
'onMenuShareAppMessage',
'getNetworkType'
]
});
wx.onMenuShareTimeline({
title: '',
desc: '',
link: localUrl,
imgUrl: ''
});
wx.onMenuShareAppMessage({
title: '',
desc: '',
link: localUrl,
imgUrl: ''
});
});
}
});
</script>
JAVA微信转发好友和朋友圈相关推荐
- 微信分享好友,朋友圈
// 分享 function shareFriend() { WeixinJSBridge.invoke('sendAppMessage',{ //"appid":window.s ...
- uniapp生成海报,保存相册 / 分享微信好友和朋友圈
<view> <u-button @click="createPoster">生成海报</u-button> <u-popup :show ...
- java版微信朋友圈_java调用个人微信API接口发朋友圈,评论和删除朋友圈
java调用个人微信API接口发朋友圈,评论和删除朋友圈 /** * 发送朋友圈任务 * @author wechatno:tangjinjinwx * @param ctx * @param vo ...
- 微信小程序分享到好友或朋友圈
微信小程序分享到好友或朋友圈 : onShareAppMessage(object) 1) wxml: open-type="" : 微信开放能力 share:出发用户转发 js: ...
- 微信小程序/uniapp分享功能-代码封装与使用(分享好友或朋友圈-两种方式)
官方地址:分享 | uni-app官网 一.分享朋友圈-详见uni-app官方文档 注意:更多注意事项见uni-app文档 结果展示: 二.分享好友或者朋友圈-详见微信开放文档 先展示: 实现分享 ...
- java调用个人微信API接口收发朋友圈,删除评论朋友圈
java调用个人微信API接口收发朋友圈,删除评论朋友圈 /** * 发送朋友圈任务 * @author wechatno:tangjinjinwx * @param ctx * @param vo ...
- Android 分享到微信6.0后好友、朋友圈
文章出至:(源码可运行) http://blog.csdn.net/alfred_c/article/details/49722833 果 介绍 要实现微信分享,首先请认真 ...
- uniapp分享到微信好友和朋友圈
uniapp分享到微信好友和朋友圈 首先目前的微信小程序只支持页面中右上角三个点触发分享功能,页面按钮只能触发分享至微信好友的功能 <template><view class=&qu ...
- 前端做微信好友分享_前端微信分享,调用微信分享,分享朋友圈,分享微信好友,分享qq空间,qq好友...
项目中很多使用到微信分享的地方,对于前端来说也算很简单了,建议写该功能时使用微信调试工具,便于调试,直接上代码 第一步,引入微信配置文件 //这里的AJAX用于获取后台数据,当然也可以不用这么写,您只 ...
最新文章
- 微信第 1 行代码曝光,简陋到让你怀疑人生!
- 中国首个AI考级来了:共分10级,北大出题,工信部认证 | 在线可测,我最多活3级...
- Educational Codeforces Round 11C. Hard Process two pointer
- android studio module不识别 红色j,androidstudio 不显示 Module-- 新年第一波
- ffmpeg 截图 java_Java Web 中使用ffmpeg实现视频转码、视频截图
- ctf 改变图片高度_每天一分钟,python一点通(opencv的图片处理方法)
- 网络管理员掌握的学习方法
- Windows系统优化软件 | 这10款功能超级强大!界面优美!值得收藏
- 计算机组装与维修2版,清华大学出版社-图书详情-《计算机组装与维护维修(第2版)》...
- 语音信号处理的过程及其应用
- android 打apk文件怎么打开方式,apk文件怎么打开,详细教您打开apk文件的方法
- 【优先队列】Toda 2
- imagebutton图片缩放
- echarts按照时间显示柱状图_Echarts制作时间柱形离散分布图
- MySQL COUNT(*) 和 COUNT(1) 比较
- starUML4.0导出的图片去除水印的方法
- (转)如何获得两个日期相减的天数?
- 白盒测试及其基本方法
- 漂亮的红色玫瑰花——情人节-圣诞节专属-代码实现
- Mysql 安装与基础
热门文章
- 盗版软件的制作流程及制作周期
- 关于记事本的实现原理
- 远离“灰色地带”,网络视频变革中
- Flash使用服务器时间
- JQuery中的CSS属性及操作
- mysql离线二进制安装
- 最终幻想7php攻略,PS5最终幻想7重制版图文攻略 全流程剧情详细攻略(3)
- 笔记56--listview之selector、listview中同一时刻只有一个item能被选中
- 打怪上分! 手写Spring ioc 框架,狠狠的“撸撸”Spring 源码
- 贴吧楼中楼回复机器人_GitHub - giuem/TieBaRobot: [NOT MAINTENANCE]百度贴吧机器人,可回复@和楼中楼对话...