老文章,搬运到这里而已。

因业务需要接入Google的激励广告,涉及Google回调的服务器端验证 (SSV) server side verifiy。
Python版本的基于第三方包ecdsa开箱即用,PHP版本也有一个ecdsa库,但是过于复杂。
想到之前做支付宝支付,google支付的openssl rsa密钥签名校验。还是自己来写个简单实用的。

Google公钥的地址:

https://www.gstatic.com/admob/reward/verifier-keys.json

注意:

  1. AdMob 密钥服务器提供的公钥会不定期轮换。为确保可以继续按预期验证 SSV 回调,请勿使公钥的缓存时间超过 24 小时。
  2. Google 预计您的服务器会针对 SSV 回调返回 HTTP 200 OK 成功状态响应代码。如果您的服务器无法访问或未提供预期的响应,Google 将重新尝试发送 SSV 回调,每隔 1 秒发送最多 5 次。
  3. 用回调参数中key_id 取对应公钥,进行签名验证。

获取公钥可以使用curl 或 file_get_contents 函数,推荐使用curl。 这里就不再写获取公钥的代码了,直接copy过来使用。

完整代码如下:

// Google admob 公钥
$verifier_keys = '{"keys":[{"keyId":3335741209,"pem":"-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+nzvoGqvDeB9+SzE6igTl7TyK4JB\nbglwir9oTcQta8NuG26ZpZFxt+F2NDk7asTE6/2Yc8i1ATcGIqtuS5hv0Q==\n-----END PUBLIC KEY-----","base64":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+nzvoGqvDeB9+SzE6igTl7TyK4JBbglwir9oTcQta8NuG26ZpZFxt+F2NDk7asTE6/2Yc8i1ATcGIqtuS5hv0Q=="}]}';// Google 回调参数字符串,get传参
$query_string = '';// json 格式公钥字符串,转数组,根据回调参数query_string中的key_id 取对应的公钥验证签名
$verifier_keys_arr = json_decode($verifier_keys, true);
if(empty($verifier_keys_arr) || !is_array($verifier_keys_arr)){throw new Exception("wrong google public keys!");
}
// 公钥的两种格式,pem 和 base64
$publicKey_pem = $verifier_keys_arr['keys'][0]['pem'];
$publicKey_base64 = $verifier_keys_arr['keys'][0]['base64'];
// base64 的格式化
$publicKeyString = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($publicKey_base64, 64, "\n", true) . "\n-----END PUBLIC KEY-----";
// pem转公钥资源对象
$publicKey = openssl_pkey_get_public($publicKeyString);
// 注: publicKey_pem, publicKeyString, publicKey 都是可以正常签名的// 解析回调参数
parse_str($query_string, $query_arr);
// 签名结果字符串
$signature = trim($query_arr['signature']);
// 重要的是这里的签名结果字符串的替换 和 补位
$signature = str_replace(['-', '_'], ['+', '/'], $signature);
$signature .= '===';// 进行签名的数据元字符串
$message = substr($query_string, 0, strpos($query_string, 'signature')-1);$return = ['code' => 0,'message' => 'error'
];//验证签名, 这里使用 $publicKey,$publicKey_pem, $publicKeyString 都是可以的
$success = openssl_verify($message, base64_decode($signature), $publicKey, OPENSSL_ALGO_SHA256);
if ($success === -1) {$return['message'] = '111111'.openssl_error_string();
} elseif ($success === 1) {$return['code'] = 1;$return['message'] = 'success';
} else {$return['message'] = '222222'.openssl_error_string();
}var_dump($return);

执行php脚本:

$ php -f admob_ssv.php
array(2) {'code' =>int(1)'message' =>string(7) "success"
}

success 为校验成功。

附:
composer包:composer require depakin/admobssv
github地址:https://github.com/yisangwu/google_admob_ssv

PHP版本Google广告admob服务端回调验证SSV相关推荐

  1. Google广告AdMob的集成和使用

    Google广告AdMob的集成和使用 作者:popovich 效果如图: 第一步 进入AdMob官网注册账号 (用google邮箱的账号)https://apps.admob.com/ 如图 填写自 ...

  2. android binder - 客户端(c++层) 调用 服务端(java层),服务端回调客户端 例子

    学习了: android binder - 客户端(java层) 调用 服务端(c++层) 例子 http://blog.csdn.net/ganyue803/article/details/4131 ...

  3. 微信支付宝服务器在哪里,支付宝支付与微信支付服务端回调notify_url数据的区别...

    这两天优化了一下支付宝支付和微信支付订单回调的问题,之前我们的订单都是用手动回调给服务器,现在改成支付宝和微信原生的异步回调,结果并没有像我们想象的那么简单,支付宝是很顺利的解决回调,用一般的方式接收 ...

  4. SVN版本服务器搭建(服务端+客户端)

     http://www.cnblogs.com/warrior1988/p/5359084.html 环境:Win7 32 bit SVN简介:程序员在编写程序的过程中,每个程序员都会生成很多不同 ...

  5. Python Google内购服务端验证

    Google内购完成后,服务端需要校验订单的状态是否正确(是否已经成功付款). 一.申请认证 参考https://developers.google.cn/android-publisher/gett ...

  6. php 版本 微信支付 APP 服务端开发

    我们通过 微信支付的文档知道 第一步 服务端需要调用统一下单接口生成预付单,其中主要的参数就是 prepay_id 这样 app 通过 prepay_id 就可以发起支付请求了. 我们可以参考 微信支 ...

  7. 苹果支付流程以及服务端php验证

    苹果支付和常规国内的支付流程完全不一样,流程如下: 步骤如下: 1.上架产品 首先需要在苹果网站上架对应的app产品,有对应的id和价格,名称等数据 2.前端拉起商品列表 用户登录app后,进入商品购 ...

  8. java httpinvoker漏洞_Spring HttpInvoker 服务端安全验证的和客户端请求配置

    1.服务端 服务Java接口 package service; public interface TestService { int add(int i,int j); } 服务的Java实现 pac ...

  9. php中接口验证失败,支付宝手机接口,服务端PHP验证失败,求助

    本帖最后由 js14654952 于 2013-01-16 17:12:11 编辑 最近做支付宝手机接口郁闷死了 求大神们帮忙~! 问题1:手机端安卓自然是JAVA,而服务端是PHP,在做支付宝异步验 ...

最新文章

  1. Centos7上安装docker 详细教程
  2. html链接伪类设置鼠标悬停,链接伪类可以控制超链接的样式吗?是怎样实现的?...
  3. Arm 发布Mali多媒体套件,机器学习将不再是高端手机的专享
  4. python获取文件名及文件扩展名的方法
  5. java 打包zip下载_java web 将文件打包成 .zip后 肿么自动弹出下载框提示并下载?
  6. mysql过滤效率和java过滤效率_如何合理选择初中高效过滤器的效率?
  7. 动物和计算机-自组织是悬空的钢丝
  8. Web Visibilitychange
  9. 阿里云成国内云业务业内资质最全厂商
  10. 什么是SQL Server事务日志中的虚拟日志文件?
  11. php mysql多表关联删除_MySQL中多表删除方法
  12. 记忆化搜索--poj 1597 Function Run Fun
  13. linux raid5 nas,free nas 创建软raid5 来做iscsi服务 1
  14. 电脑小米手机,小米手机怎么连接电脑?
  15. 番茄todo服务器维护,番茄ToDo:克服“拖延症”必备高效神器!
  16. linux 云计算 python web和http协议
  17. python3 jason 、pickle 和cpickle
  18. 移动端 懒加载、下拉刷新、上拉加载
  19. 沪深A股分析数据机构持股信息API接口(JSON标准格式,Get请求方式)
  20. Springboot+Mysql在线众筹系统

热门文章

  1. Servlet[springmvc]引发了load()异常
  2. 疫情之下的远程办公,基础架构成为重中之重
  3. mc服务器控制台发消息,控制台作用介绍及控制台命令大全分享
  4. svn: 'path' has no ancestry information
  5. fabric生成交易相关文件时报错
  6. DEDE5.7SP1 添加栏目图片 并且标签调用
  7. edas上传pdf 失败
  8. ubuntu 16.04挂载2T机械硬盘
  9. 聊聊让开发头疼的一句话需求那些事
  10. 计算机组成原理 - 计算机的硬件组成 (存储器 + CPU +I/O设备)