加密

package com.itsoft.customer.commons.wx;import java.security.MessageDigest;public class Sha1 {private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5','6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};private static String getFormattedText(byte[] bytes) {int len = bytes.length;StringBuilder buf = new StringBuilder(len * 2);// 把密文转换成十六进制的字符串形式for (int j = 0; j < len; j++) {buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);buf.append(HEX_DIGITS[bytes[j] & 0x0f]);}return buf.toString();}public static String encode(String str) {if (str == null) {return null;}try {MessageDigest messageDigest = MessageDigest.getInstance("SHA1");messageDigest.update(str.getBytes());return getFormattedText(messageDigest.digest());} catch (Exception e) {throw new RuntimeException(e);}}
}

随机字符串

package com.itsoft.customer.commons.wx;import java.util.Random;public class RandomStr {private static char ch[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G','H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b','c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w','x', 'y', 'z', '0', '1' };//最后又重复两个0和1,因为需要凑足数组长度为64private static Random random = new Random();//生成指定长度的随机字符串public static String createRandomString(int length) {if (length > 0) {int index = 0;char[] temp = new char[length];int num = random.nextInt();for (int i = 0; i < length % 5; i++) {temp[index++] = ch[num & 63];//取后面六位,记得对应的二进制是以补码形式存在的。num >>= 6;//63的二进制为:111111// 为什么要右移6位?因为数组里面一共有64个有效字符。为什么要除5取余?因为一个int型要用4个字节表示,也就是32位。}for (int i = 0; i < length / 5; i++) {num = random.nextInt();for (int j = 0; j < 5; j++) {temp[index++] = ch[num & 63];num >>= 6;}}return new String(temp, 0, length);}else if (length == 0) {return "";}else {throw new IllegalArgumentException();}}public static void main(String[] args) {System.out.println(createRandomString(16));}
}

发送请求

package com.itsoft.customer.controller;import cn.hutool.json.JSONUtil;
import com.itsoft.customer.commons.interceptor.ResponseResult;
import com.itsoft.customer.commons.wx.RandomStr;
import com.itsoft.customer.commons.wx.Sha1;
import com.itsoft.framework.core.data.DataMap;
import com.itsoft.framework.core.data.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpResponseException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.URI;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping(value = "/frontendGetWx", produces = "application/json;charset=UTF-8")
@ResponseResult
@Api(value = "(getWx)getWx 微信权限", tags  = "(getWx)getWx 微信权限")
public class ShareController extends CommonController{/*** 微信公众号的appid*/private String appid="wx";/*** 微信公众号的appSecret*/private String secret="db";/*** 获取微信分享配置的请求  方法只写了主要方法,需要根据自己的要求 完善代码* @param url 前台传过来的当前页面的请求地址* @return*/@ApiOperation(notes = "获取微信分享配置的请求  方法只写了主要方法,需要根据自己的要求 完善代码", value = "获取微信分享配置的请求  方法只写了主要方法,需要根据自己的要求 完善代码")@RequestMapping(value = "/getWxConfig",method = RequestMethod.POST)public Result share(String url){long timestamp = System.currentTimeMillis() / 1000;String noncestr = RandomStr.createRandomString(16);String ticket =getJsapiTicket();String str = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url;logger.info("===============签名str:{}============" , str);String signature = Sha1.encode(str);//这只是简单写法,没有做错误判断Map map=new HashMap();map.put("appId",appid);map.put("timestamp",timestamp);map.put("nonceStr",noncestr);map.put("signature",signature);//这里使用了hutool工具将map转为String// String json = JSONUtil.toJsonStr(map);return Result.success(map);}/*** 官方文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#62** 获取jsapi_ticket***  生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。*  正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。*  由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。** 参考以下文档获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token):* https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html** 用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket):* https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi** @return*/public String getJsapiTicket() {String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential";tokenUrl = tokenUrl + "&appid=" + appid + "&secret=" + secret;JSONObject tokenJson=new JSONObject();tokenJson=getUrlResponse(tokenUrl);logger.info("===============tokenJson:{}============" , tokenJson.toString());String token="";try {token=tokenJson.getString("access_token");} catch (JSONException e) {e.printStackTrace();logger.info("===============报错了{}============" , e);System.out.println("报错了");return null;}String jsapiTicketUrl="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";JSONObject jsapiTickeJson=new JSONObject();System.out.println("getJsapiTicket:获取token:"+token);if(StringUtils.isNotBlank(token)){jsapiTicketUrl = jsapiTicketUrl.replace("ACCESS_TOKEN",token);jsapiTickeJson=getUrlResponse(jsapiTicketUrl);// System.out.println("tokenJson:"+jsapiTickeJson.toString());logger.info("===============tokenJson:{}============" ,jsapiTickeJson.toString());try {return (String) jsapiTickeJson.get("ticket");} catch (JSONException e) {e.printStackTrace();return null;}}else{return null;}}private  JSONObject getUrlResponse(String url){CharsetHandler handler = new CharsetHandler("UTF-8");try {HttpGet httpget = new HttpGet(new URI(url));HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();//HttpClientCloseableHttpClient client = httpClientBuilder.build();client = (CloseableHttpClient) wrapClient(client);return new JSONObject(client.execute(httpget, handler));} catch (Exception e) {e.printStackTrace();return null;}}private static HttpClient wrapClient(HttpClient base) {try {SSLContext ctx = SSLContext.getInstance("TLSv1");X509TrustManager tm = new X509TrustManager() {public void checkClientTrusted(X509Certificate[] xcs,String string) throws CertificateException {}public void checkServerTrusted(X509Certificate[] xcs,String string) throws CertificateException {}public X509Certificate[] getAcceptedIssuers() {return null;}};ctx.init(null, new TrustManager[] { tm }, null);SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(ctx, new String[] { "TLSv1" }, null,SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();return httpclient;} catch (Exception ex) {return null;}}private class CharsetHandler implements ResponseHandler<String> {private String charset;public CharsetHandler(String charset) {this.charset = charset;}public String handleResponse(HttpResponse response)throws ClientProtocolException, IOException {StatusLine statusLine = response.getStatusLine();if (statusLine.getStatusCode() >= 300) {throw new HttpResponseException(statusLine.getStatusCode(),statusLine.getReasonPhrase());}HttpEntity entity = response.getEntity();if (entity != null) {if (!StringUtils.isBlank(charset)) {return EntityUtils.toString(entity, charset);} else {return EntityUtils.toString(entity);}} else {return null;}}}}

java微信分享功能(分享给好友/分享到朋友圈)相关推荐

  1. 互联网早报:淘宝发布购物车分享功能,双十一有望分享微信朋友圈

    行业热点 1.淘宝发布购物车分享功能,双十一有望分享微信朋友圈: 2.微信小号来了:正测试新功能,同一个手机号可注册两个微信号: 3.京东汽配App上线 传统汽车后市场供应链面临冲击: 4.阿里在海外 ...

  2. android+分享微信朋友圈带编辑功能,新功能 微信6.6.6安卓版发布:朋友圈编辑可保留...

    原标题:新功能 微信6.6.6安卓版发布:朋友圈编辑可保留 [PConline资讯]本月月初,微信团队向iOS用户推送了微信6.6.6的更新,而安卓用户则只能够参加到新版的Beta测试中去.就在今天, ...

  3. java 微信自动回复功能开发

    java 微信自动回复功能开发 准备文件: JCE无限制权限策略文件,里面是对应jdk6和7的文件 官网下载地址是http://www.oracle.com/technetwork/java/java ...

  4. PC微信3.3.0内测版(新增朋友圈功能)

    一直以来微信都被大家广泛的使用着,而今日小编要介绍的是微信3.3.0内测版,这是一款知名度极高的社交聊天软件,并且该版本是由腾讯于近期官方推出的一个最新的电脑内测版本,相信在电脑中安装使用过微信的小伙 ...

  5. android相册隐藏拍照按钮,你绝对不知道的4大手机“隐藏”拍照功能!学会100%惊艳朋友圈!...

    原标题:你绝对不知道的4大手机"隐藏"拍照功能!学会100%惊艳朋友圈! 作者 | 蚂蚁MaE 编辑 | 智慧 Hello大家早上好鸭~我是智慧 最近我在朋友圈发了一张照片 底下都 ...

  6. 调用个人微信API协议接口收发消息,发朋友圈

    调用个人微信API协议接口收发消息,发朋友圈 java调用个人微信的API接口收发消息 /** * 接受微信好友发来聊天消息 * @author wechatno:tangjinjinwx * @pa ...

  7. 微信重大更新,mac版可刷朋友圈!可以看,可以评论! 支持M1

    微信重大更新,mac版可刷朋友圈!可以看,可以评论!微信Mac电脑版是官方推出的针对Mac用户设计的客户端产品,Mac上有六亿多庞大用户群体在使用微信客户端聊天工具,可以发送文字.语音.图片和视频,还 ...

  8. Android Studio 微信分享功能(包括可以分享到朋友圈,分享到朋友)

    第一步:配置sdk 在build.gradle文件中,添加如下依赖即可: 在Android Studio中新建你的工程,并保证网络设置可以成功从jcenter下载微信SDK即可. dependenci ...

  9. 2015最新微信分享功能开发,自定义分享内容。

    在2015年之前很长一段时间,微信分享功能,只需要页面埋几段js代码即可捕获用户点击分享按钮的事情,并且自定义. 但后来微信的新版本里已经屏蔽了次方法直接调用分享接口 需要在服务端坐一点开发工作. 当 ...

  10. 程序员圣诞节相册源码_程序员分享圣诞刷屏源码,这次朋友圈千万不要再@微信官方了!...

    明天就到圣诞节了 每年到这个时候,朋友圈里都会掀起@微信官方要「圣诞皮肤」的骚操作,最常见的就是加个圣诞小帽了. 当然这种事情很多 P 图软件都可以做到,但在使用这些软件时,经常会被要求绑定微信等个人 ...

最新文章

  1. quartus编译错误不支持芯片_介绍一下如何重新编译Arduino 16U2 的Firmware
  2. AI芯片浪潮:创新企业造芯抢夺物联网时代制高点
  3. 《中国人工智能开源软件发展白皮书(2018)》(附下载及解读PPT)
  4. [译] 写给前端开发者的 GraphQL 指南
  5. python基础教程第4版-Python基础教程(第3版) 笔记(四)
  6. 数据库集群 MySQL主从复制
  7. web.xml中如何配置Servlet文件
  8. 一点杂感 以及 java8 Streams API 与 C# Linq 简要对比分析
  9. Linux C 函数指针应用---回调函数
  10. Centos7+Nginx+Keepalived实现Apache服务的高可用负载均衡
  11. java redis set list_RedisTemplate的各种操作(set、hash、list、string)_lichuangcsdn的博客-CSDN博客...
  12. 苦了我一年的选择,现在却是我最回味的时光
  13. 王思聪名下企业被拍卖1100万债权,此前还债20亿 网友:拍下等于“接盘侠”?...
  14. javascript函数参数的传递问题
  15. 惊!史上最佳GAN现身,超真实AI假照片,行家们都沸腾了
  16. C语言中你可能会用到的字符串函数的代码
  17. 替代 NetMeeting 的多人屏幕共享工具 InletexEMC 国外出品,永久免费
  18. 计算机右边键盘数字无效,巧妙解决电脑键盘右边的数字键失灵问题
  19. iView组件+Django实现前后端分离上传图片
  20. C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(中)

热门文章

  1. 全国计算机数学会议cm是ei收录,怎样判断一个会议已经被EI收录? - 学术会议 - 小木虫 - 学术 科研 互动社区...
  2. 谷歌SEO优化包含站外SEO、站内SEO以及技术SEO三个方面
  3. 中国民生银行 HBase 读写设计与实践
  4. 论文《Product-based Neural Networks for User Response Prediction》阅读
  5. Oracle分区表介绍
  6. 关注融入到我们生活当中方方面面的人工智能
  7. nb-iot物联网套件_输入以赢得SparkFun的IoT电子套件
  8. (6)成本计算题:挣值分析--信息系统项目管理师考试系列
  9. Hibernate 快速入门
  10. 工单派单管理系统一体化管理,实现APP+PC端多渠道派工