google 内购记录

1.GooglePlay内购服务器验单配置 (新版本好像不需要API 配置关联,好像不需要了)

详细配置url: https://blog.csdn.net/wuyutaoktm/article/details/122450878

2. 用golang代码实现,主要是验证订单和发币,PAY_JSON 是上一个步骤申请的

func verifyAndConsumePurchase(info *PurchaseInfo) (bool, error, int8) {ctx := context.Background()rawByte, _ := json.Marshal(info)googlePayLog := &handler.GooglePayLog{UserID:            info.UserId,Raw:               string(rawByte),RespRaw:           "",PurchaseTokenMD5:  "",CheckStatus:       -1,ConsumptionStatus: -1,GoldStatus:        -1,RechargeID:        0,MsgErr:            "",}// 使用服务账号创建凭证conf, err := google.JWTConfigFromJSON([]byte(PAY_JSON), androidpublisher.AndroidpublisherScope)if err != nil {googlePayLog.MsgErr = "1:" + err.Error()db_common.ApplyInsertGooglePayLog(googlePayLog)zlog.F().Errorf("user_id:%d,producd_id:%s,%v", info.UserId, info.ProductID, googlePayLog.MsgErr)return false, err, 0}// 使用凭证创建Google Play Developer服务service, err := androidpublisher.NewService(ctx, option.WithTokenSource(conf.TokenSource(ctx)))if err != nil {googlePayLog.MsgErr = "2:" + err.Error()db_common.ApplyInsertGooglePayLog(googlePayLog)zlog.F().Errorf("user_id:%d,producd_id:%s,%v", info.UserId, info.ProductID, googlePayLog.MsgErr)return false, err, 0}// 调用API验证购买call := service.Purchases.Products.Get(info.PackageName, info.ProductID, info.PurchaseToken)response, err := call.Do()if err != nil {googlePayLog.MsgErr = "3:" + err.Error()db_common.ApplyInsertGooglePayLog(googlePayLog)zlog.F().Errorf("user_id:%d,producd_id:%s,%v", info.UserId, info.ProductID, googlePayLog.MsgErr)return false, err, 1}str, _ := json.Marshal(response)zlog.F().Infof("userId:%d,productId:%d,response: %+v", info.UserId, info.ProductID, str)//0:表示交易已成功,并且商品未被消费。//1:表示交易被取消。//2:可能表示交易被拒绝,或某些其他的错误状态。// 验证购买状态:0表示购买成功if response.PurchaseState != 0 {zlog.F().Errorf("user_id:%d,producd_id:%s,PurchaseState:%d", info.UserId, info.ProductID, response.PurchaseState)googlePayLog.CheckStatus = int8(response.PurchaseState)googlePayLog.PurchaseTokenMD5 = utils.Md5(response.PurchaseToken)db_common.ApplyInsertGooglePayLog(googlePayLog)return false, nil, 0}// 调用API确认消费(消耗商品)//consumeCall := service.Purchases.Products.Acknowledge(info.PackageName, info.ProductID, info.PurchaseToken, &androidpublisher.ProductPurchasesAcknowledgeRequest{})consumeCall := service.Purchases.Products.Consume(info.PackageName, info.ProductID, info.PurchaseToken)if err := consumeCall.Do(); err != nil {googlePayLog.CheckStatus = int8(response.PurchaseState)googlePayLog.PurchaseTokenMD5 = utils.Md5(response.PurchaseToken)googlePayLog.ConsumptionStatus = 0 // 0表示消费失败googlePayLog.MsgErr = "4:" + err.Error()db_common.ApplyInsertGooglePayLog(googlePayLog)zlog.F().Errorf("user_id:%d,producd_id:%s,%v", info.UserId, info.ProductID, googlePayLog.MsgErr)return false, err, 1}// 加币操作if err = dealMysql(info, googlePayLog); err != nil {googlePayLog.CheckStatus = int8(response.PurchaseState)googlePayLog.PurchaseTokenMD5 = utils.Md5(response.PurchaseToken)googlePayLog.ConsumptionStatus = 1 // 1表示消费失败googlePayLog.GoldStatus = 0        // 0 加币失败googlePayLog.MsgErr = "5:" + err.Error()db_common.ApplyInsertGooglePayLog(googlePayLog)zlog.F().Errorf("user_id:%d,producd_id:%s,%v", info.UserId, info.ProductID, googlePayLog.MsgErr)return false, err, 1} else {// successgooglePayLog.CheckStatus = int8(response.PurchaseState)googlePayLog.PurchaseTokenMD5 = utils.Md5(response.PurchaseToken)googlePayLog.ConsumptionStatus = 1 // 1表示消费失败googlePayLog.GoldStatus = 1        // 0 加币失败db_common.ApplyInsertGooglePayLog(googlePayLog)}return true, nil, 0
}

3. 注意丢单情况,改成客户端主动查询丢单

丢单因为主要是因为支付操作都是在客户端完成的,非常容易受到网络等因素的影响,造成互相通信失败。比如:用户确认支付后,把请求提交给google play,可能因为网络不好造成,客户端没有接收到支付成功能消息(但有可能已经支付成功了,只是没收到支付结果而已);还有客户端把支付结果通知给服务器时,也有可能因丢包等问题造成通知失败。
在这里插入图片描述

4. 官网服务端api

api接口,get 和 确认消耗consume

服务端api官网地址: https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.products/consume?hl=zh-cn

安卓api:
https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setobfuscatedaccountid

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/605795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java后端开发——Ajax、jQuery和JSON

Java后端开发——Ajax、jQuery和JSON 概述 Ajax全称是Asynchronous Javascript and XML,即异步的JavaScript和 XML。Ajax是一种Web应用技术,该技术是在JavaScript、DOM、服务器配合下,实现浏览器向服务器发送异步请求。 Ajax异步请求方式不…

螺纹钢负公差测径仪获得哪些信息?

螺纹钢负公差轧制是很多厂家在使用的一种轧制方式,蓝鹏测控在推出普通型轧钢测径仪和智能型轧钢测径仪后,又推出了可显示负公差信息的测径仪,本文来简单看一下螺纹钢负公差轧制能从测径仪中获得哪些信息? 负公差测径仪为了能对螺纹…

Java+springboot+vue智慧校园源码,数据云平台Web端+小程序教师端+小程序家长端

技术架构: Javaspringbootvue element-ui小程序电子班牌:Java Android演示自主版权。 智慧校园电子班牌人脸识别系统全套源码,包含:数据云平台Web端小程序教师端小程序家长端电子班牌 学生端。 电子班牌系统又称之为智慧班牌&am…

Sui链上铭文爆火,TPS近6000领先同行

在2023年接近尾声时,用户涌入众多智能合约平台进行铭文相关交易,无意中对各种网络进行了压力测试。在许多平台出现拥堵和费用飙升的情况下,Sui通过实现令人印象深刻的TPS,在没有减速或gas费用激增的情况下脱颖而出。 最初用于比特…

vue3+vite +element plus日历date picker中文显示

项目情况 element-plus 默认是英文模式,需要中文模式的话需要设置一下: 项目框架(vue3):vite JS element-plus 版本:(注意版本兼容,element plus 较低版本:1.xx.xx&a…

STL标准库与泛型编程(侯捷)笔记3

STL标准库与泛型编程(侯捷) 本文是学习笔记,仅供个人学习使用。如有侵权,请联系删除。 参考链接 Youbute: 侯捷-STL标准库与泛型编程 B站: 侯捷 - STL Github:STL源码剖析中源码 https://github.com/SilverMaple/STLSourceCo…

中国式浪漫:古人对万物的雅称

古人对万物的称呼都是美而浪漫,在诗词中,女子被称为红妆、佳人、婵娟、碧玉、红颜。雪也叫作琼芳、玉絮、六花、玉鸾;在诗词中,每一缕风,每一片雪,都有一个雅致的名字。所谓的诗情画意,便是用普…

基于深度学习的停车位关键点检测系统(代码+原理)

摘要: DMPR-PS是一种基于深度学习的停车位检测系统,旨在实时监测和识别停车场中的停车位。该系统利用图像处理和分析技术,通过摄像头获取停车场的实时图像,并自动检测停车位的位置和状态。本文详细介绍了DMPR-PS系统的算法原理、…

最短路径问题相关算法、原理及适用场景

这里写目录标题 一、最短路径算法、原理及适用场景深度优先搜索算法/广度优先搜索算法Floyd算法(Floyd-Warshell算法)Dijkstra算法A*算法贝尔曼福特算法(Bellman-Ford Algorithm)SPFA算法(Shortest Path Faster Algori…

FPGA高端项目:纯verilog的 25G-UDP 高速协议栈,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的以太网方案本协议栈的 1G-UDP版本本协议栈的 10G-UDP版本1G 千兆网 TCP-->服务器 方案1G 千兆网 TCP-->客户端 方案10G 万兆网 TCP-->服务器客户端 方案 3、该UDP协议栈性能4、详细设计方案设计架构框图网络调试助手…

传感数据分析——小波滤波

传感数据分析——小波滤波 文章目录 传感数据分析——小波滤波前言一、运行环境二、Python实现总结 前言 小波滤波算法是一种基于小波变换的滤波方法,其核心思想是将信号分解成不同的频率成分,然后对每个频率成分进行独立的处理。小波滤波器的设计和应用…

第12课 实现桌面与摄像头叠加

在上一节,我们实现了桌面捕获功能,并成功把桌面图像和麦克风声音发送给对方。在实际应用中,有时候会需要把桌面与摄像头图像叠加在一起发送,这节课我们就来看下如何实现这一功能。 1.备份与修改 备份demo11并修改demo11为demo12…

安达发|基于APS排程系统的PDM功能

APS系统(Advanced Planning and Scheduling,先进计划与排程)是一种基于APS系统(Advanced Planning and Scheduling,先进计划与排程)是一种基于供应链管理和生产管理的综合性软件系统。它通过整合企业内外部…

在anaconda中安装pytorch的GPU版本

本文前提: 1.你已经下载好了anaconda,最好是新建一个虚拟环境来安装pytorch的GPU版本,并且设置了国内镜像源; 2.了解自己电脑对应的cuda版本,可通过nvidia-smi,并下载好了cuda。 安装pytorch的GPU版本 到官网中https…

微信公众号-订阅通知

第一步: 公众号需要实名认证,完成以后! 设置-开发里找到基本配置: 开发者ID(AppID):xxxxxxxxxxxxxxxxxxxxxxxxx 开发者密码(AppSecret):xxxxxxxxxxxxxxxxxxxxxxxxx 白名单IP也要填写上你的服务器IP哦! 第二步&am…

聊天Demo

文章目录 参考链接使用前端界面消息窗口平滑滚动至底部vue使用watch监听vuex中的变量变化 参考链接 vue.js实现带表情评论功能前后端实现(仿B站评论) vue.js实现带表情评论仿bilibili(滚动加载效果) vue.js支持表情输入 vue.js表…

使用Scrapy框架和代理IP进行大规模数据爬取

目录 一、前言 二、Scrapy框架简介 三、代理IP介绍 四、使用Scrapy框架进行数据爬取 1. 创建Scrapy项目 2. 创建爬虫 3. 编写爬虫代码 4. 运行爬虫 五、使用代理IP进行数据爬取 1. 安装依赖库 2. 配置代理IP和User-Agent 3. 修改爬虫代码 4. 运行爬虫 六、总结 一…

【AI视野·今日Sound 声学论文速览 第四十二期】Fri, 5 Jan 2024

AI视野今日CS.Sound 声学论文速览 Fri, 5 Jan 2024 Totally 10 papers 👉上期速览✈更多精彩请移步主页 Daily Sound Papers PosCUDA: Position based Convolution for Unlearnable Audio Datasets Authors Vignesh Gokul, Shlomo Dubnov深度学习模型需要大量干净的…

【算法Hot100系列】合并两个有序链表

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

前端nginx配置指南

前端项目发布后,有些接口需要在服务器配置反向代理,资源配置gzip压缩,配置跨域允许访问等 配置文件模块概览 配置示例 反向代理 反向代理是Nginx的核心功能之一,是指客户端发送请求到代理服务器,代理服务器再将请求…