时间:2021-07-15 | 标签: | 作者:Q8 | 来源:Nothandsome网络
小提示:您能找到这篇{如何获取google play 退款订单?}绝对不是偶然,我们能帮您找到潜在客户,解决您的困扰。如果您对本页介绍的如何获取google play 退款订单?内容感兴趣,有相关需求意向欢迎拨打我们的服务热线,或留言咨询,我们将第一时间联系您! |
< font-size: 16px;"> < font-size: 16px;">关于查看google play退款订单的前提,首先,需要获取Google API的访问权限,从获取API访问权限上来看,大致分为两种方法,第一种是通过OAuth 客户端访问,需要客户端用户来授权,才能获取Google API的访问权限,然后进行用户订单详情的查询,第二种是不需要用户来授权的,我相信这种方法也是服务端比较喜欢的,毕竟用户授权这种事情你是没办法确定能拿到权限的。对于代表非人类机器人运行的服务器应用(如持续集成系统),建议使用服务帐号。对于直接代表人类用户运行的客户端应用(如 IDE 插件),则可以使用 OAuth 客户端。我目前的项目比较适合服务账号,所以,这里我们就只介绍第二种方法,利用google play开发者账号建立服务账号,直接对其授权,然后再进行对Google API的访问。 < font-size: 16px;">前言 < font-size: 16px;">这篇文章我们从创建 Google Play 开发者帐号说起,因为我最近为了google退款订单详情的查询踩了不少的坑,也许是英语太差,所以为了更好的理解和开发google退款的流程,我尽量详细介绍,每一个参数。全凭自己理解,不喜勿喷,欢迎大神指点批评。 < font-size: 16px;">1. 创建账号以及关联API服务 < font-size: 16px;">首先我们需要有 Google Play 开发者帐号,这个账号首先你要有自己的google账号,然后到Google Play Console进行开发者账号的注册开通,这里是需要支付 $25 的注册费用的,注册完成之后就要创建新的API项目(就是创建一个你的应用项目): < font-size: 16px;">在 Google Play 管理中心转到 API 访问权限页面。 < font-size: 16px;">接受服务条款。 < font-size: 16px;">点击创建新项目。 < font-size: 16px;">如果您已是 Google Play Developer API 的用户,则可以执行以下这些步骤来关联到您现有的 API 项目。如果您想关联的 API 项目未列出,请确认您的 Google Play 管理中心帐号是否已指定为“所有者”,且 Google Play Developer API 已启用。 < font-size: 16px;">在 Google Play 管理中心转到 API 访问权限页面。 < font-size: 16px;">接受 API 服务条款。 < font-size: 16px;">选择您想关联的项目。 < font-size: 16px;">点击关联。 < font-size: 16px;">到这里您的 Google Play 管理中心现已关联到 API 项目。一般开始写退款接口的时候google账号都已经是部署好的了应该,所以前面的步骤这里就不细说了 < font-size: 16px;">2. 创建服务账号 < font-size: 16px;">上边已经创建项目并且也关联了API,下面就可以直接 < font-size: 16px;">1.在 Google Play 管理中心转到 API 访问权限页面。 < font-size: 16px;">2.点击开发者账号 < font-size: 16px;">3.点击API权限 < font-size: 16px;">4.点击创建服务账号,按照页面上的说明创建您的服务帐号。 < font-size: 16px;">5.在 Google Developers Console 中创建服务帐号后,请点击完成。API 访问权限页面会自动刷新,您的服务帐号将随即列出。 < font-size: 16px;"> < font-size: 16px; color: rgb(191, 191, 191);">创建服务账号.jpg < font-size: 16px;">6.创建完服务账号需要生成一下密钥,公钥生成.json格式或者P12文件都行,我这里用的时.json文件,后面代码中要用到 < font-size: 16px;">6.在用户和权限页面可以看到刚创建的服务账号,接下来只要进行授权就可以使用了 < font-size: 16px;"> < font-size: 16px; color: rgb(191, 191, 191);">设置账号的访问权限.jpg < font-size: 16px;">3. 调用Google API查询退款订单详情 < font-size: 16px;">到了这一步就开始写接口了,我这里用的是Spring boot+cloud的框架,下面就不做解释了,首先调用google API需要引入依赖: < font-size: 16px;"> <dependency> < font-size: 16px;"> <groupId>com.google.apis</groupId> < font-size: 16px;"> <artifactId>google-api-services-androidpublisher</artifactId> < font-size: 16px;"> <version>v3-rev95-1.25.0</version> < font-size: 16px;"> </dependency> < font-size: 16px;">然后就是服务账号如何获取访问google API的权限,经过我的个人理解和google官方文档总结了一下,把整个代码给摘分开来了,第一部分是获取服务账号访问权限,创建一个访问谷歌api的GoogleCredential 相当于一个权限令牌 < font-size: 16px;"> private GoogleCredential getAndroidPublisherScopesOfGoogleCredential()throws Exception{ < font-size: 16px;"> //这里是建立服务账号后生成的.json文件,这里这样写需要把.json文件放到相应模块的resources下,想要换一个目录可以随意,但不要忘了改文件路径 < font-size: 16px;"> ClassPathResource classPathResource = new ClassPathResource("xxx-xxxx-xxxxxx.json"); < font-size: 16px;"> GoogleCredential credential = GoogleCredential.fromStream(classPathResource.getInputStream()) < font-size: 16px;"> .createScoped(AndroidPublisherScopes.all());//createScoped给令牌访问权限设置使用的权限范围 < font-size: 16px;"> if(credential!=null){ < font-size: 16px;"> return credential; < font-size: 16px;"> }else{ < font-size: 16px;"> throw new Exception("Get GoogleCredential fails"); < font-size: 16px;"> } < font-size: 16px;"> } < font-size: 16px;">因为我需要调用的接口在AndroidPublisher下,所以这里的权限范围设置成了AndroidPublisherScopes.all(),这里的具体API权限范围需要自己去查阅相关文档进行了解,这里不再详细说明。 < font-size: 16px;">上面拿到了令牌,下面就build一个要调用的google api的对应工具类 < font-size: 16px;"> private AndroidPublisher getAndroidPublisher()throws Exception{ < font-size: 16px;"> GoogleCredential credential = this.getAndroidPublisherScopesOfGoogleCredential(); < font-size: 16px;"> NetHttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();//其中这两个参数最终也没去搞明白,不知道具体的用处,目测可能是调用googleAPI发送请求用的 < font-size: 16px;"> JacksonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();// < font-size: 16px;"> return new AndroidPublisher.Builder(httpTransport, JSON_FACTORY, credential).build(); < font-size: 16px;"> } < font-size: 16px;">拿到了我们要用的工具类后,下面就可以调用接口了,下面这个接口是我在google官方文档找的,具体连接是:https://developers.google.com/android-publisher/api-ref/purchases/voidedpurchases/list < font-size: 16px;">下面的代码中会经常用到一个参数com.cn.aaaa是项目的完全限定软件包名称,就是应用名称下面的灰色小字,根据自己的设置进行填写 < font-size: 16px;"> /** < font-size: 16px;"> * 获取所有退款订单的PurchaseToken(google 采购成功的唯一标识) < font-size: 16px;"> * @return < font-size: 16px;"> * @throws Exception < font-size: 16px;"> */ < font-size: 16px;"> private List<网站开发招聘;VoidedPurchase> getPurchaseToken()throws Exception{ < font-size: 16px;"> boolean isExistData = true; < font-size: 16px;"> AndroidPublisher publisher = this.getAndroidPublisher(); < font-size: 16px;"> AndroidPublisher.Purchases.Voidedpurchases voidedpurchases = publisher.purchases().voidedpurchases(); < font-size: 16px;"> //后面还可以跟.setMaxResults 设置返回结果最大值默认1000 .setToken查询更多结果时设置(下一页nextPageToken) < font-size: 16px;"> AndroidPublisher.Purchases.Voidedpur天涯论坛危机公关chases.List refundInfo = voidedpurchases.list("com.cn.aaaa"); < font-size: 16px;"> VoidedPurchasesListResponse refundList = refundInfo.execute();//执行调用动作,返回结果 < font-size: 16px;"> List<VoidedPurchase> voidedPurchases = refundList.getVoidedPurchases(); < font-size: 16px;"> //获取分页token,若退款订单当前页没有传完,则返回参数中会有NextPageToken,用来循环请求下一页的退款订单 < font-size: 16px;"> TokenPagination tokenPagination = refundList.getTokenPagination(); < font-size: 16px;"> while (isExistData) { < font-size: 16px;"> if(tokenPagination!=null){ < font-size: 16px;"> AndroidPublisher.Purchases.Voidedpurchases.List nextRefundInfo = voidedpurchases.list("com.cn.aaaa").setToken(tokenPagination.getNextPageToken()); < font-size: 16px;"> VoidedPurchasesListResponse nextRefundLists = nextRefundInfo.execute(); < font-size: 16px;"> List<VoidedPurchase> nextVoidedPurchasess = nextRefundLists.getVoidedPurchases(); < font-size: 16px;"> tokenPagination = nextRefundLists.getTokenPagination(); < font-size: 16px;"> voidedPurchases.addAll(nextVoidedPurchasess); < font-size: 16px;"> }else{ < font-size: 16px;"> isExistData = false; < font-size: 16px;"> } < font-size: 16px;"> } < font-size: 16px;"> return voidedPurchases; < font-size: 16px;"> } < font-size: 16px;">这里终于拿到了您的应用中所有的产生退款的订单的PurchaseToken,具体的返回参数解释官方文档却比较详细,可以用上面的连接进行查阅,但是这个返回结果中除了PurchaseToken并没有订单号,而可恨的是我们的库里面根本没有存google的这个采购成功的唯一标识PurchaseToken,然后我就继续开始翻google的官网文档终于找到了一个不太方便的方法,目前我只能找到这一个解决办法。(有那位大神知道其他的简单的方法的话,求指教,留言) < font-size: 16px;"> /** < font-size: 16px;"> * 获取所有退款订单详情 < font-size: 16px;"> * @return < font-size: 16px;"> * @throws Exception < font-size: 16px;"> */ < font-size: 16px;"> public MessageResult getOrder() throws Exception { < font-size: 16px;"> List<VoidedPurchase> purchaseTokenList = this.getPurchaseToken(); < font-size: 16px;"> String pakgeName = "com.cn.aaaa"; < font-size: 16px;"> List<ProductPurchase> infoList = new ArrayList<>(); < font-size: 16px;"> for(VoidedPurchase voidedPurchase : purchaseTokenList) { < font-size: 16px;"> String purchaseToken = voidedPurchase.getPurchaseToken(); < font-size: 16px;"> AndroidPublisher publisher = this.getAndroidPublisher(); < font-size: 16px;"> List<String> list = new ArrayList<>(); < font-size: 16px;"> list.add("您的应用在google中设置的产品ID"); < font-size: 16px;"> ...... < font-size: 16px;"> list.add("您的应用在google中设置的产品ID"); < font-size: 16px;"> //这里之所以写这个list是因为我们只拿到了PurchaseToken,但调用GET产品详情的接口参数中包括这一订单的产品ID, < font-size: 16px;"> //但是我们并不知道哪个订单是退款订单,更不知道是买的那个产品被退款,所以这里只能拿所有产品ID进行轮询 < font-size: 16px;"> for (String id : list) { < font-size: 16px;"> AndroidPublisher.Purchases.Products.Get products = publisher.purchases().products().get(pakgeName, id, purchaseToken); < font-size: 16px;"> try { < font-size: 16px;"> //这里的详细返回参数解释查看官方文档:[https://developers.google.com/android-publisher/api-ref/inappproducts/get](https://developers.google.com/android-publisher/api-ref/inappproducts/get) < font-size: 16px;"> ProductPurchase info = products.execute(); < font-size: 16px;"> if(info!=null){ < font-size: 16px;"> infoList.add(info); < font-size: 16px;"> } < font-size: 16px;"> } catch (Exception e) { < font-size: 16px;"> //这里在异常中处理是因为当参数中的product ID与PurchaseToken代表的订单的product ID不一致时会抛错,所以在这里捕捉后进行后续处理 < font-size: 16px;"> String error = e.getMessage(); < font-size: 16px;"> if (error.indexOf("The purchase token does not match the product ID") > 0) { < font-size: 16px;"> log.warn("产品ID与Token中的不一致"); < font-size: 16px;"> }else{ < font-size: 16px;"> log.error("查询退款订单详情异常:{}",error); < font-size: 16px;"> } < font-size: 16px;"> } < font-size: 16px;"> } < font-size: 16px;"> } < font-size: 16px;"> return MessageResult.success(infoList); < font-size: 16px;"> } < font-size: 16px;">到这里就已经结束了,退款订单的所有详情已获取。 < font-size: 16px;">注:对于googleAPI的调用,必须放到国外的服务器进行接口的调用,否则国内的网络无法联通,其他任何方法不适用 |
上一篇:Google Play支付失败问题解决!
下一篇:Google Play支付 接入配置
基于对传统行业渠道的理解,对互联网行业的渠道我们可以下这样一个定义:一切...
小米应用商店的后台操作和苹果是比较相似的,因为都能填写100字符关键词,允许...
小米的规则目前是在变更中的,但是根据经验小米的搜索排名评分的高低是个很重...
为了恰饭,有时候是要接入一些广告的,所以FB也专门有一个广告的SDK,这就是A...
在 2018 年于旧金山举行的游戏开发者大会上,Amazon Web Services (AWS) 曾宣布,目前世...
关于Facebook Audience Network如何收款的问题,其实官方已经给了详细的步骤。本文主要...
本文介绍了Audience Network对广告载体的质量检查,以及它重点广告形式需要注意的问...
随着iOS开发,作为开发者或公司需要针对iOS App开发涉及的方方面面作出对应的信息...
Facebook和谷歌对出海企业广告渠道都很熟悉,但事实上,在国外还有一些渠道也很...
卖家从做号的第1分钟开始,就一定要想好变现路径是什么?一定要以变现为目的去...
小提示:您应该对本页介绍的“如何获取google play 退款订单?”相关内容感兴趣,若您有相关需求欢迎拨打我们的服务热线或留言咨询,我们尽快与您联系沟通如何获取google play 退款订单?的相关事宜。
关键词:如何获取google,play,退款订