首创

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微信转发好友和朋友圈相关推荐

  1. 微信分享好友,朋友圈

    // 分享 function shareFriend() { WeixinJSBridge.invoke('sendAppMessage',{ //"appid":window.s ...

  2. uniapp生成海报,保存相册 / 分享微信好友和朋友圈

    <view> <u-button @click="createPoster">生成海报</u-button> <u-popup :show ...

  3. java版微信朋友圈_java调用个人微信API接口发朋友圈,评论和删除朋友圈

    java调用个人微信API接口发朋友圈,评论和删除朋友圈 /** * 发送朋友圈任务 * @author wechatno:tangjinjinwx * @param ctx * @param vo ...

  4. 微信小程序分享到好友或朋友圈

    微信小程序分享到好友或朋友圈 : onShareAppMessage(object) 1) wxml: open-type="" : 微信开放能力 share:出发用户转发 js: ...

  5. 微信小程序/uniapp分享功能-代码封装与使用(分享好友或朋友圈-两种方式)

    官方地址:分享 | uni-app官网 一.分享朋友圈-详见uni-app官方文档 注意:更多注意事项见uni-app文档  结果展示: 二.分享好友或者朋友圈-详见微信开放文档 先展示:  实现分享 ...

  6. java调用个人微信API接口收发朋友圈,删除评论朋友圈

    java调用个人微信API接口收发朋友圈,删除评论朋友圈 /** * 发送朋友圈任务 * @author wechatno:tangjinjinwx * @param ctx * @param vo ...

  7. Android 分享到微信6.0后好友、朋友圈

    文章出至:(源码可运行) http://blog.csdn.net/alfred_c/article/details/49722833 果               介绍 要实现微信分享,首先请认真 ...

  8. uniapp分享到微信好友和朋友圈

    uniapp分享到微信好友和朋友圈 首先目前的微信小程序只支持页面中右上角三个点触发分享功能,页面按钮只能触发分享至微信好友的功能 <template><view class=&qu ...

  9. 前端做微信好友分享_前端微信分享,调用微信分享,分享朋友圈,分享微信好友,分享qq空间,qq好友...

    项目中很多使用到微信分享的地方,对于前端来说也算很简单了,建议写该功能时使用微信调试工具,便于调试,直接上代码 第一步,引入微信配置文件 //这里的AJAX用于获取后台数据,当然也可以不用这么写,您只 ...

最新文章

  1. 微信第 1 行代码曝光,简陋到让你怀疑人生!
  2. 中国首个AI考级来了:共分10级,北大出题,工信部认证 | 在线可测,我最多活3级...
  3. Educational Codeforces Round 11C. Hard Process two pointer
  4. android studio module不识别 红色j,androidstudio 不显示 Module-- 新年第一波
  5. ffmpeg 截图 java_Java Web 中使用ffmpeg实现视频转码、视频截图
  6. ctf 改变图片高度_每天一分钟,python一点通(opencv的图片处理方法)
  7. 网络管理员掌握的学习方法
  8. Windows系统优化软件 | 这10款功能超级强大!界面优美!值得收藏
  9. 计算机组装与维修2版,清华大学出版社-图书详情-《计算机组装与维护维修(第2版)》...
  10. 语音信号处理的过程及其应用
  11. android 打apk文件怎么打开方式,apk文件怎么打开,详细教您打开apk文件的方法
  12. 【优先队列】Toda 2
  13. imagebutton图片缩放
  14. echarts按照时间显示柱状图_Echarts制作时间柱形离散分布图
  15. MySQL COUNT(*) 和 COUNT(1) 比较
  16. starUML4.0导出的图片去除水印的方法
  17. (转)如何获得两个日期相减的天数?
  18. 白盒测试及其基本方法
  19. 漂亮的红色玫瑰花——情人节-圣诞节专属-代码实现
  20. Mysql 安装与基础

热门文章

  1. 盗版软件的制作流程及制作周期
  2. 关于记事本的实现原理
  3. 远离“灰色地带”,网络视频变革中
  4. Flash使用服务器时间
  5. JQuery中的CSS属性及操作
  6. mysql离线二进制安装
  7. 最终幻想7php攻略,PS5最终幻想7重制版图文攻略 全流程剧情详细攻略(3)
  8. 笔记56--listview之selector、listview中同一时刻只有一个item能被选中
  9. 打怪上分! 手写Spring ioc 框架,狠狠的“撸撸”Spring 源码
  10. 贴吧楼中楼回复机器人_GitHub - giuem/TieBaRobot: [NOT MAINTENANCE]百度贴吧机器人,可回复@和楼中楼对话...