前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >google play 支付签名验证

google play 支付签名验证

作者头像
崔哥
发布于 2022-09-07 06:02:57
发布于 2022-09-07 06:02:57
2.3K00
代码可运行
举报
文章被收录于专栏:崔哥的专栏崔哥的专栏
运行总次数:0
代码可运行

app端支付成功会有一个Purchase对象,里面有购买令牌(purchaseToken)和其他参数,如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JSONObject jsonObject=new JSONObject();
try {
    jsonObject.put("packageName", purchase.getPackageName());
    jsonObject.put("purchaseToken", purchase.getPurchaseToken());
    jsonObject.put("signature", purchase.getSignature());
    jsonObject.put("purchaseTime", purchase.getPurchaseTime());
    jsonObject.put("purchaseState", purchase.getPurchaseState());
    jsonObject.put("developerPayload", purchase.getDeveloperPayload());
//  jsonObject.put("accountIdentifiers", purchase.getAccountIdentifiers());
    jsonObject.put("orderId", purchase.getOrderId());
    jsonObject.put("originalJson", purchase.getOriginalJson());
    jsonObject.put("products", StringUtils.join(purchase.getProducts(), ","));
    jsonObject.put("quantity", purchase.getQuantity());
    jsonObject.put("isAutoRenewing", purchase.isAutoRenewing());
    jsonObject.put("isAcknowledged", purchase.isAcknowledged());
    Log.e("TAG", jsonObject.toString());
} catch (JSONException e) {
    e.printStackTrace();
}

得到的json,如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "packageName": "net.cuiwei.voice",
    "purchaseToken": "mjnmdjeccbcmeagmnfieahnd.AO-J1Oza5K7ZQVA。。",
    "signature": "BjEqq1T4NYMlIC\/SXXNgtX2UQRBh0kN。。",
    "purchaseTime": 1657271487378,
    "purchaseState": 1,
    "developerPayload": "",
    "orderId": "GPA.3349-0595-6867-76089",
    "originalJson": "{\"orderId\":\"GPA.3349-0595-6867-76089\",\"packageName\":\"net.cuiwei.voice\",\"productId\":\"voice_0\",\"purchaseTime\":1657271487378,\"purchaseState\":0,\"purchaseToken\":\"mjnmdjeccbcmeagmnfieahnd.AO-J1Oza5K7ZQVA。。",\"quantity\":1,\"acknowledged\":false}",
    "products": "voice_0",
    "quantity": 1,
    "isAutoRenewing": false,
    "isAcknowledged": false
}

建议这些参数都上传给服务器

作为服务端,我们知道客户端传过来的数据是可以伪造的,那么我们需要有一个验证签名的步骤

验证签名

验证签名需要三个参数

  • originalJson
  • signature
  • google公钥

如上图可以取得Google公钥

下面是PHP代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo googlePayVerify('original_json...', 'signature...', 'google_public_key...').PHP_EOL;

/**
 * 谷歌支付签名验证
 * @param string $original_json
 * @param string $signature
 * @param string $google_public_key
 * @return bool
 */
function googlePayVerify(string $original_json, string $signature, string $google_public_key):bool {
    $public_key_handle = openssl_pkey_get_public($google_public_key);
    if($public_key_handle===false){
        $public_key = "-----BEGIN PUBLIC KEY-----" . PHP_EOL .
            chunk_split($google_public_key, 64, PHP_EOL) .
            "-----END PUBLIC KEY-----";
        $public_key_handle = openssl_pkey_get_public($public_key);
        if($public_key_handle===false) return false;
    }
    $result = openssl_verify($original_json, base64_decode($signature), $public_key_handle, OPENSSL_ALGO_SHA1);
    openssl_free_key($public_key_handle);
    return $result;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用JWT实现单点登录(完全跨域方案)
官方文档是这样解释的:JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息。此信息可以通过数字签名进行验证和信任。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。 虽然JWT可以加密以在各方之间提供保密,但只将专注于签名令牌。签名令牌可以验证其中包含的声明的完整性,而加密令牌则隐藏其他方的声明。当使用公钥/私钥对签署令牌时,签名还证明只有持有私钥的一方是签署私钥的一方。
全栈程序员站长
2022/07/22
1.8K0
使用JWT实现单点登录(完全跨域方案)
微信支付api v3支付回调的处理
微信支付回调返回的参数(POST) Wechatpay-Serial(header) Wechatpay-Signature(header) Wechatpay-Timestamp(header) Wechatpay-Nonce(header) 主体(body) 验证签名 $verify=$smpw->_sign_verify([$timestamp, $nonce, $body], $signature); if ($verify==1){ echo 'ok'; }else echo 'failu
超级小可爱
2023/05/19
4.7K10
实战SpringBoot集成JWT实现token验证【附源码】
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。
用户5224393
2020/02/24
3.2K0
实战SpringBoot集成JWT实现token验证【附源码】
SpringCloud Gateway API接口安全设计(加密 、签名、安全)
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/06/07
1.8K0
SpringCloud Gateway API接口安全设计(加密 、签名、安全)
WooCommerce对接第三方支付插件开发(二)
IT不难
2023/11/17
5640
WooCommerce对接第三方支付插件开发(二)
php生成数字签名的几种方法
HMAC(散列消息认证码) 使用密钥和散列函数对消息进行加密,并用结果生成一个数字签名。
超级小可爱
2024/02/24
5710
RSA密文过长加密解密 越过1024的解决代码
RSA (详见维基百科)算法是现今使用最广泛的公钥密码算法,也是号称地球上最安全的加密算法,与 md5 和 sha1 不同,到目前为止,也只有极短的RSA加密被破解。
Tinywan
2019/07/16
5K0
Google支付和服务端验证
因为公司业务需求,需要使用google的登录和支付。google支付分为订阅和应用内购买两种,笔者使用的是应用内购买这种方式,这里将整个google支付和支付验证的流程记录下来。
超级小可爱
2023/02/17
6.2K0
使用PHP实现RSA或RSA2算法的签名和验签
 使用RSA算法除了加密解密之外(加密解密的代码可以查看本站PHP使用RSA算法加密解密数据 这篇文章),在支付等接口方面通常还会用到生成签名和验证签名操作,下面是PHP代码:
友儿
2022/09/09
8160
RSA 签名/验签 (PHP为例),以及各个秘钥格式解析
躺平程序员老修
2023/09/05
1.1K0
eos源码赏析(二十一):EOS智能合约之区块签名的天龙八“步”
在上篇文章中我们提到了,由用户操作会产生各种事务,事务的链上执行是由push_transaction来完成的,我们简单的划分了下,具体可参考eos源码赏析(二十):EOS智能合约之push_transaction的天龙八“步” 。我们知道,在区块生产或者打包事务信息的时候免不了对数据进行签名,同时对于非本节点的区块信息也要进行验签。当然,针对每一个事务也都有签名及验签的过程,我们今天以区块的签名过程为例,来谈谈eosio中的签名是如何实现的。由于本人在该领域接触较少,行文中难免出现纰漏和差错,还望各位读者能及时批评指正。
用户2569546
2021/11/23
4850
加签验签原理
当我们谈到加签(签名)和验签(验证签名)时,通常是在信息安全领域中,特别是在数据传输和通信方面。这两个概念主要用于确保数据的完整性和身份验证,以防止数据被篡改或冒充。
找Bug
2023/11/20
1.4K0
加签验签原理
简易http接口实现[通俗易懂]
http接口是什么,我一直没找到比较明确的定义(如果有哪位可以提点一下,我将非常感谢),今天就自己来总结一下吧。个人认为,http接口就是一种基于http服务的api,是系统之间交互的一种约定,所谓的web service其实也就是一种http接口,只不过它是比较规范的、通用的。
全栈程序员站长
2022/08/31
9200
简易http接口实现[通俗易懂]
PHP实现的MD5结合RSA签名算法实例
本文实例讲述了PHP实现的MD5结合RSA签名算法。分享给大家供大家参考,具体如下:
用户2323866
2021/07/09
9480
WWDC21 - App Store Server API 实践总结
大家好,我们在去年在 WWDC21 后 6 月 17 日发表了总结文章《苹果iOS内购三步曲 - WWDC21》。当时只是根据苹果的演讲内容进行了梳理,当时的很多接口和功能并没有上线,比如根据玩家的发票订单号查询用户的苹果收据,查询历史订单接口等,当时文章并没有深入的分析,而如今都 2022 年了,苹果 App Store Server API 已经上线,所以,今天我们一起来了解一下,相关 API 的具体使用实践吧~
37手游iOS技术运营团队
2022/01/25
11.9K1
WWDC21 - App Store Server API 实践总结
API签名设计(php版)
API签名设计 可变性 每次的签名必须是不一样的。 时效性 每次请求的时效,过期作废等。 唯一性 每次的签名是唯一的。 完整性 能够对传入数据进行验证,防止篡改。 步骤 将所有参数(注意是所有参数),除去sign本身,以及值是空的参数,按参数名字母升序排序。 然后把排序后的参数按参数1值1参数2值2…参数n值n(这里的参数和值必须是传输参数的原始值,不能是经过处理的)的方式拼接成一个字符串。 把分配给接入方的验证密钥key拼接在第2步得到的字符串前面。 在上一步得到的字符串前面加上验证密钥key(这
友儿
2022/09/11
1.3K0
Ping++ 支付接口对接
一、请求charge对象 package com.bra.modules.util.pingplusplus; import com.bra.common.utils.SystemPath; import com.pingplusplus.Pingpp; import org.springframework.stereotype.Service; import java.io.File; /** * Created by Afon on 16/4/26. */ @Service public cl
week
2018/08/27
1.5K0
Java 接入苹果支付 IAP支付
填写基本的银行信息。然后再填写一些基本信息(强制要求的填写,没强制的没必要写!!!)
收心
2022/01/20
5.5K0
Java 接入苹果支付 IAP支付
美餐支付 - PHP代碼实现
泥豆芽儿 MT
2024/01/10
2110
美餐支付 - PHP代碼实现
手把手教你完成App支付JAVA微信支付
这篇内容看标题已经很明确了,由于微信是用xml通讯的,所以这一点比较恶心,各位可能需要在项目里导入一些解析xml的包。 首先放出工具类(包含支付宝用到的工具类),因为现在csdn下载都是扣积分的,因为工具类代码会在文尾贴出。
Java编程指南
2019/08/02
2.4K0
手把手教你完成App支付JAVA微信支付
相关推荐
使用JWT实现单点登录(完全跨域方案)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验