package com.fslk.modules.infoshare.rest.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.fslk.modules.infoshare.rest.UrlParam;
import com.fslk.modules.infoshare.rest.service.HttpUtil;
import com.fslk.modules.infoshare.rest.service.WxSignService;
import com.fslk.utils.RedisUtils;
import jodd.net.URLDecoder;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* @Author: pll
* @Description: 无
*/
@Service
@AllArgsConstructor
/**
* <p>微信相关</p>
* @date : 2021-10-08 15:26
**/
public class WxSignServiceImpl implements WxSignService {
private static final String app_id = "XXXXX";
private static final String app_secret = "XXXX";
private final RedisUtils redisUtil;
/**
* 获取signature(微信分享)
*/
@Override
public Map<String, Object> getSignature(UrlParam param) {
if(param == null || StringUtils.isBlank(param.getUrl())){
return null;
}
//获取jsapi_ticket
String jsapi_ticket = getJsapiTicket();
if(StringUtils.isBlank(jsapi_ticket)) {
return null;
}
return sign(jsapi_ticket, URLDecoder.decode(param.getUrl(), "UTF-8"));
}
//获取jsapi_ticket
private String getJsapiTicket(){
//redis中是否存在
Object wx_access_token = redisUtil.get("wx_jsapi_ticket");
if(wx_access_token != null) {
return String.valueOf(wx_access_token);
}
String jsapi_ticket = "";
String accessToken = getAccessToken();
if(StringUtils.isBlank(accessToken)){
return jsapi_ticket;
}
//定义请求信息
StringBuilder url = new StringBuilder("https://api.weixin.qq.com/cgi-bin/ticket/getticket");
url.append("?");
url.append("type=jsapi");
url.append("&");
url.append("access_token=" + accessToken);
//请求微信获取jsapi_ticket
String sentGet = HttpUtil.sentGet(String.valueOf(url));
if(StringUtils.isBlank(sentGet)){
return jsapi_ticket;
}
JSONObject jsonObject = JSONObject.parseObject(sentGet);
if(jsonObject.containsKey("ticket")){
jsapi_ticket = jsonObject.getString("ticket");
//存入redis 1.5小时(微信过期机制为2小时)
redisUtil.set("wx_jsapi_ticket", jsapi_ticket, 60 * 90);
}
return jsapi_ticket;
}
//获取access_token
private String getAccessToken(){
//redis中是否存在
Object wx_access_token = redisUtil.get("wx_access_token");
if(wx_access_token != null) {
return String.valueOf(wx_access_token);
}
//定义请求信息
StringBuilder url = new StringBuilder("https://api.weixin.qq.com/cgi-bin/token");
url.append("?");
url.append("grant_type=client_credential");
url.append("&");
url.append("appid=" + app_id);
url.append("&");
url.append("secret=" + app_secret);
String access_token = "";
//请求微信获取access_token
String sentGet = HttpUtil.sentGet(String.valueOf(url));
if(StringUtils.isBlank(sentGet)){
return access_token;
}
JSONObject jsonObject = JSONObject.parseObject(sentGet);
if(jsonObject.containsKey("access_token")){
access_token = jsonObject.getString("access_token");
//存入redis 1.5小时(微信过期机制为2小时)
redisUtil.set("wx_access_token", access_token, 60 * 90);
}
return access_token;
}
//获取签名signature
public static Map<String, Object> sign(String jsapi_ticket, String url) {
Map<String, Object> ret = new HashMap<>();
String nonce_str = create_nonce_str();
String timestamp = create_timestamp();
String string1;
String signature = "";
//注意这里参数名必须全部小写,且必须有序
string1 = "jsapi_ticket=" + jsapi_ticket +
"&noncestr=" + nonce_str +
"×tamp=" + timestamp +
"&url=" + url;
try{
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(string1.getBytes("UTF-8"));
signature = byteToHex(crypt.digest());
}catch (NoSuchAlgorithmException e){
e.printStackTrace();
}catch (UnsupportedEncodingException e){
e.printStackTrace();
}
ret.put("url", url);
ret.put("jsapi_ticket", jsapi_ticket);
ret.put("nonceStr", nonce_str);
ret.put("timestamp", timestamp);
ret.put("signature", signature);
ret.put("appid", app_id);
return ret;
}
private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash)
{
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
//生成签名的随机串
private static String create_nonce_str() {
return UUID.randomUUID().toString();
}
//生成签名的时间戳
private static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}
}

variation8
- 粉丝: 70
最新资源
- (源码)基于Arduino IoT云平台的物联网传感器监控系统.zip
- 双面钻铣组合机PLC控制系统研发设计方案[].doc
- 单片机楼道照明灯设计方案.doc
- 中国联通GSM网络优化服务实施方案.doc
- MCGS组态软件课程设计---基于MCGS组态软件实现自动门设计.doc
- 基于计算机人工智能技术的应用与未来发展分析.docx
- 5G网络切片技术浅析.docx
- PLC机械手控制设计方案.doc
- 培训资料移动营销的互联网实现.ppt
- (源码)基于LoRa和AESMAC的无线传感器网络安全防护系统.zip
- 数据仓库系统在移动通信网管的应用探讨.doc
- C程序设计循环结构程序设计.doc
- 基于BS模式单片机学习系统的方案设计书与实现在线学习大学本科方案设计书.doc
- 基于央行发行的数字货币的区块链技术研究.docx
- 大数据支持下智慧城市规划建设.docx
- 2009年2011年系统集成项目管理工程师试题题答案解析.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



评论1