您当前的位置: 首页 >  学无止境 >  文章详情

java后台实现获取微信签名signature

时间: 2025-09-21 【学无止境】 阅读量:共10人围观

简介 Java调用微信接口获取signature签名的过程,包括获取appId和appSecret、Access token、jsapi_ticket,以及如何根据这些信息拼接和加密生成签名,并将其返回给前端。

大致步骤如下:

  1. 在官网生成appId 与 appSecret,然后通过appId 与 appSecret调用接口获取到Access token

  2. 通过Access token调用微信提供的接口获取到jsapi_ticket

  3. 最后使用jsapi_ticket、随机字符串、时间戳、url拼接字符串,在使用sha1进行加密得到签名

  4. 将appid、时间戳、随机字符串、签名返回给前端

实现代码如下

public class WxUtils { private final static String appId = "********"; private final static String secret = "*****************"; /** * 微信获取 AccessToken */ public static final String ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token"; /** * 基础jsapi_ticket请求url */ private final static String TicketReqUrl = " https://api.weixin.qq.com/cgi-bin/ticket/getticket"; /** * 获取accesstoken * @return */ private static AccessTokenVo getAccessToken() { // 使用缓存,默认有效期是7200s AccessTokenVo token = (AccessTokenVo) RedisUtils.get("accessToken"); if (token != null) { return token; } HttpResponse response = HttpRequest.get(ACCESS_TOKEN + "?grant_type=client_credential&appid="+ appId +"&secret=" + secret) .header("Content-Type", "application/json") // 设置请求头 .execute(); // 打印响应结果 if (response.isOk()) { System.out.println("推送请求成功,响应内容:" + response.body()); AccessTokenVo myObject = JSONUtil.toBean(response.body(), AccessTokenVo.class); RedisUtils.set("accessToken", myObject, (long)myObject.getExpires_in(), TimeUnit.SECONDS); return myObject; } else { System.out.println("推送请求失败,状态码:" + response.getStatus() + ",响应内容:" + response.body()); } return null; } /** * 生成随机字符 最长32位 */ private static String randomStr(){ String ss = (Math.random() * 100000000) + ""; if(ss.length() > 32){ return ss.substring(0,32); } return ss; } /** * 获取ticket * @return */ private static TicketVo getTicket(String accessToken) { // // 使用缓存,默认有效期是7200s TicketVo ticket = (TicketVo) RedisUtils.get("ticket"); if (ticket != null) { return ticket; } HttpResponse response = HttpRequest.get(TicketReqUrl + "?access_token="+ accessToken +"&type=jsapi") .header("Content-Type", "application/json") // 设置请求头 .execute(); // 打印响应结果 if (response.isOk()) { System.out.println("推送请求成功,响应内容:" + response.body()); TicketVo myObject = JSONUtil.toBean(response.body(), TicketVo.class); RedisUtils.set("ticket", myObject, (long)myObject.getExpires_in(), TimeUnit.SECONDS); return myObject; } else { System.out.println("推送请求失败,状态码:" + response.getStatus() + ",响应内容:" + response.body()); } return null; } /** * 生成签名字符数据 */ public static SignVo getSignData(String url){ AccessTokenVo accessToken = getAccessToken(); TicketVo ticketVo = getTicket(accessToken.getAccess_token()); String noncestr = randomStr(); Date time = new Date(); long timestamp = time.getTime() / 1000; String autograph = autograph(ticketVo.getTicket(), noncestr, timestamp, url); SignVo vo = new SignVo(); vo.setAppId(appId); vo.setNonceStr(noncestr); vo.setSignature(autograph); vo.setTimestamp(timestamp); return vo; } /** * 生成签名数据 */ private static String autograph(String ticket,String noncestr,long timestamp,String url){ StringBuilder builder = new StringBuilder(); builder.append("jsapi_ticket=") .append(ticket) .append("&noncestr=") .append(noncestr) .append("&timestamp=") .append(timestamp) .append("&url=") .append(url); byte[] bytes = DigestUtils.sha1(builder.toString()); StringBuilder sb = new StringBuilder(); for (byte item : bytes) { sb.append(Integer.toHexString((item & 0xFF) | 0x100), 1, 3); } return sb.toString(); } }

SignVo

/** * 功能描述: * @Param: * @Return: * @Author: zhangfuxiang * @Date: 2025/9/17 13:35 */ @Data @ApiModel public class SignVo { /** * appId */ private String appId; /** * 时间戳 */ private long timestamp; /** * 随机字符串 */ private String nonceStr; /** * 签名字符串 */ private String signature; }

AccessTokenVo

@Data @ApiModel public class AccessTokenVo { /** * access_token */ private String access_token; /** * 过期时间 */ private int expires_in; }

TicketVo

@Data @ApiModel public class TicketVo { /** * ticket */ private String ticket; /** * 过期时间 */ private int expires_in; }

上一篇:Java 字符串替换全解析

下一篇:微信浏览器原生拉取微信支付

文章评论
Copyright (C) 2023- 小祥驿站 保留所有权利 蜀ICP备 17034318号-2  公安备案号 50010302004554