InApp 计费验证 Web 服务器 PHP 上的订单

2024-01-20

我正在使用一个简单的 PHP 脚本来验证 Android 订单以解析客户的下载。

$receipt = $_GET['purchaseData'];
$billInfo = json_decode($receipt,true);
$signature = $_GET['dataSignature'];
$public_key_base64 = "xxxxxxxxxxxxxxxx";
$key =  "-----BEGIN PUBLIC KEY-----\n".
        chunk_split($public_key_base64, 64,"\n").
       '-----END PUBLIC KEY-----';   

$key = openssl_get_publickey($key);

$signature = base64_decode($signature);

//$result = openssl_verify($billInfo, $signature, $key);
$result = openssl_verify($receipt, $signature, $key);
if (0 === $result) {
        echo "0";
    } else if (1 !== $result) {
        echo "1";
    } else {
        echo "Hello World!";
    }

//added the var_dump($result); as asked by A-2-A
var_dump($result);

结果是0int(0)

我在发布订单后通过应用程序下了一个真实的订单,当尝试验证订单时,我得到的结果是“0”。

我尝试直接HTTP访问

https://domain.com/thankyou.php?purchaseData={"packageName":"com.example.app","orderId":"GPA.1234-5678-1234-98608","productId":"product","developerPayload":"mypurchasetoken","purchaseTime":1455346586453,"purchaseState":0,"developerPayload":"mypurchasetoken","purchaseToken":"ggedobflmccnemedgplmodhp...."}&dataSignature=gwmBf...

我保留第一个问题,因为我的结果仍然是一个猜测。经过进一步调查,我认为这是谷歌发送的签名没有以一种干净的方式被读取的原因。

The signature=gwmBfgGudpG5iPp3L0OnepNlx当浏览器将其读取为ƒ ~®v‘¹ˆúw

怎样才能让它以正确的方式被阅读呢?


要验证签名,您需要确保以下事项:

  1. INAPP_PURCHASE_DATA没有以任何方式突变。任何编码或转义更改都将导致验证无效。确保它完好无损地到达服务器的最佳方法是对其进行 Base64 编码。
  2. INAPP_DATA_SIGNATURE还必须保持完整,它应该已经经过 Base64 编码,因此将其发送到您的服务器应该不成问题。
  3. openssl_验证 http://php.net/manual/en/function.openssl-verify.php期望两者data and signature参数处于原始状态,因此在验证之前进行 Base64 解码。
  4. 还需要signature_alg作为最后一个参数,在本例中sha1WithRSAEncryption应该像默认的那样工作,但如果有疑问,请尝试其他一些sha1算法 http://php.net/manual/en/function.openssl-get-md-methods.php看看哪些有效。

我最好的猜测为什么它现在对你不起作用是因为你没有收到INAPP_PURCHASE_DATA在您的服务器上,其状态与在应用程序上收到的状态相同。这堆栈溢出 https://stackoverflow.com/questions/34749489/server-side-verification-of-google-play-in-app-billing-purchase-signature-failed/34756767#34756767问题有同样的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

InApp 计费验证 Web 服务器 PHP 上的订单 的相关文章

  • 单元测试定位服务

    我有一个位置跟踪服务 正在尝试对其进行单元测试 我正在尝试使用 locationManager addTestProvider 和 setTestProviderLocation 方法来实现此目的 但是 我似乎无法通过提供程序获取任何位置并
  • GPSTracker 类不工作

    我尝试在我的应用程序中使用我在网上找到的 GPSTracker 类 并且我之前让它工作过 但现在似乎莫名其妙地不起作用 public class GPSTracker extends Service implements LocationL
  • 动态添加的 RemoteView 上的布局权重

    在我的小部件中 我使用以下内容将项目 R layout widget item 动态添加到我的主小部件布局中定义的 LinearLayout 中 Main widget layout RemoteViews views new Remote
  • Motorola Android 2.2 相机忽略 EXTRA_OUTPUT 参数

    我以编程方式打开相机来拍摄视频 我告诉相机使用如下代码将视频文件放置到指定位置 Intent intent new Intent MediaStore ACTION VIDEO CAPTURE File out new File sdcar
  • 在 Volley 中更新 UI 最有效的方法是什么

    最近我在 android 中使用 Volley 库 它工作得很好 但我想知道更新 UI 的最有效方法 我有一个包含所有 Volley 方法的 Utils 类 现在我传递了所有视图将作为参数更新 但我读到我可以在活动中实现侦听器 然后将它们作
  • 制作教程(教练标记)叠加层。需要帮助根据另一个视图的位置移动视图

    你好 我正在尝试在教程上做一个教练标记 主程序 java public class Main extends Activity private Button button1 private int x Override public voi
  • 删除 android ListView 的底部分隔线

    我有固定的高度ListView 它在列表项之间有分隔线 但它还在最后一个列表项之后显示分隔线 有没有办法在最后一项之后不显示分隔线ListView 只需添加android footerDividersEnabled false 到您的 Li
  • Monolog:如何捕获所有错误和异常

    我错过了一些非常明显的东西 如何让 monolog 记录所有 php 错误 php 用户错误和异常 在使用 monolog 之前 我编写了自己的函数并将其传递给set error handler register shutdown func
  • HttpURLConnection.getResponseCode() 冻结执行/不会超时

    我正在编写一个 Android 应用程序 它连接到受密码保护的 cPanel 服务器 Apache 2 2 22 页面 当身份验证凭据正确时 我的连接没有问题 但是 当凭据不正确时 我的 Android 应用程序似乎会冻结在HttpURLC
  • 为什么 CheckBox 检查不能以编程方式与 Kotlin 一起使用?

    我想这个问题以前可能有人问过 但这个问题也发生在我身上 所以我在这里再次询问 看看我们能否找到解决方案 所以基本上问题是以编程方式检查复选框不与 Kotlin 代码一起工作 为了解释一下 我正在分享我的代码和问题的屏幕截图 filterCo
  • Android SearchView 自定义

    我是 Android 新手 我被困在一些我认为很简单但我很困惑的事情上 我需要不在操作栏 工具栏中而是在我的相对布局中创建自定义 searchView 问题是我不知道如何自定义背景 文本输入颜色 XML 中的搜索图标颜色 或者只是它们的属性
  • 滑动抽屉上的按钮? - 安卓

    好吧 我已经在我正在构建的 Android 应用程序中的滑动抽屉上实现了一个按钮 唯一的问题是 当我按下按钮时 整个滑动抽屉都会被按下并向上滑动 我知道我可以在 XML 中禁用 按向上滑动 但这似乎不起作用 因为滑动抽屉仍然在没有向上滑动的
  • 使用PHP将大文件上传到谷歌云存储

    我正在尝试将大文件从服务器上传到云存储 文件超过 500mb 但 PHP 超时 我尝试查看 Google 客户端库文档 并在 stackoverflow 中进行爬行 但找不到任何可以帮助我的内容 还有有什么办法可以跟踪上传进度吗 这是我目前
  • FirebaseAuth.getInstance().signOut() 不注销

    我尝试从 firebase 注销用户 但在关闭应用程序并再次打开后 用户仍然处于连接状态 我尝试从 firebase 定期注销用户 但没有解决问题 我想知道是什么导致了这个问题 logout setOnClickListener new V
  • python 格式日期时间,带有“st”、“nd”、“rd”、“th”(英文序数后缀),如 PHP 的“S”

    我想要一个 python datetime 对象来输出 并在 django 中使用结果 如下所示 Thu the 2nd at 4 30 但我在python中找不到输出的方法st nd rd or th就像我可以使用 PHP 日期时间格式一
  • 重叠堆叠图像视图

    我正在尝试将图像视图堆叠在一起 70 重叠 我使用了一个frameLayout 并给每个elemnet填充了10 它有效 但是当涉及到处理事件时 这个填充让我很痛苦 有没有更好的重叠视图的方法 使用不同的布局 等 我正在为 Android
  • npm run dev 和 npm run production 之间的区别

    我对 Laravel 和 vue js 很陌生 请让我知道它们之间有什么区别npm run dev and npm run production 这和环境有关系吗 npm run dev创建源映射并且不会缩小 js css 这使得调试和查找
  • print_r 的替代方案(仅显示最多 2 3 个键)

    我有一个multi dimensional array有 200 个键 每个键有 3 到 5 个数组 我想知道有什么方法可以只看到有限的部分 即最多 3 或 4 个键 因为如果我使用print r desiredArray 然后花费了太多时
  • Firebase 令牌未生成

    我得到的令牌未生成 onTokenrefresh 没有调用 谁能帮忙 它已连接到 firebase 但令牌仍然没有生成 public class MyFireBaseInstanceId extends FirebaseInstanceId
  • SDK管理器不显示示例包选项

    我关注的是安卓安装示例的开发人员链接 http developer android com tools samples index html包裹 但是 当我展开Android平台的包列表时 没有 SDK示例 选项 复选框 可用 为什么 我已

随机推荐

  • 在 MATLAB 中拆分数组

    我有一个整数数组 我想在 0 出现的地方分割这个数组 并有一个函数给我分割点 示例 数组 0 0 0 1 2 4 5 6 6 0 0 0 0 0 22 4 5 6 6 0 0 0 4 4 0 该函数必须返回这些数字 3 10 14 20 2
  • 通过求和来聚合重复行

    根据我的问题 1 识别一组变量是否唯一标识数据的每一行 https stackoverflow com q 22834725 1414455 2 根据给定的变量集标记所有重复的行 https stackoverflow com q 2289
  • CMake 源代码中大小写一致性的工具

    CMake 命令在小写 大写和混合大小写下均有效 然而 将所有这些内容混合在一个文件中会降低 CMake 代码的可读性 有没有一种工具可以自动纠正这种风格不一致的情况 steveire 的答案链接到正确的资源 但让我明确解释一下 以防这些链
  • 关于 sbrk() 和 malloc()

    我已经彻底阅读了有关 sbrk 的 linux 手册 sbrk 改变程序中断的位置 它定义了结束 进程的数据段 即程序中断是第一个 未初始化数据段末尾之后的位置 And I do know that user space memory s
  • 如何刷新 WinForms DataGridView 上的数据源?

    我从 EntityFramework 模型填充 GridView DataSource gwTimeLog DataSource entities TimeLogs 当新行添加到 entities 时 我尝试更新网格 尝试使用与上面相同的语
  • Microsoft Sync Framework 还存在吗?

    根据MS文档Sync Framework Toolkit https code msdn microsoft com Sync Framework Toolkit 4dc10f0e https code msdn microsoft com
  • NSWindowController 与 NSViewController 之间的区别

    我来自iOS背景并开始学习Cocoa 在iOS除非我们有多个目标iPad and iPhone我们通常有一窗并使用管理屏幕UIViewControllers 每个新屏幕大多数时候都会映射到UIViewController 然而 在可可中 这
  • Treeset.contains() 问题

    所以我已经被一个问题困扰了一段时间 我想我不妨在这里寻求帮助 我将 Ticket 对象添加到 TreeSet Ticket 实现 Comparable 并重写 equals hashCode 和 CompareTo 方法 我需要使用 con
  • 古怪的 __set() 魔术函数

    谁能向我解释一下这种行为的逻辑吗 考虑以下情况 class EPPDomain protected myField public static function buildEPPDomain fieldValue me new self m
  • Select2:未捕获类型错误:options.results 不是函数

    我正在尝试使用 Select2 jquery 插件进行 AJAX 调用 查询似乎有效 但问题发生在 results 被称为options object Uncaught TypeError options results is not a
  • 默认变量值

    如果我在声明变量时没有为其赋值 那么它是否默认为零或只是内存中先前的值 e g float x 声明的变量可以是零初始化 值初始化 or 默认初始化 C 03 标准 8 5 5 恰当地定义了以下各项 To 零初始化T 类型的对象意味着 如果
  • 使用SimpleXmlElement和symfony2输出xml文件

    rootNode new SimpleXMLElement
  • OpenMP 如何重用线程

    我认为线程的创建和删除可能代价高昂 OpenMP 是否尝试重用现有线程 例如 pragma omp parallel sections num threads 4 pragma omp section worker A pragma omp
  • Rust 中连接向量的最佳方法是什么?

    是否有可能在 Rust 中连接向量 如果是这样 有没有一种优雅的方式来做到这一点 我有这样的事情 let mut a vec 1 2 3 let b vec 4 5 6 for val in b a push val 有谁知道更好的方法吗
  • 从 hIcon/hBitmap 获取字节/char*

    我正在开发一个C S应用程序 C 中的服务器和C 中的客户端 我需要发送一些有关当前正在运行的进程和相关图标的信息 我得到了图标文件感谢EnumWindows将此代码放在回调中 Get the window icon HICON hIcon
  • Angular - 不纯管道与函数

    我正在 Angular2 中的数组上实现过滤操作 当数组中的元素发生更改时 纯管道不会触发 因此 我必须使用不纯的管道或使用组件内部的函数进行过滤 如下所示 ngFor let item of items impureFilterPipe
  • 如何正确地从 Promise 返回多个值?

    我最近多次遇到某种情况 不知道如何正确解决 假设以下代码 somethingAsync then afterSomething then afterSomethingElse function afterSomething amazingD
  • 颁发身份超级账本作曲家时授权失败

    我阅读了建议检查 docker yaml 的答案 文件路径如下 我确认用户名是admin 密码是adminpw 不幸的是我仍然收到授权失败错误 我用来发布身份的命令 composer identity issue n trade netwo
  • 如何以 1 秒的间隔更新组件?

    我在戴尔面试时被问到这个问题 new Date 给你一个Date使用当前日期 时间初始化的对象 假设我的屏幕右上角显示当前时间 并且有人这样做了
  • InApp 计费验证 Web 服务器 PHP 上的订单

    我正在使用一个简单的 PHP 脚本来验证 Android 订单以解析客户的下载 receipt GET purchaseData billInfo json decode receipt true signature GET dataSig