miniapp调用微信接口
进行配置
wx:
miniapp:
config:
appid:
secret:
msgDataFormat: JSON
qr-base-page:
qr-receipt-url:
qr-pay-url:
进行bean配置读取
@ConfigurationProperties(prefix = "wx.miniapp.config")
public class WxMaProperties {
private String appid;
private String secret;
private String msgDataFormat = "JSON";
}
生成配置bean
@Configuration
@EnableConfigurationProperties(WxMaProperties.class)
public class WxMaConfiguration {
@Bean
public WxMaService wxMaService(WxMaProperties properties) {
WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
config.setAppid(properties.getAppid());
config.setSecret(properties.getSecret());
config.setMsgDataFormat(properties.getMsgDataFormat());
WxMaService service = new WxMaServiceImpl();
service.setWxMaConfig(config);
return service;
}
}
具体实现层
@Service
public class UserWxMpService {
@Value("${wx.miniapp.qr-base-page}")
private String qrBasePage;
@Autowired
private WxMaService wxMaService;
@Autowired
private BusinessUserService businessUserService;
@Resource
private RedisUtil redisUtil;
@Resource
private WeChatMiniQRUtil weChatMiniQRUtil;
public BusinessUserVO login(WxLoginDTO wxLoginDTO) {
BusinessUserVO businessUserVO = null;
BusinessUser localInfo = getAndCreateLocalInfo(wxLoginDTO);
businessUserVO = BusinessUserConvert.INSTANCE.toConvertBusinessUserVO(localInfo);
BusinessUser selectUser = businessUserService.getUserByOpenid(localInfo.getOpenId());
if (selectUser == null) {
businessUserVO.setFirstLogin(true);
businessUserService.createBankUser(localInfo);
} else {
businessUserVO.setFirstLogin(false);
businessUserService.updateUserInfo(selectUser.setToken(localInfo.getToken()));
}
return businessUserVO;
}
public void loginOut(String token) {
BusinessUser selectUser = businessUserService.getUserByToken(token);
if (selectUser != null) {
businessUserService.updateUserInfo(selectUser.setToken(null));
}
}
private BusinessUser getAndCreateLocalInfo(WxLoginDTO wxLoginDTO) {
WxMaJscode2SessionResult sessionResult = null;
sessionResult = getWxMaJsCode2Session(wxLoginDTO.getCode());
String sessionKey = sessionResult.getSessionKey();
WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(sessionKey, wxLoginDTO.getEncryptedData(), wxLoginDTO.getIv());
String phone = this.getPhoneByCode(wxLoginDTO.getPhoneNumCode());
BusinessUser localUser = createLocalUser(sessionResult.getOpenid(), userInfo, phone);
return localUser;
}
private WxMaJscode2SessionResult getWxMaJsCode2Session(String code) {
WxMaUserService wxMaUserService = wxMaService.getUserService();
WxMaJscode2SessionResult sessionResult;
try {
sessionResult = wxMaUserService.getSessionInfo(code);
} catch (WxErrorException e) {
throw new BizException("获取微信用户sessionKey信息失败");
}
return sessionResult;
}
private BusinessUser createLocalUser(String openid, WxMaUserInfo userInfo, String phone) {
BusinessUser businessUser = new BusinessUser();
businessUser.setOpenId(openid);
String token = generateToken(openid);
businessUser.setToken(token);
businessUser.setNickName(userInfo.getNickName());
businessUser.setHeadImage(userInfo.getAvatarUrl());
businessUser.setUnionId(userInfo.getUnionId());
businessUser.setPhone(phone);
return businessUser;
}
public BusinessUserVO getUserInfo(String code, String token) {
getWxMaJsCode2Session(code);
BusinessUser user = businessUserService.getUserByToken(token);
if (user == null) {
throw new BizException("invalid token");
}
BusinessUserVO businessUserVO = new BusinessUserVO();
businessUserVO.setOpenId(user.getOpenId());
businessUserVO.setNickName(user.getNickName());
businessUserVO.setHeadImage(user.getHeadImage());
return businessUserVO;
}
private String generateToken(String openid) {
String key = "my_secret_key";
long currentTimeMillis = System.currentTimeMillis();
String token = openid + ":" + currentTimeMillis;
String signature = DigestUtils.sha1Hex(token + ":" + key);
return token + ":" + signature;
}
public String getAccessToken() {
String token = redisUtil.getCacheObject(WxConstant.WX_APP_ACCESS_TOKEN);
if (StringUtils.isEmpty(token)) {
return this.refreshAccessToken().get();
}
return token;
}
private Optional<String> refreshAccessToken() {
try {
String accessToken = wxMaService.getAccessToken();
int exp = 5400;
redisUtil.setCacheObject(WxConstant.WX_APP_ACCESS_TOKEN, accessToken, exp, TimeUnit.SECONDS);
return Optional.of(accessToken);
} catch (Exception e) {
return Optional.empty();
}
}
public String getMiniQRByServiceProviderId(Long serviceProviderId) throws Exception {
String pagePath = this.qrBasePage;
if (serviceProviderId != null) {
pagePath = pagePath + "?" + "id=" + serviceProviderId;
}
return weChatMiniQRUtil.getBase64MiniQR(pagePath, getAccessToken());
}
public String getPhoneByCode(String phoneNumCode) {
try {
WxMaPhoneNumberInfo newPhoneNoInfo = wxMaService.getUserService().getNewPhoneNoInfo(phoneNumCode);
return newPhoneNoInfo.getPhoneNumber();
} catch (WxErrorException e) {
throw new BizException("获取电话失败");
}
}
}
项目导入maven
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
</dependency>