最近写了一个小微信签名功能,记录一下希望用到的朋友可以参考下。

RestController
@RequestMapping("/api/wx")
public class WeixinAction {
private static final Logger logger = LoggerFactory.getLogger(WeixinAction.class);
private static final String appId = "appId";
@Autowired
RestTemplate restTemplate;
@Autowired
RedisClient redisClient; @RequestMapping("/WeixinAction_getWXConfigSignature")
public String getWXConfigSignature(@RequestBody JSONObject reqJson) {
String url = reqJson.getString("url");
logger.info("原始URL: " + url);
long timeStampSec = System.currentTimeMillis() / 1000;
String timestamp = String.format("%010d", timeStampSec);
String nonceStr = getRandomStr(8);
String[] urls = url.split("#");
String newUrl = urls[0];
logger.info("随机串:"+nonceStr+", 获取签名URL: " + newUrl);
JSONObject respJson = new JSONObject();
String[] signArr = new String[]{"url=" + newUrl, "jsapi_ticket=" + getWXJsapiTicket(), "noncestr=" + nonceStr, "timestamp=" + timestamp};
Arrays.sort(signArr);
String signStr = StringUtils.join(signArr, "&");
String resSign = DigestUtils.sha1Hex(signStr); logger.info("返回的签名:" + resSign);
respJson.put("appId", appId);
respJson.put("timestamp", timestamp);
respJson.put("nonceStr", nonceStr);
respJson.put("signature", resSign);
logger.info(respJson.toJSONString());
JsonObject jsonObject = BaseCode.retCode(ResultCode.success);
jsonObject.putValue("resp", respJson);
return jsonObject.toString();
} private String getWXJsapiTicket() {
String ticket = redisClient.getStr(appId);
if (StringUtils.isBlank(ticket)) {
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + getWXaccessToken() + "&type=jsapi";
String resp = restTemplate.getForObject(url, String.class);
JSONObject resJson = JSONObject.parseObject(resp);
logger.info("获取到ticket:" + resJson.getString("ticket"));
redisClient.setStr(appId, resJson.getString("ticket"), SystemConstants.ONE_HOURS * 2);
return resJson.getString("ticket");
}
return ticket;
} private String getWXaccessToken() {
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appId+"&secret=secret";
String resp = restTemplate.getForObject(url, String.class);
JSONObject resJson = JSONObject.parseObject(resp);
logger.info("获取到access_token:" + resJson.getString("access_token"));
return resJson.getString("access_token");
} public static String getRandomStr(int length) {
String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
int randomNum;
char randomChar;
Random random = new Random();
// StringBuffer类型的可以append增加字符
StringBuffer str = new StringBuffer(); for (int i = 0; i < length; i++) {
// 可生成[0,n)之间的整数,获得随机位置
randomNum = random.nextInt(base.length());
// 获得随机位置对应的字符
randomChar = base.charAt(randomNum);
// 组成一个随机字符串
str.append(randomChar);
}
return str.toString();
}
}

  

微信分享签名Java代码实现的更多相关文章

  1. H5+.Net Webapi集成微信分享前后端代码 微信JS-SDK wx.onMenuShareTimeline wx.onMenuShareAppMessage

    说明: 1/因为赚麻烦这里没有使用数据库或服务器缓存来存储access_token和jsapi_ticket,为了方便这里使用了本地的xml进行持久化这两个值以及这两个值的创建时间和有限期限. 2/每 ...

  2. Android 微信分享与QQ分享功能

    微信分享与QQ分享功能现在都挺常见的,可以根据一些第三方社会化分功能快速实现,不过多多少少都不怎么纯净,最好都是自己看官方文档来实现就最好了~ 一.微信分享 微信分享功能需要先在微信开放平台注册应用并 ...

  3. java菜鸟之微信分享

    前言:我终于理解了什么叫做教科书:教科书就是把一些简单容易的知识写成一堆谁都看不懂的书,这,就简称“教科书” 这些天接触到微信分享以及回调的问题,因为之前没接触过,所以这次做这个分享,碰了一点点壁,特 ...

  4. Java微信分享接口开发

    发布时间:2018-11-07   技术:springboot+maven   概述 微信JS-SDK实现自定义分享功能,分享给朋友,分享到朋友圈 详细 代码下载:http://www.demodas ...

  5. 微信分享接口的java开发的一些小步骤

    1.配置接口信息进行验证 代码如下: /**     * 访问没认证的地址跳转     *     * @param request     * @return 登录页面     * @throws ...

  6. 玩玩微信公众号Java版之七:自定义微信分享

    前面已经学会了微信网页授权,现在微信网页的功能也可以开展起来啦! 首先,我们先来学习一下分享,如何在自己的页面获取分享接口及让小伙伴来分享呢? 今天的主人公: 微信 JS-SDK, 对应官方链接为:微 ...

  7. 微信分享JSSDK-invalid signature签名错误的解决方案

    核对官方步骤,确认签名算法. 确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验. 确认con ...

  8. Android集成微信分享功能应用签名生成方法及分享不生效的问题

    通过友盟sdk集成微博.微信.qq等分享功能时,微博和qq很顺利,但在做微信集成时一直不成功.主要问题还是之前在微信开放平台申请创建移动应用时,对应用签名没有填写对,走了很多弯路现总结出来,加深记忆避 ...

  9. 微信分享jssdk config:invalid signature 签名错误

    使用微信分享时,按照官方给的demo,使用时一直提示签名错误. 根据微信开发文档(http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd ...

随机推荐

  1. Floyd求字典序最小的路径

    hdu1384 Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  2. Oracle等待事件之db file scattered read

    1.产生原因 该等待事件通常发生在数据库多块读时,表示发生了与全表扫描和快速索引扫描相关的等待.通常意味着全表扫描过多,或者I/O 能力不足,或者I/O 竞争. 2.确定产生问题对象方法 a)查找全表 ...

  3. Windows:子线程中创建窗口

    一般来讲,UI的所有操作都必须在主线程,否则会出现未知错误.但有时候我们会需要一个功能比较单一的窗口,同时希望他在一个单独的线程运行.并不影响主线程的效率. 下面说明一下新建子线程创建的新窗口的方法, ...

  4. 【apt install】Unable to locate package python3-pip

    解决办法: 先 sudo apt update 然后再 sudo apt install python3-pip,完成. 如果还不行的话参考这个:

  5. django-mvvm(django的FormObject)

    MVVM简介 MVVM模式是Model-View-ViewMode模式的简称.由视图(View).视图模型(ViewModel).模型(Model)三部分组成,结构如下图.通过这三部分实现UI逻辑.呈 ...

  6. Spring boot maven 搭建框架

    Spring Boot:目的:这个框架帮助开发者更容易地创建基于Spring的应用程序和服务,使得pring开发者能够最快速地获得所需要的Spring功能.优点:完全不需要XML配置,让spring应 ...

  7. 101-advanced-React易用性,概述

    React完全支持构建可访问的网站,通常使用标准的HTML技术. 1.可访问小部件 ARIA文档包含用于构建完全可访问的JavaScript小部件的技术. JSX完全支持所有aria- * HTML属 ...

  8. Mysql学习笔记—时间计算、年份差、月份差、天数差(转载)

    1.获取当前日期 SELECT NOW(),CURDATE(),CURTIME(); 结果类似: 2. 获取前一天 DAY); 当前日期2018-09-17,结果: 3. 获取后一天 DAY); 当前 ...

  9. [py]数据描述符优先级

    实例查找属性的顺序: 类属性 > 数据描述符 > 实例属性 > 非数据描述符 > __getattr__ 类属性>数据描述符>实例属性 class Str: def ...

  10. soapUi下载

    http://dl.eviware.com/list_soapui2.html http://smartbearsoftware.com/repository/eviware/jars/