ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUserApplet.java
@@ -28,7 +28,7 @@ private Long userId; /** * 用户名 * 用户手机号 */ private String phone; /** @@ -45,4 +45,12 @@ * 登录IP地址 */ private String ipaddr; /** * 头像 */ private String avatar; /** * 地址 */ private String address; } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/TAppUserLoginInfo.java
New file @@ -0,0 +1,79 @@ package com.ruoyi.system.api.model; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.core.web.domain.BasePojo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.time.LocalDateTime; /** * <p> * * </p> * * @author luodangjia * @since 2024-08-06 */ @Data public class TAppUserLoginInfo extends BasePojo { private static final long serialVersionUID = 1L; private Long id; @ApiModelProperty(value = "用户") private String name; @ApiModelProperty(value = "手机号") private String phone; @ApiModelProperty(value = "头像") private String avatar; @ApiModelProperty(value = "会员id") private Integer vipId; @ApiModelProperty(value = "会员到期时间") private LocalDateTime vipEndTime; @ApiModelProperty(value = "单位id") private Integer companyId; @ApiModelProperty(value = "身份证号") private String idCard; @ApiModelProperty(value = "认证状态(0=否,1=是)") private Integer authStatus; @ApiModelProperty(value = "微信openid") private String wxOpenid; @ApiModelProperty(value = "支付宝openid") private String aliOpenid; @ApiModelProperty(value = "积分") private Integer points; @ApiModelProperty(value = "省名称") private String province; @ApiModelProperty(value = "省区划代码") private String provinceCode; @ApiModelProperty(value = "市名称") private String city; @ApiModelProperty(value = "市区划代码") private String cityCode; @ApiModelProperty(value = "状态(1=正常,2=冻结,3=注销)") private Integer status; @ApiModelProperty(value = "最后一次登录时间") private LocalDateTime lastLoginTime; } ruoyi-service/ruoyi-account/pom.xml
@@ -137,6 +137,12 @@ <scope>compile</scope> </dependency> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.38.10.ALL</version> </dependency> </dependencies> <build> ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/Constant/AliConstant.java
New file @@ -0,0 +1,10 @@ package com.ruoyi.account.ali.Constant; public class AliConstant { /** * 支付宝配置 */ public static final String GRANT_TYPE = "authorization_code"; } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/model/AliProperties.java
New file @@ -0,0 +1,70 @@ package com.ruoyi.account.ali.model; import lombok.ToString; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * @author xiaochen * @ClassName ALiProperties * @Description * @date 2024-08-14 13:55 */ @ToString @Component @ConfigurationProperties(prefix = "ali.conf") public class AliProperties { /** * 商户私钥,您的PKCS8格式RSA2私钥 */ private String privateKey; /** * 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。 */ private String alipayPublicKey; /** * 应用ID,您的APPID。 */ private String appId; /** * HTTP(S) 连接超时时间,单位毫秒 * */ public int getHttpConnectTimeoutMs() { return 6 * 1000; } /** * HTTP(S) 读数据超时时间,单位毫秒 */ public int getHttpReadTimeoutMs() { return 8 * 1000; } public String getPrivateKey() { return privateKey; } public void setPrivateKey(String privateKey) { this.privateKey = privateKey; } public String getAlipayPublicKey() { return alipayPublicKey; } public void setAlipayPublicKey(String alipayPublicKey) { this.alipayPublicKey = alipayPublicKey; } public String getAppId() { return appId; } public void setAppId(String appId) { this.appId = appId; } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/tools/AliAppletTools.java
New file @@ -0,0 +1,37 @@ package com.ruoyi.account.ali.tools; import com.alipay.api.AlipayConfig; import com.ruoyi.account.ali.model.AliProperties; import lombok.extern.slf4j.Slf4j; /** * @author xiaochen * @ClassName WxAppletTools * @Description * @date 2024-8-04 13:55 */ @Slf4j public class AliAppletTools { private static final String SERVER_URL = "https://openapi.alipay.com/gateway.do"; private AliProperties aliProperties; public AliAppletTools(AliProperties aliProperties) { this.aliProperties = aliProperties; } /** * 初始化支付宝配置 * @return */ public AlipayConfig getAlipayConfig() { AlipayConfig alipayConfig = new AlipayConfig(); alipayConfig.setServerUrl(SERVER_URL); alipayConfig.setAppId(aliProperties.getAppId()); alipayConfig.setPrivateKey(aliProperties.getPrivateKey()); alipayConfig.setAlipayPublicKey(aliProperties.getAlipayPublicKey()); return alipayConfig; } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AliLoginController.java
New file @@ -0,0 +1,91 @@ package com.ruoyi.account.controller; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.AlipayConfig; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.diagnosis.DiagnosisUtils; import com.alipay.api.request.AlipaySystemOauthTokenRequest; import com.alipay.api.response.AlipaySystemOauthTokenResponse; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.account.ali.Constant.AliConstant; import com.ruoyi.account.ali.model.AliProperties; import com.ruoyi.account.ali.tools.AliAppletTools; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.account.service.TAppUserService; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.system.api.model.LoginUserApplet; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; import java.util.Objects; /** * <p> * 支付宝小程序登录 前端控制器 * </p> * * @author xiaochen * @since 2024-08-06 */ @Slf4j @RestController @RequestMapping("/aliLogin") public class AliLoginController { @Autowired private AliProperties aliProperties; @Autowired private TAppUserService appUserService; @Autowired private TokenService tokenService; @ApiOperation(value = "通过code获得openid",tags = {"支付宝小程序登录"}) @GetMapping("/openIdByJsCode") public AjaxResult<Map<String, Object>> openIdByJsCode(@RequestParam(name = "code")@ApiParam(value = "code", required = true) String code) throws AlipayApiException { log.info("<<<<<<<<换取openid开始<<<<<<<<:{}", code); // 初始化SDK AlipayClient alipayClient = new DefaultAlipayClient(new AliAppletTools(aliProperties).getAlipayConfig()); // 构造请求参数以调用接口 AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); // 设置授权码 request.setCode(code); // 设置授权方式 request.setGrantType(AliConstant.GRANT_TYPE); AlipaySystemOauthTokenResponse response = alipayClient.execute(request); TAppUser appUser = null; if (response.isSuccess()) { String openId = response.getOpenId(); appUser = appUserService.getOne(Wrappers.lambdaQuery(TAppUser.class).eq(TAppUser::getAliOpenid, openId).last("limit 1")); if (Objects.isNull(appUser)) { appUser = new TAppUser(); appUser.setWxOpenid(openId); appUserService.save(appUser); } log.info("支付宝小程序登录调用成功"); } else { String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response); log.warn("诊断结果:{}",diagnosisUrl); throw new ServiceException("支付宝小程序登录失败"); } LoginUserApplet loginUserApplet = new LoginUserApplet(); if(ObjectUtils.isNotNull(appUser)){ loginUserApplet.setUserId(appUser.getId()); } HashMap<String, Object> tokenInfos = new HashMap<>(); tokenInfos.put("token",tokenService.createTokenApplet(loginUserApplet)); tokenInfos.put("info",loginUserApplet); return AjaxResult.ok(tokenInfos); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -78,41 +78,6 @@ @Resource private ExchangeOrderClient exchangeOrderClient; @Autowired private TokenService tokenService; @Autowired private RedisService redisService; @Autowired private WeixinProperties wxConfig; @Autowired private RestTemplate wxRestTemplate; @ApiOperation(value = "通过code获得openid, 1 --->对应的appid:wx4c405fa42539fc21 2---->对应的appid:wx02d9f6c92e6d3c86") @GetMapping("openId-by-jscode2session/{code}") public AjaxResult<Map<String, Object>> jscode2session(@PathVariable String code) { log.info("<<<<<<<<换取openid开始<<<<<<<<:{}", code); WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig); Code2SessionRespBody body = appletTools.getOpenIdByJscode2session(new Code2SessionResqBody().build(code)); String openid = body.getOpenid(); String sessionKey = body.getSessionKey(); TAppUser appUser = appUserService.getOne(Wrappers.lambdaQuery(TAppUser.class).eq(TAppUser::getWxOpenid, openid).last("limit 1")); if (Objects.isNull(appUser)) { appUser = new TAppUser(); appUser.setWxOpenid(openid); appUserService.save(appUser); } // 提前对sessionKey进行删除 log.info("换取sessionKey:{}", sessionKey); // 将sessionKey进行存储,后续获取信息需要 redisService.setCacheObject(openid, sessionKey); LoginUserApplet loginUserApplet = new LoginUserApplet(); if(ObjectUtils.isNotNull(appUser)){ loginUserApplet.setUserId(appUser.getId()); } HashMap<String, Object> tokenInfos = new HashMap<>(); tokenInfos.put("token",tokenService.createTokenApplet(loginUserApplet)); tokenInfos.put("info",loginUserApplet); return AjaxResult.ok(tokenInfos); } @ApiOperation(value = "管理后台-根据手机号查询用户ids", tags = {"管理后台-活动费用统计"}) @PostMapping(value = "/user/getUserIdsByPhone") ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java
New file @@ -0,0 +1,67 @@ package com.ruoyi.account.controller; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.account.service.TAppUserService; import com.ruoyi.account.wx.body.resp.Code2SessionRespBody; import com.ruoyi.account.wx.body.resq.Code2SessionResqBody; import com.ruoyi.account.wx.model.WeixinProperties; import com.ruoyi.account.wx.pojo.AppletUserDecodeData; import com.ruoyi.account.wx.pojo.AppletUserEncrypteData; import com.ruoyi.account.wx.tools.WxAppletTools; import com.ruoyi.account.wx.tools.WxUtils; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.system.api.model.LoginUserApplet; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; import java.util.Objects; /** * <p> * 微信小程序登录 前端控制器 * </p> * * @author xiaochen * @since 2024-08-06 */ @Slf4j @RestController @RequestMapping("/wxLogin") public class WxLoginController { @Autowired private TAppUserService appUserService; @Autowired private WeixinProperties wxConfig; @Autowired private RestTemplate wxRestTemplate; @ApiOperation(value = "通过code获得openid,获取用户信息",tags = {"微信小程序登录"}) @PostMapping("/openIdByJsCode") public AjaxResult<Map<String, Object>> openIdByJsCode(@RequestBody AppletUserEncrypteData data) { log.info("<<<<<<<<换取openid开始<<<<<<<<:{}", data.getCode()); WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig); Code2SessionRespBody body = appletTools.getOpenIdByJscode2session(new Code2SessionResqBody().build(data.getCode())); String openid = body.getOpenid(); String sessionKey = body.getSessionKey(); // 用户信息解密 数据验签 if (StringUtils.isNotBlank(data.getSignature())) { WxUtils.verifySignature(data.getRawData(), sessionKey, data.getSignature()); } AppletUserDecodeData appletUserDecodeData = WxUtils.encryptedData(data.getEncryptedData(), sessionKey, data.getIv()); appletUserDecodeData.setOpenId(openid); return AjaxResult.ok(appUserService.login(appletUserDecodeData)); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java
@@ -2,6 +2,9 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.account.wx.pojo.AppletUserDecodeData; import java.util.Map; /** * <p> @@ -13,4 +16,11 @@ */ public interface TAppUserService extends IService<TAppUser> { /** * 微信小程序登录用户封装 * @param appletUserDecodeData * @return */ Map<String, Object> login(AppletUserDecodeData appletUserDecodeData); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java
@@ -1,10 +1,23 @@ package com.ruoyi.account.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.account.mapper.TAppUserMapper; import com.ruoyi.account.service.TAppUserService; import com.ruoyi.account.wx.model.WeixinProperties; import com.ruoyi.account.wx.pojo.AppletUserDecodeData; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.system.api.model.LoginUserApplet; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; import java.util.Objects; /** * <p> @@ -16,5 +29,48 @@ */ @Service public class TAppUserServiceImpl extends ServiceImpl<TAppUserMapper, TAppUser> implements TAppUserService { @Autowired private TokenService tokenService; @Override public Map<String, Object> login(AppletUserDecodeData appletUserDecodeData) { // 通过手机号查询用户,是否已存在手动导入用户 TAppUser appUser = this.getOne(Wrappers.lambdaQuery(TAppUser.class) .eq(TAppUser::getPhone, appletUserDecodeData.getPhoneNumber()) .isNull(TAppUser::getWxOpenid) .last("LIMIT 1")); LambdaQueryWrapper<TAppUser> wrapper = Wrappers.lambdaQuery(TAppUser.class) .eq(TAppUser::getWxOpenid, appletUserDecodeData.getOpenId()); if(Objects.isNull(appUser)){ // 先使用openId和当前手机号进行查询 wrapper.eq(TAppUser::getPhone, appletUserDecodeData.getPhoneNumber()) .last("LIMIT 1"); appUser = this.getOne(wrapper); if(Objects.isNull(appUser)){ appUser = new TAppUser(); appUser.setPhone(appletUserDecodeData.getPhoneNumber()); } }else { wrapper.last("LIMIT 1"); // 删除小程序原有授权用户 this.remove(wrapper); } appUser.setAvatar(appletUserDecodeData.getAvatarUrl()); appUser.setCity(appletUserDecodeData.getCity()); appUser.setName(appletUserDecodeData.getNickName()); appUser.setProvince(appletUserDecodeData.getProvince()); appUser.setWxOpenid(appletUserDecodeData.getOpenId()); this.saveOrUpdate(appUser); LoginUserApplet loginUserApplet = new LoginUserApplet(); if(ObjectUtils.isNotNull(appUser)){ loginUserApplet.setUserId(appUser.getId()); loginUserApplet.setName(appUser.getName()); loginUserApplet.setPhone(appUser.getPhone()); loginUserApplet.setAvatar(appUser.getAvatar()); loginUserApplet.setAddress(appUser.getProvince()+appUser.getCity()); } Map<String, Object> tokenInfos = new HashMap<>(); tokenInfos.put("token",tokenService.createTokenApplet(loginUserApplet)); tokenInfos.put("info",loginUserApplet); return tokenInfos; } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/AccessTokenRespBody.java
@@ -9,7 +9,7 @@ /** * AccessToken 全局唯一 * * @author liheng * @author xiaochen */ @Data public class AccessTokenRespBody extends RespBody implements Serializable { ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/Code2SessionRespBody.java
@@ -4,7 +4,7 @@ import lombok.Data; /** * @author liheng * @author xiaochen * @ClassName Code2SessionRespBody * @Description * @date 2021-07-28 12:35 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/RespBody.java
@@ -4,7 +4,7 @@ import lombok.Data; /** * @author liheng * @author xiaochen * @ClassName RespBody * @Description * @date 2021-07-28 11:44 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resq/Code2SessionResqBody.java
@@ -4,7 +4,7 @@ import lombok.Data; /** * @author liheng * @author xiaochen * @ClassName Code2SessionResqBody * @Description * @date 2021-07-28 11:47 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletPhoneEncrypteData.java
@@ -3,7 +3,7 @@ import lombok.Data; /** * @author liheng * @author xiaochen * @ClassName AppletUserDecodeData * @Description * @date 2021-08-13 17:46 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletUserDecodeData.java
@@ -3,10 +3,9 @@ import lombok.Data; /** * @author liheng * @author xiaochen * @ClassName AppletUserDecodeData * @Description * @date 2021-08-13 17:46 * 用户主体信息部分 * { * "openId": "OPENID", ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletUserEncrypteData.java
@@ -3,10 +3,9 @@ import lombok.Data; /** * @author liheng * @author xiaochen * @ClassName AppletUserDecodeData * @Description * @date 2021-08-13 17:46 * 小程序加密数据体 * */ @@ -14,4 +13,5 @@ public class AppletUserEncrypteData extends AppletPhoneEncrypteData { private String rawData; private String signature; private String code; } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WebUtils.java
@@ -8,7 +8,7 @@ import javax.servlet.http.HttpSession; /** * @Author liheng * @Author xiaochen * @Date 2019/08/26 10:28 AM * @Description */ ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCache.java
@@ -5,7 +5,7 @@ /** * 缓存 * * @author liheng * @author xiaochen */ class WxCache { /** ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCacheTemplate.java
@@ -1,7 +1,7 @@ package com.ruoyi.account.wx.tools; /** * @author liheng * @author xiaochen * @ClassName WxCacheTemplate * @Description * @date 2021-01-11 11:27 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCaffineCache.java
@@ -7,7 +7,7 @@ import java.util.concurrent.TimeUnit; /** * @author liheng * @author xiaochen * @ClassName AbstractCaffineCache * @Description * @date 2021-01-11 11:27 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxUtils.java
New file @@ -0,0 +1,175 @@ package com.ruoyi.account.wx.tools; import com.ruoyi.account.wx.pojo.AppletUserDecodeData; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.CharEncoding; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import javax.servlet.http.HttpServletRequest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.security.AlgorithmParameters; import java.security.Security; import java.util.Arrays; /** * @Description 获取用户信息工具类 * @Author xiaochen * @Date 2021/8/12 15:45 */ @Slf4j public class WxUtils { /** * 微信小程序API 用户数据的解密 * * @param encryptedData * @param sessionKey * @param iv * @return */ public static AppletUserDecodeData encryptedData(String encryptedData, String sessionKey, String iv) { // 被加密的数据 byte[] dataByte = Base64.decode(encryptedData); // 加密秘钥 byte[] keyByte = Base64.decode(sessionKey); // 偏移量 byte[] ivByte = Base64.decode(iv); try { // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要 int base = 16; if (keyByte.length % base != 0) { int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0); byte[] temp = new byte[groups * base]; Arrays.fill(temp, (byte) 0); System.arraycopy(keyByte, 0, temp, 0, keyByte.length); keyByte = temp; } // 初始化 Security.addProvider(new BouncyCastleProvider()); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES"); parameters.init(new IvParameterSpec(ivByte)); cipher.init(Cipher.DECRYPT_MODE, spec, parameters); byte[] resultByte = cipher.doFinal(dataByte); if (null != resultByte && resultByte.length > 0) { String result = new String(resultByte, CharEncoding.UTF_8); log.info("解密原串:{}", result); return WxJsonUtils.parseObject(result, AppletUserDecodeData.class); } throw new RuntimeException("解密的数据为空"); } catch (Exception e) { log.error("解密失败. error = {}", e.getMessage(), e); throw new RuntimeException(e.getMessage()); } } /** * 微信小程序API 用户数据的签名验证 * signature = sha1( rawData + session_key ) * * @param rawData 不包括敏感信息的原始数据字符串,用于计算签名。 * @param sessionKey */ public static void verifySignature(String rawData, String sessionKey, String signature) { String serverSignature = SHA1.getSHA1(rawData + sessionKey); log.info(rawData + ">>>>>>:" + sessionKey + " === " + serverSignature + " ======" + signature); if (!signature.equals(serverSignature)) { throw new RuntimeException("数据验签不通过"); } } /** * 根据流接收请求数据 * * @param request * @return */ public static String streamBodyByReceive(HttpServletRequest request) throws IOException { log.info("微信异步回调地址:{}", request.getRequestURL()); StringBuffer buffer = new StringBuffer(); InputStream inputStream = request.getInputStream(); InputStreamReader reader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(reader); String body = null; while ((body = bufferedReader.readLine()) != null) { buffer.append(body); } String data = buffer.toString(); reader.close(); inputStream.close(); log.info("微信异步回调数据:{}", data); return data; } /** * 日志 * * @return */ public static Logger getLogger() { Logger logger = LoggerFactory.getLogger("wxpay java sdk"); return logger; } /** * debug * * @param msg * @param args */ public static void debug(String msg, Object... args) { Logger log = getLogger(); if (log.isDebugEnabled()) { log.debug(msg, args); } } /** * info * * @param msg * @param args */ public static void info(String msg, Object... args) { Logger log = getLogger(); if (log.isInfoEnabled()) { log.info(msg, args); } } /** * warn * * @param msg * @param args */ public static void warn(String msg, Object... args) { Logger log = getLogger(); if (log.isWarnEnabled()) { log.warn(msg, args); } } /** * error * * @param msg * @param args */ public static void error(String msg, Object... args) { Logger log = getLogger(); if (log.isErrorEnabled()) { log.error(msg, args); } } }