package vip.mate.channel.qrcode; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import vip.mate.channel.feishu.FeishuAppRegistrationService; import vip.mate.channel.qrcode.util.QrCodeImageEncoder; import java.util.LinkedHashMap; import java.util.Map; /** * QR-code auth provider for Feishu / Lark app registration. * *

Domain selection ({@code feishu} vs {@code lark}) flows through the * generic {@code params} map. */ @Slf4j @Component @RequiredArgsConstructor public class FeishuQRCodeAuthProvider implements ChannelQRCodeAuthProvider { private final FeishuAppRegistrationService service; @Override public String channelType() { return "feishu"; } @Override public Map begin(Map params) throws Exception { String domain = params != null ? params.getOrDefault("domain", "feishu") : "feishu"; String sessionId = service.begin(domain); return Map.of("session_id", sessionId); } @Override public Map pollStatus(String sessionId) { FeishuAppRegistrationService.RegistrationSession session = service.getSession(sessionId); if (session == null) { return Map.of("status", "expired", "error", "session not found or expired"); } Map body = new LinkedHashMap<>(); body.put("status", session.status.name().toLowerCase()); if (session.qrcodeUrl != null) { body.put("qrcode_url", session.qrcodeUrl); body.put("qrcode_expire_seconds", session.qrcodeExpireSeconds); if (session.qrcodeImgDataUri == null) { try { session.qrcodeImgDataUri = QrCodeImageEncoder.toDataUri(session.qrcodeUrl); } catch (Exception e) { log.warn("[feishu-register] QR encode failed: {}", e.getMessage()); } } if (session.qrcodeImgDataUri != null) { body.put("qrcode_img", session.qrcodeImgDataUri); } } if (session.status == FeishuAppRegistrationService.Status.CONFIRMED) { body.put("client_id", session.clientId); body.put("client_secret", session.clientSecret); if (session.userOpenId != null) body.put("user_open_id", session.userOpenId); if (session.userTenantBrand != null) body.put("user_tenant_brand", session.userTenantBrand); } if (session.errorMessage != null) { body.put("error", session.errorMessage); } return body; } }