refactor(config): 七牛/微信密钥外置——AK/SK+微信AppID 入本地 app_config, domain/bucket 走远程配置

- app_config.json + AppConfig: qiniu_access_key/qiniu_secret_key/wechat_app_id/wechat_app_secret(扁平snake_case)
- RemoteConfig.VersionFields + audio_domain/audio_bucket(4层可携带), VersionDecision + audioDomain/audioBucket
- VersionResolver.resolve 复用 pickStr 解析 audioDomain/audioBucket(4层逐级回退)
- QiniuToken.uploadToken(accessKey,secretKey,bucket) 改传参,去掉硬编码常量
- AudioProvider.doUpload: AK/SK取本地配置, domain/bucket取远程配置(cfg.resolve), URL用远程domain
- WeChatApi.configure(appId) 注入AppID(去WX_APP_ID常量), EntryAbility.onCreate 从配置注入
- 更新 QiniuToken 单测传参

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
lanterngamescn
2026-06-27 19:12:43 +08:00
co-authored by Claude Opus 4.8
parent e5d8eeb3b1
commit c39d8eb400
10 changed files with 85 additions and 28 deletions
@@ -23,7 +23,7 @@ import { common, abilityAccessCtrl } from '@kit.AbilityKit';
import { fileIo } from '@kit.CoreFileKit';
import { BridgeController } from 'feature_bridge';
import { InboundHandlers, OutboundHandlers, MediaTypeAudioReq, SrcIsLoopReq, GetAudioUrlResp } from 'contracts';
import { ConfigManager, ResourceManager } from 'domain_resource';
import { ConfigManager, ResourceManager, VersionDecision, AppConfig } from 'domain_resource';
import { FileSystem, QiniuUploader, QiniuToken } from 'platform';
import { Logger, EventBus, EventPayload, AudioEvents, ShowRecordingRequest, RecordResult } from 'common';
import { CapabilityContext, CapabilityProvider } from '../core/CapabilityProvider';
@@ -406,11 +406,23 @@ export class AudioProvider implements CapabilityProvider {
private async doUpload(filePath: string, key: string, timeSec: number): Promise<void> {
const ctx: common.UIAbilityContext | undefined = this.context;
if (ctx === undefined || filePath === '') {
const cfg: ConfigManager | undefined = this.config;
if (ctx === undefined || cfg === undefined || filePath === '') {
return; // 已发过空回投(reset 语义);上传不了则保持"无语音"
}
try {
const token: string = await QiniuToken.uploadToken();
// AK/SK 取本地 app_config;domain/bucket 取远程配置(audio_domain/audio_bucket,4 层回退)。
const local: AppConfig = cfg.getLocal();
const ak: string = local.qiniuAccessKey;
const sk: string = local.qiniuSecretKey;
const decision: VersionDecision = await cfg.resolve();
const bucket: string = decision.audioBucket;
const domain: string = decision.audioDomain;
if (ak === '' || sk === '' || bucket === '' || domain === '') {
this.log.w(`qiniu config missing: ak/sk(local) ok=${ak !== '' && sk !== ''}, bucket='${bucket}' domain='${domain}'(remote)`);
return;
}
const token: string = await QiniuToken.uploadToken(ak, sk, bucket);
const ok: boolean = await QiniuUploader.upload(ctx, filePath, key, () => Promise.resolve(token));
try {
fileIo.unlinkSync(filePath);
@@ -418,7 +430,7 @@ export class AudioProvider implements CapabilityProvider {
this.log.w(`cleanup uploaded file failed: ${(e as Error).message}`);
}
if (ok) {
this.emitAudioUrl(`http://gameaudio.daoqi88.cn/${key}`, timeSec);
this.emitAudioUrl(`http://${domain}/${key}`, timeSec);
} else {
this.log.w(`qiniu upload failed key=${key}`); // 已发空回投,不再重复
}