前置知识
- RESTful API 格式
- Google API OAuth 2种认证方式
User Story
我们想通过访问 GooglePlay Voided Purchase API 获取某个应用的用户退款信息。而Google则提供了一个无效购买的查询接口。
分析
先来看看这个 API 的用例
GET https://www.googleapis.com/androidpublisher/v2/applications/
[your_package_name]/purchases/voidedpurchases?access_token=[your_auth_token]
Voided Purchase API 的请求方式为GET,url需要的参数有2个,
your_package_name 对应查询应用的包名,类似 com.google.android.apps.map 查询开发者账户设置的包名可知
your_auth_token ,身份认证所需的token,也就是本文的获取重点。
简要访问步骤
1.获取服务账户 Service Account
2.创建访问程序,加载Service Account文件,获取token并访问请求API
如何创建服务账户 Service Account?
Google API Console 的界面会有不定期的改动,因此功能位置有可能变动
登录开发者的账号后, 在Google API Console的页面
根据指南,创建/选择 工程(project),然后创建服务帐户
创建认证文件
选择JSON,并好好保存。
注: 因为对于Voided Purchase API,我们需要读取财务数据,还需要对这个Service Account授予“查看财务报告(View financial reports)”的权限
在程序中使用认证文件获取Token
示例代码
import java.io.FileInputStream;
import java.util.Arrays;
import java.util.List;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
public class GoogleOAuth2ServiceAccountSample {
/** OAuth 2.0 scopes. 重要,规范访问者的查看范围*/
private static final List<String> SCOPES = Arrays.asList(
"https://www.googleapis.com/auth/androidpublisher");
public static void main(String[] args) {
try {
// 根据Service Account文件构造认证实例 GoogleCredential
GoogleCredential credential = GoogleCredential
.fromStream(new FileInputStream(
"Google_Wallet-94e38f1f23f7.json"))// 加载服务帐户认证文件
.createScoped(SCOPES);
// 刷新token
credential.refreshToken();
// 获取token
System.out.println(credential.getAccessToken());
} catch (Exception e) {
e.printStackTrace();
}
}
}
参考资料
无效购买API 指南(英语)
Voided Purchase API
Google API 入门(繁体)
【JSDC客座文章】第一次接觸Google API就上手
各种坑
Google API的访问资料都比较分散,我查看了好几个示例代码都没有提及获取token的方法,以及多数是使用OAtuh2回调访问的教程(即类似跳转到Google登录界面,需要确认登录/授权xx应用的那种。)
此外,虽然知道getAccessToken可以获取到token, 但一直是null, 查了StackOverFlow才知道需要先调用refreshToken.
关于SCOPE,很多示例和代码都是提及username和mail address. 实际上对于Google内置API的访问,需要用到androidpublisher,否则一直返回403,没有授权。