无Google Workspace/G-Suite,PHP网站如何用服务账户获取OAuth2令牌对接My Business API
无Google Workspace时获取My Business API OAuth2令牌的可行方案
首先明确:My Business Profile API(原My Business API)不支持服务账户直接访问个人商家账号——域委派是Google Workspace专属功能。但你可以通过以下两种方案实现需求,无需Workspace权限:
方案1:标准OAuth2授权码流程(推荐,适合个人商家)
这是官方针对非Workspace用户的认证方案,直接让商家账号持有者授权你的应用即可:
- 在Google Cloud控制台创建OAuth2客户端ID:
- 进入「API和服务」>「凭据」>「创建凭据」>「OAuth客户端ID」
- 应用类型选「Web应用」,添加你的PHP网站回调URL(比如
https://your-domain.com/google-callback.php)
- 实现PHP端授权逻辑:
- 引导用户跳转Google授权页:构造包含
scope=https://www.googleapis.com/auth/business.manage的授权URL,让商家账号用户登录并授权你的应用 - 回调接收授权码:用户授权后,Google会将授权码发送到你设置的回调URL
- 兑换令牌:用授权码、客户端ID、客户端密钥调用Google令牌端点,获取
access_token(短期有效)和refresh_token(长期有效) - 存储刷新令牌:后续可通过
refresh_token定期获取新的access_token,无需用户重复授权
- 调用API获取数据:
- 携带有效
access_token请求API端点,比如GET https://mybusiness.googleapis.com/v4/accounts/{accountId}/locations,即可获取商家名称、地址、营业时间等数据
方案2:服务账户+授权码模拟(适合批量管理场景)
如果一定要用服务账户作为令牌管理载体,本质还是需要先通过OAuth2授权码流程获取商家账号的授权,再让服务账户接管令牌:
- 按方案1的步骤获取商家账号的
refresh_token
- 按方案1的步骤获取商家账号的
- 在Google Cloud控制台给服务账户添加「Service Account Token Creator」角色
- PHP端用服务账户生成JWT令牌,调用Google令牌端点,传入之前获取的
refresh_token和服务账户JWT,换取服务账户可用的访问令牌
- PHP端用服务账户生成JWT令牌,调用Google令牌端点,传入之前获取的
- 注意:这种方式并没有绕过用户授权要求,只是将令牌的管理逻辑转移到了服务账户
关键注意事项
- My Business Profile API需要提交应用审核,确保你的应用符合Google的API使用政策,否则无法调用核心数据接口
refresh_token属于敏感信息,必须加密存储,避免泄露- 可以用Google官方的
google/apiclient库简化认证流程,示例代码:require __DIR__ . '/vendor/autoload.php'; $client = new Google\Client(); $client->setApplicationName('My Business Data Fetcher'); $client->setScopes(['https://www.googleapis.com/auth/business.manage']); $client->setAuthConfig('path/to/your-client-secret.json'); $client->setAccessType('offline'); // 确保能获取refresh_token // 处理授权回调 if (isset($_GET['code'])) { $tokenData = $client->fetchAccessTokenWithAuthCode($_GET['code']); $client->setAccessToken($tokenData); // 将$tokenData['refresh_token']加密后存入数据库 }
内容的提问来源于stack exchange,提问作者sneps
相关产品推荐
相关产品推荐

