You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

260 lines
11 KiB
Java

package com.bsd.say.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
5 years ago
import com.bsd.say.config.RedisProperies;
import com.bsd.say.entities.Record;
import com.bsd.say.mapper.RecordMapper;
5 years ago
import com.bsd.say.service.RedisService;
5 years ago
import com.bsd.say.util.AESWithJCEUtils;
import com.bsd.say.util.HttpRequestUtils;
import com.bsd.say.util.LogUtils;
5 years ago
import com.bsd.say.util.wechat.Sign;
5 years ago
import me.chanjar.weixin.open.api.impl.WxOpenInRedisConfigStorage;
import me.chanjar.weixin.open.api.impl.WxOpenMessageRouter;
import me.chanjar.weixin.open.api.impl.WxOpenServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
5 years ago
import redis.clients.jedis.JedisPool;
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Service
5 years ago
public class WeixinService extends WxOpenServiceImpl {
@Value("${wechat.aesKey}")
private String aesKey;
@Value("${wechat.componentToken}")
private String componentToken;
@Value("${wechat.appId}")
private String appId;
@Value("${wechat.componentAppId}")
private String componentAppId;
@Value("${wechat.componentAppSecret}")
private String componentAppSecret;
@Value("${wechat.getComponentAccessTokenUrl}")
private String getComponentAccessTokenUrl;
@Value("${wechat.getAccessTokenUrl}")
private String getAccessTokenUrl;
@Value("${wechat.getUnionIdUrl}")
private String getUnionIdUrl;
@Value("${wechat.getWxUserInfoUrl}")
private String getWxUserInfoUrl;
5 years ago
@Value("${wechat.getTicketUrl}")
private String getTicketUrl;
@Resource
private RedisTemplate redisTemplate;
@Resource
private RecordMapper recordMapper;
private WxOpenMessageRouter wxOpenMessageRouter;
5 years ago
@Resource
private RedisService redisService;
Logger logger = LogUtils.getBussinessLogger();
5 years ago
/**
* accessToken
*/
5 years ago
public void refreshComponentAccessToken() {
RedisProperies redisProperies = new RedisProperies();
JedisPool pool =
5 years ago
new JedisPool(redisProperies, redisProperies.getHost(),
redisProperies.getPort(), redisProperies.getConnectionTimeout(),
redisProperies.getSoTimeout(), redisProperies.getPassword(),
redisProperies.getDatabase(), redisProperies.getClientName(),
redisProperies.isSsl(), redisProperies.getSslSocketFactory(),
redisProperies.getSslParameters(), redisProperies.getHostnameVerifier());
try {
WxOpenInRedisConfigStorage inRedisConfigStorage = new WxOpenInRedisConfigStorage(pool);
inRedisConfigStorage.setComponentAppId(componentAppId);
inRedisConfigStorage.setComponentAppSecret(componentAppSecret);
inRedisConfigStorage.setComponentToken(componentToken);
inRedisConfigStorage.setComponentAesKey(aesKey);
setWxOpenConfigStorage(inRedisConfigStorage);
wxOpenMessageRouter = new WxOpenMessageRouter(this);
5 years ago
String ComponentVerifyTicket = inRedisConfigStorage.getComponentVerifyTicket();
5 years ago
logger.info("ComponentVerifyTicket" + ComponentVerifyTicket);
JSONObject jsonObject = new JSONObject();
jsonObject.put("component_appid", componentAppId);
jsonObject.put("component_appsecret", componentAppSecret);
jsonObject.put("component_verify_ticket", ComponentVerifyTicket);
5 years ago
String post = HttpRequestUtils.sendPost(getComponentAccessTokenUrl, jsonObject);
// logger.debug("====================返回post结果" + post);
HashMap<String, String> hashMap = JSON.parseObject(post, HashMap.class);
String componentAccessToken = hashMap.get("component_access_token");
if (StringUtils.isNotEmpty(componentAccessToken)) {
redisTemplate.opsForValue().set("component_access_token", componentAccessToken, 60 * 60 * 2, TimeUnit.SECONDS);
String accessToken = redisTemplate.opsForValue().get("component_access_token").toString();
5 years ago
System.out.println("accessToken" + accessToken);
// logger.debug("====================令牌component_access_token】【" + accessToken + "】====================");
} else {
throw new RuntimeException("微信开放平台,第三方平台获取【令牌】失败");
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* accessToken
5 years ago
*
* @return
*/
5 years ago
public JSONObject getAccessToken(String code) {
String component_access_token = redisTemplate.opsForValue().get("component_access_token").toString();
String param = appId + "&code=" + code + "&grant_type=authorization_code&component_appid=" + componentAppId
+ "&component_access_token=" + component_access_token;
String url = getAccessTokenUrl + param;
String result = HttpRequestUtils.sendGet(url);
JSONObject resultJson = JSONObject.parseObject(result);
return resultJson;
}
/**
* unionId
5 years ago
*
* @param code
* @return
*/
5 years ago
public String getUnionId(String code) {
JSONObject jsonObject = getAccessToken(code);
String accessToken = jsonObject.getString("access_token");
String openid = jsonObject.getString("openid");
String param = accessToken + "&openid=" + openid + "&lang=zh_CN";
String url = getUnionIdUrl + param;
String result = HttpRequestUtils.sendGet(url);
JSONObject resultJson = JSONObject.parseObject(result);
String unionId = resultJson.getString("unionid");
return unionId;
}
5 years ago
/**
* openId()
*/
5 years ago
public JSONObject getUserInfoByOpenId(String openId) {
5 years ago
String result1 = HttpRequestUtils.sendGet("https://api.weq.me/wx/token.php?id=15969759463491&key=1234567890123456");
JSONObject result2 = JSONObject.parseObject(result1);
String result3 = result2.getString("access_token");
String pubkey = "1234567890123456";
String iv = "WJi7HTZQoh8eHjup";
String decode = AESWithJCEUtils.aesDecode(result3, pubkey, iv);
String resutl = HttpRequestUtils.sendGet("https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + decode + "&openid=" + openId + "&lang=zh_CN");
JSONObject jsonObject = JSONObject.parseObject(resutl);
5 years ago
logger.info("userInfo:" + jsonObject.toString());
5 years ago
return jsonObject;
}
5 years ago
/**
* accessTokenticket
*/
5 years ago
public String getTicket() {
5 years ago
String access_token = fetchAccessToken();
5 years ago
String getTicketNewUrl = getTicketUrl + access_token + "&type=jsapi";
String ticketResult = HttpRequestUtils.sendGet(getTicketNewUrl);
JSONObject ticketJson = JSONObject.parseObject(ticketResult);
String jsapi_ticket = ticketJson.getString("ticket");
5 years ago
// redisTemplate.opsForValue().set("jsapi_ticket",jsapi_ticket);
return jsapi_ticket;
5 years ago
}
5 years ago
public Map<String, String> getSign(String url) {
5 years ago
String jsapiTicket = getTicket();
5 years ago
logger.info("jsapiTicket:" + jsapiTicket);
Map<String, String> sign = Sign.sign(jsapiTicket, url);
sign.put("appId", appId);
5 years ago
logger.info("sign:" + sign);
return sign;
}
/**
*
5 years ago
*
* @param openId
* @param subscribe
*/
5 years ago
public void insertRecord(String openId, Integer subscribe) {
logger.info("subscribe" + subscribe);
Record recordByOpenId = recordMapper.selectOne(Wrappers.<Record>lambdaQuery().eq(Record::getOpenId, openId)
.and(queryWrapper1 -> queryWrapper1.eq(Record::getState, 1)));
if (subscribe == 0) {
//未关注公众号
5 years ago
if (recordByOpenId == null) {
logger.info("新粉丝第一次进入");
Record record = new Record();
record.setOpenId(openId);
record.setFan("新粉丝");
record.setCreateDateTime(new Date());
recordMapper.insert(record);
5 years ago
} else {
logger.info("游客访问过,但未关注");
}
5 years ago
} else {
//关注过公众号
5 years ago
if (recordByOpenId == null) {
logger.info("老粉丝第一次进入");
Record record = new Record();
record.setOpenId(openId);
record.setFan("老粉丝");
record.setCreateDateTime(new Date());
recordMapper.insert(record);
5 years ago
} else {
logger.info("老粉丝访问过,已关注");
}
}
}
5 years ago
public JSONObject autoLogin(String openId) {
String userInfo = "";
if (redisService.exists(openId)) {
userInfo = redisService.get(openId).toString();
JSONObject jsonObject = JSONObject.parseObject(userInfo);
Integer subscribe = jsonObject.getInteger("subscribe");
insertRecord(openId, subscribe);
return jsonObject;
}
String accessToken = fetchAccessToken();
userInfo = HttpRequestUtils.sendGet("https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + accessToken + "&openid=" + openId + "&lang=zh_CN");
redisService.set(openId, userInfo.toString());
JSONObject jsonObject = JSONObject.parseObject(userInfo);
Integer subscribe = jsonObject.getInteger("subscribe");
insertRecord(openId, subscribe);
return jsonObject;
}
5 years ago
public String fetchAccessToken() {
5 years ago
String access_token = "";
//从cache中获取
if (redisService.exists("access_token")) {
access_token = redisService.get("access_token").toString();
return access_token;
}
String accessTokenResult = HttpRequestUtils.sendGet("https://api.weq.me/wx/token.php?id=15969759463491&key=1234567890123456");
JSONObject accessTokenObject = JSONObject.parseObject(accessTokenResult);
String aesAccessToken = accessTokenObject.getString("access_token");
Long expiresIn = accessTokenObject.getLongValue("expires_in");
String pubkey = "1234567890123456";
String iv = "WJi7HTZQoh8eHjup";
String accessToken = AESWithJCEUtils.aesDecode(aesAccessToken, pubkey, iv);
redisService.set("access_token", access_token, expiresIn - 1000);
return accessToken;
}
}