Google支付和服务端验证

因为公司业务需求,需要使用google的登录和支付。google支付分为订阅和应用内购买两种,笔者使用的是应用内购买这种方式,这里将整个google支付和支付验证的流程记录下来。

流程:

这时google支付的准备工作已完成,下面就可以发起支付了

下面咋们上代码

step1
初始化并连接到google服务

setp2
查询已支付的商品,并通知服务器后消费(google的支付里面,没有消费的商品,不能再次购买)

setp3
发起支付

服务器支付验证操作较为复杂,咋们在下面单独提出来做一个小节

setp5
消费商品

做服务端验证前,需要做一下准备工作

下面咋们上操作截图

setp2
开启Google Play Android Developer API

搜索”Google Play Android Developer API”

开启”Google Play Android Developer API”

setp3
开启同意屏幕

这里填上必填项就行了,这个授权同意屏幕,请求code时拉起来给咋们开发人员开的,填啥都无所谓

setp4
创建oauth2客户端id

创建页面和创建成功后的修改页面可以获取到clientId和clientSecret

到这里api项目就已经创建好了

这里可以看到,重定向地址上有两个参数code和scope,我们只需要code就行了,这里的code是urlencode后的,使用时需要decode

setp7
使用code换取refreshToken
地址:https://accounts.google.com/o/oauth2/token
请求方式:post
参数:grant_type=authorization_code
code=获取到的code(需要看看code中是否有%号,如果有需要urldecode)
client_id=创建api项目是的clientId(客户端ID)
client_secret=创建api项目时的clientSecret(客户端密钥)
redirect_uri=创建api项目时的重定向地址

这里就获取到refreshToken了,

,它只会在第一次请求中返回,后续用在发一样的请求不会返回refreshtoken,如果不慎弄丢了,需要去重新创建一个WebClientId

setp8
使用refreshToken获取accessToken
地址:https://accounts.google.com/o/oauth2/token
请求方式:post
参数:grant_type=refresh_token
refresh_token=刚刚获取到的refreshToken
client_id=创建api项目是的clientId(客户端ID)
client_secret=创建api项目时的clientSecret(客户端密钥)

setp9
查询订单状态
https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}?access_token={access_token}
packageName:app包名,必须是创建登录api项目时,创建android客户端Id使用包名
productId:对应购买商品的商品ID
token:购买成功后Purchase对象的getPurchaseToken()
access_token:上面咋们获取到的accessToken
请求方式:get
返回值:

到这里整个支付验证流程就已经走完了,这里总结哈笔者这次试用过程中走过的一些坑:

  • google应用必须要在封闭测试状态下,并审核通过的应用才能支付,文档说的是内部测试就可以了,笔者每次都弄到封闭测试状态下才可以支付。
  • 在firebase中创建了项目,会自动同步到google api后台,不用再去单独创建登录使用的项目
  • 登录使用的api项目和查询支付使用的api项目是两个不同的项目相互不干扰,查询支付的api项目一个google play账号对应一个项目,这个google play账号中所有的应用,都可以通过这个查询支付的api项目去查询
  • 获取code授权api项目时,要使用google play后台的开发者账号授权

  • api项目-同意屏幕,发布状态为测试(有效期7天)

  • RefreshToken 6个月都未使用,这个要维护accessToken的有效性,应该可以不必考虑
  • 授权账号改密码了(笔者未测试,修改开发者账号密码是否会导致过期)
  • 授权超过50个刷新令牌,最先的刷新令牌就会失效(这里50个应该够用了,除了测试时,可能会授权多个)
  • 取消了授权
  • 属于具有有效会话控制策略的 Google Cloud Platform 组织

Original: https://www.cnblogs.com/xiaogou/p/15568393.html
Author: 心雨星空
Title: Google支付和服务端验证

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/543185/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 使用stream flatmap获取集合中对象多个同类型数据 收集为另一个集合

    目的 把list集合中对象里面的多个string类型数据放在一个集合中 测试类 import java.util.ArrayList; import java.util.Colle…

    Java 2023年6月8日
    076
  • SpringBoot:SpringBoot引入外部依赖包并打包的解决方式

    由于项目需求,需要引用外部依赖jar包,并打进生成的项目jar包内。 pom中加入如下配置: 通过Maven导入外部jar包: scope: 配置的参数作用是 system:被依赖…

    Java 2023年5月30日
    080
  • 【IoT】MQTT Client软件-MQTTBox

    MQTTBox0.2.1下载:https://github.com/workswithweb/MQTTBox 环境对齐 PS E:\2000_AIoT\MQTTBox-master…

    Java 2023年5月29日
    073
  • Day3

    package base;public class Demo02 { public static void main(String[] args){ String a="…

    Java 2023年6月5日
    075
  • 14.将对象的字符串写入文件并保存到盘符

    public JsonVo savaCloudScript(ScriptModelVO scriptModelVo) throws RollbackableBizException…

    Java 2023年6月13日
    088
  • JAVA字符串格式化-String.format()的使用

    常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处。form…

    Java 2023年5月29日
    077
  • Spring Ioc源码分析系列–Bean实例化过程(一)

    Spring Ioc源码分析系列–Bean实例化过程(一) 前言 上一篇文章Spring Ioc源码分析系列–Ioc容器注册BeanPostProcesso…

    Java 2023年6月8日
    082
  • 热部署只知道devtools吗?JRebel不香吗?

    前言 JRebel收费怎么破? 什么是本地热部署? 什么是远程热部署? JRebel和devtools的区别 如何安装JRebel? 如何本地热部署? 如何远程热部署? 多模块开发…

    Java 2023年6月14日
    0102
  • 公众号文章汇总

    JDK源码分析实战系列-ThreadLocal自旋锁-JUC系列Doug Lea文章阅读记录-JUC系列AQS源码一窥-JUC系列AQS源码二探-JUC系列AQS源码三视-JUC系…

    Java 2023年6月14日
    083
  • Takeown、Cacls、Icacls-文件、文件夹夺权用法

    本文补充下常用的文件、文件夹夺权或者夺取所有者的方法,涉及Takeown、Cacls、Icacls用法。 takeown /f 文件名 获取该文件的所属权 takeown /f /…

    Java 2023年5月30日
    079
  • java操作pdf(pdfbox+poi)你想要的这里都有

    说两句废话 本来我只是想把我的一个pdf文件,多余的地方删除掉,再把个别页面的内容改下(多余内容干掉~),然后打印出来,我想要的这些wps还有很多软件都有,但是… 参考…

    Java 2023年6月7日
    083
  • AOP

    AOP AOP的入门案例: AOP的工作流程 SpringAop的本质是:代理模式 AOP的切入点表达式 重用切入点表达式: ①声明 @Pointcut(“execut…

    Java 2023年6月16日
    061
  • ORACLE错误码大全

    ORA-00001: 违反唯一约束条件 (.)错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。ORA-00017: 请求会话以设置跟踪事件ORA-00018: 超出最…

    Java 2023年6月8日
    096
  • Dubbo本地开发技巧

    作为后端服务负载、前后分离的主要手段,dubbo在业界中使用率还比较高。随着Dubbo系统的增多,本地开发、调试就出现了麻烦之处 直接在开发本地起同样一份服务 由于Dubbo采用负…

    Java 2023年6月7日
    0100
  • go实现用户状态的锁定和解锁功能

    1、前端页面js代码传值 function changeLock(id) { var url = ‘{{ urlfor "BackendUserController.Ch…

    Java 2023年6月13日
    062
  • 为什么实体类要实现Serializable进行序列化?

    为什么实体类要实现Serializable进行序列化? 转载 ​ 客户端访问了某个能开启会话功能的资源,web服务器就会创建一个与该客户端对应的HttpSession对象,每个Ht…

    Java 2023年6月8日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球