使用wx-java-miniapp-spring-boot-starter
生成微信小程序码及小程序短链接
-
在pom.xml文件中引入依赖
<dependency> <groupId>com.github.binarywang</groupId> <artifactId>wx-java-miniapp-spring-boot-starter</artifactId> <version>4.7.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
在
application.yml
中配置小程序参数spring:
application:
name: wx-poster
data:
redis:
host: 192.168.1.111
port: 6379
password: 123456
database: 0wx:
miniapp:
configs:
scm:
appid: wx1234567890abcdef
secret: test-567890abcdef1234567890abcdef
msgDataFormat: JSON
mall:
appid: wxe8db97a0603abcde
secret: test-35f85ebb2135bdcd9e154de12345
msgDataFormat: JSON -
加载配置及实例化服务类
@Data
@Configuration
@ConfigurationProperties(prefix = "wx.miniapp")
public class WxMaProperties {
private Map<String, Config> configs;@Data public static class Config { private String appid; private String secret; private String msgDataFormat; }
}
@Configuration
public class WxMaConfiguration {
@Autowired
private WxMaProperties properties;
@Autowired
private StringRedisTemplate redisTemplate;@Bean public Map<String, WxMaConfig> wxMaConfigs() { Map<String, WxMaConfig> configMap = new HashMap<>(); WxRedisOps wxRedisOps = new RedisTemplateWxRedisOps(redisTemplate); properties.getConfigs().forEach((key, config) -> { WxMaRedisBetterConfigImpl maConfig = new WxMaRedisBetterConfigImpl(wxRedisOps, "wechat"); maConfig.setAppid(config.getAppid()); maConfig.setSecret(config.getSecret()); maConfig.setMsgDataFormat(config.getMsgDataFormat()); configMap.put(key, maConfig); }); return configMap; } @Bean public WxMaService wxMaService() { WxMaService service = new WxMaServiceImpl(); service.setMultiConfigs(wxMaConfigs()); return service; }
}
-
根据微信小程序标识及页面路径,生成小程序码
@Slf4j
@Service
public class WxMaManagerService {
@Autowired
private WxMaService wxMaService;/** * 生成小程序码 */ @SneakyThrows public byte[] createWxaCode(WechatGenerateQrCodeParam param) { WxMaService service = wxMaService.switchoverTo(param.getAppKey()); try { return service.getQrcodeService().createWxaCodeUnlimitBytes(param.getScene(), param.getPage(), param.getCheckPath(), param.getEnvVersion(), param.getWidth(), param.getAutoColor(), param.getLineColor(), param.getIsHyaline()); } catch (Exception e) { if (isTokenInvalid(e)) { // 如果token无效,刷新一次后重试 service.getWxMaConfig().expireAccessToken(); return service.getQrcodeService().createWxaCodeUnlimitBytes(param.getScene(), param.getPage(), param.getCheckPath(), param.getEnvVersion(), param.getWidth(), param.getAutoColor(), param.getLineColor(), param.getIsHyaline()); } throw new RuntimeException("生成小程序码失败", e); } } /** * 生成短链接 */ @SneakyThrows public String createShortLink(WechatGenerateShortLinkParam param) { WxMaService service = wxMaService.switchoverTo(param.getAppKey()); // 短期有效 GenerateShortLinkRequest shortLinkRequest = GenerateShortLinkRequest.builder().pageUrl(param.getPageUrl()).isPermanent(false).build(); try { return service.getLinkService().generateShortLink(shortLinkRequest); } catch (Exception e) { if (isTokenInvalid(e)) { // 如果token无效,刷新一次后重试 service.getWxMaConfig().expireAccessToken(); return service.getLinkService().generateShortLink(shortLinkRequest); } throw new RuntimeException("生成短链接失败", e); } } /** * 判断是否是token无效的错误 */ private boolean isTokenInvalid(Exception e) { String errorMsg = e.getMessage(); return StringUtils.containsIgnoreCase(errorMsg, "access_token") && (StringUtils.containsIgnoreCase(errorMsg, "invalid") || StringUtils.containsIgnoreCase(errorMsg, "expired")); }
}