You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无命令行环境下Salesforce对接Google Translate v3 Advanced API认证问询

Salesforce对接Google Translate Advanced V3 API 无命令行权限解决方案

核心思路:使用JWT认证流程

Google Translate Advanced V3不支持API密钥,但可通过JWT令牌认证实现对接,全程无需命令行操作,仅依赖Salesforce的Apex代码和HTTP调用即可完成。

具体步骤:

  1. 创建并获取Google服务账号密钥

    • 登录Google Cloud控制台,创建服务账号并为其分配「Cloud Translation API Editor」角色。
    • 下载服务账号的JSON密钥文件,提取其中的private_key、client_email字段信息(建议存储在Salesforce自定义设置或加密字段中,避免硬编码泄露)。
  2. 在Salesforce中生成签名后的JWT
    用Apex代码构建JWT并完成RS256签名,示例代码如下:

    public class GoogleJWTGenerator {
        public static String generateJWT(String clientEmail, String privateKey) {
            // 构建JWT Header
            Map<String, Object> header = new Map<String, Object>{
                'alg' => 'RS256',
                'typ' => 'JWT'
            };
            String encodedHeader = base64UrlEncode(JSON.serialize(header));
    
            // 构建JWT Payload(有效期1小时)
            Long expTime = DateTime.now().getTime()/1000 + 3600;
            Map<String, Object> payload = new Map<String, Object>{
                'iss' => clientEmail,
                'aud' => 'https://oauth2.googleapis.com/token',
                'scope' => 'https://www.googleapis.com/auth/cloud-translation',
                'exp' => expTime
            };
            String encodedPayload = base64UrlEncode(JSON.serialize(payload));
    
            // 拼接待签名字符串
            String signatureInput = encodedHeader + '.' + encodedPayload;
    
            // 使用私钥签名
            Blob privateKeyBlob = EncodingUtil.base64Decode(privateKey.replace('-----BEGIN PRIVATE KEY-----', '').replace('-----END PRIVATE KEY-----', '').replace('\n', ''));
            Blob signatureBlob = Crypto.sign('RSA-SHA256', Blob.valueOf(signatureInput), privateKeyBlob);
            String encodedSignature = base64UrlEncode(signatureBlob);
    
            // 返回完整JWT
            return encodedHeader + '.' + encodedPayload + '.' + encodedSignature;
        }
    
        private static String base64UrlEncode(Blob input) {
            String encoded = EncodingUtil.base64Encode(input);
            return encoded.replace('+', '-').replace('/', '_').replace('=', '');
        }
    }
    
  3. 获取Google OAuth Access Token
    用生成的JWT向Google令牌端点发送POST请求,获取Bearer Token:

    public static String getAccessToken(String jwt) {
        Http http = new Http();
        HttpRequest req = new HttpRequest();
        req.setEndpoint('https://oauth2.googleapis.com/token');
        req.setMethod('POST');
        req.setHeader('Content-Type', 'application/x-www-form-urlencoded');
        req.setBody('grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=' + jwt);
    
        HttpResponse res = http.send(req);
        if(res.getStatusCode() == 200) {
            Map<String, Object> respMap = (Map<String, Object>)JSON.deserializeUntyped(res.getBody());
            return (String)respMap.get('access_token');
        }
        throw new Exception('获取Token失败:' + res.getBody());
    }
    
  4. 调用Google Translate V3 API
    使用获取到的Access Token发起翻译请求,示例调用文本翻译接口:

    public static String translateText(String accessToken, String projectId, String text, String targetLang) {
        Http http = new Http();
        HttpRequest req = new HttpRequest();
        req.setEndpoint('https://translation.googleapis.com/v3/projects/' + projectId + ':translateText');
        req.setMethod('POST');
        req.setHeader('Authorization', 'Bearer ' + accessToken);
        req.setHeader('Content-Type', 'application/json');
    
        Map<String, Object> requestBody = new Map<String, Object>{
            'targetLanguageCode' => targetLang,
            'contents' => new List<String>{text}
        };
        req.setBody(JSON.serialize(requestBody));
    
        HttpResponse res = http.send(req);
        if(res.getStatusCode() == 200) {
            Map<String, Object> respMap = (Map<String, Object>)JSON.deserializeUntyped(res.getBody());
            List<Object> translations = (List<Object>)respMap.get('translations');
            if(translations.size() > 0) {
                Map<String, Object> translation = (Map<String, Object>)translations[0];
                return (String)translation.get('translatedText');
            }
        }
        throw new Exception('翻译请求失败:' + res.getBody());
    }
    

注意事项:

  • 确保Salesforce远程站点设置已添加https://oauth2.googleapis.com和https://translation.googleapis.com域名。
  • 服务账号私钥需妥善存储,建议使用Salesforce加密字段或命名凭据管理。
  • JWT有效期建议设为1小时,每次调用API前可检查Token是否过期,过期则重新生成。

内容的提问来源于stack exchange,提问作者Paul Battisson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:29:51