接入GoogelAdmob C#服务器端验证 (SSV) 回调
记一次接入谷歌广告验证
官方文档:https://developers.google.cn/admob/android/rewarded-video-ssv
需要httpserver进行验证,项目里有httpserver,因此通过将服务端ip端口绑定域名的方法进行验证回调。
验证回调:在官网添加应用了可以添加回调网址进行验证 加密使用的是ECDSA,c#解决方案参考:https://stackoverflow.com/questions/61659891/c-sharp-signature-verification-using-ecdsa-with-sha256-certificate 获取公钥网址:http://www.gstatic.com/admob/reward/verifier-keys.json
获得的json格式如下:{"keys":[{"keyId":3335741209,"pem":"-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+nzvoGqvDeB9+SzE6igTl7TyK4JB\nbglwir9oTcQta8NuG26ZpZFxt+F2NDk7asTE6/2Yc8i1ATcGIqtuS5hv0Q==\n-----END PUBLIC KEY-----","base64":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+nzvoGqvDeB9+SzE6igTl7TyK4JBbglwir9oTcQta8NuG26ZpZFxt+F2NDk7asTE6/2Yc8i1ATcGIqtuS5hv0Q=="}]}
pem和base64都可以进行验证,但需要转化成统一格式 验证过程:
var pubkeyString =
@"-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+nzvoGqvDeB9+SzE6igTl7TyK4JBbglwir9oTcQta8NuG26ZpZFxt+F2NDk7asTE6/2Yc8i1ATcGIqtuS5hv0Q==
-----END PUBLIC KEY-----";
var pemreader = new PemReader(new StringReader(pubkeyString));
var pubkey = (AsymmetricKeyParameter)pemreader.ReadObject(); var data = "ad_network=5450213213286189855&ad_unit=1234567890&custom_data=106&reward_amount=1&reward_item=Reward×tamp=1621586055036&transaction_id=123456789&user_id=11111";
StringBuilder signature = new StringBuilder();
signature.Append("MEYCIQCaRAEhqLlOBwSHrlNcZyunYROD3xIMROOD+zAamwlFDwIhANDRk9qXfAZg/BCLslzmqy2PFXk3fr3tQjaEqqSdaRyP");
//对base64格式化,替换和补位
signature = signature.Replace('-', '+').Replace('_', '/');
int remainder = signature.Length % 4;
if(remainder > 0)
{
signature.Append('=', 4 - remainder);
}
var signatureBytes = Convert.FromBase64String(signature.ToString()); // Verify using the public key
var signer = SignerUtilities.GetSigner("SHA-256withECDSA");
signer.Init(false, pubkey);
signer.BlockUpdate(Encoding.UTF8.GetBytes(data), 0, data.Length);
var success = signer.VerifySignature(signatureBytes); if (success)
{
Console.WriteLine("Signature verified successfully using public key");
}
else
{
Console.WriteLine("Failed to verify signature using public key");
}
附上可验收上述代码的,可以根据算法在线生成公钥私钥、加密数据、验证签名的网址:https://8gwifi.org/ecsignverify.jsp
接入GoogelAdmob C#服务器端验证 (SSV) 回调的更多相关文章
- FineUI(开源版)v6.0中FState服务器端验证的实现原理
前言 1. FineUI(开源版)是完整开源,最早发起于 2008-04,下载全部源代码:http://fineui.codeplex.com/ 2. 你可以通过捐赠作者来支持FineUI(开源版)的 ...
- SpringMVC 服务器端验证
1.导入JSR303验证类库Jar包2.在MVC的配置文件中添加<mvc:annotation-driven/>的配置3.在MVC的配置文件中添加验证器的配置4.在接收表单数据的类中添加验 ...
- jsf服务器端验证用户输入
服务器端验证用户输入数据步骤 1 html页面上插入要输入数据控件 <h:inputText size="10" value="#{commodityBean.fo ...
- jQuery html5Validate基于HTML5表单 异步服务器端验证
1. HTML5 自带的Validate 很漂亮,很好用, 但是一定要在form里用submit按钮,才生效 <form id="frmInfo" action=" ...
- 为 jquery validate 添加验证失败回调
转载自:https://blog.csdn.net/huang100qi/article/details/52619227 1. jquery Validation Plugin - v1.15.1 ...
- (十六)客户端验证与struts2中的服务器端验证
一.客户端验证: 即用javaScript来验证. <%@ page language="java" contentType="text/html; charset ...
- CXF 入门:创建一个基于WS-Security标准的安全验证(CXF回调函数使用,)
http://jyao.iteye.com/blog/1346547 注意:以下客户端调用代码中获取服务端ws实例,都是通过CXF 入门: 远程接口调用方式实现 直入正题! 以下是服务端配置 ==== ...
- Spring Security 入门(3-11)Spring Security 的使用-自定义登录验证和回调地址
配置文件 security-ns.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...
- android客户端向服务器端验证登陆方法的实现2
一.在上一篇文章中,我只是提到了其中一种方法来实现登陆 大家可以参见: http://www.apkbus.com/android-45004-1-1.html android获取web服务 ...
- springboot内置tomcat验证授权回调页面域名
springboot内置tomcat验证公众号授权回调页面域名 解决方法: 网上下载一个tomcat,在server.xml文件中修改端口为springboot内置tomcat的端口号,复制验证文件到 ...
随机推荐
- 快速上手python的简单web框架flask
目录 简介 web框架的重要组成部分 快速上手flask flask的第一个应用 flask中的路由 不同的http方法 静态文件 使用模板 总结 简介 python可以做很多事情,虽然它的强项在于进 ...
- MyBatis-Plus修改数据,会不会把其他字段置为null
前两天在用MyBatis-Plus写了一张单表的增删改查,在写到修改的时候,就突然蹦出一个奇怪的想法. MyBatis-Plus的BaseMapper中有两个关于修改的方法.如下: int updat ...
- 借助 Flutter 跨平台特性连接 10 亿玩家 | Flutter 开发者故事
由光子工作室及 Krafton 联合研发的 PUBG MOBILE 依然保持着极高的人气,目前全球有 10 亿玩家,日活跃 5,000 万 (不包括中国大陆地区).从游戏策划伊始,团队就打算为各个平台 ...
- undefined会变为null吗?
echarts 会将 series data中的数据并不是你想的那样简单 我们很多小伙伴都使用过echarts. 然后 series:[{ data:[] }] 中的数据可能并没有我们想的那样简单 为 ...
- 微服务学习计划——SpringCloud
微服务学习计划--SpringCloud 在学习并掌握了众多基础框架之后,我们的项目繁杂且难以掌握,那么我们就需要开启一门新的课程,也就是我们常说的微服务架构 随着互联网行业的发展,对服务的要求也越来 ...
- STM32F1库函数初始化系列:定时器中断
1 static void TIM3_Configuration(void) //10ms 2 { 3 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 4 ...
- 简要介绍WASAPI播放音频的方法
正文 填一下之前挖的坑,这回就说说怎么用WASAPI播放声音吧. 本文完整代码可以在以下链接找到 https://gitcode.net/PeaZomboss/learnaudios 目录是demo/ ...
- Spring(IOC自动装配-基于注解开发)
Spring IoC 自动装载 autowire: 自动装载是Spring提供的一种更加简单的方式,来完成DI,不需要手动配置property ,IoC容器会自动选择Bean玩成注入. 自动装载俩种: ...
- EPICS Archiver Appliance存储waveform记录的尝试
https://blog.csdn.net/u013894429/article/details/79724454 按上面的指导很容易跑起来,试了一下,也能archive短些的waveform记录,很 ...
- Linux服务器数据备份恢复
转载csdn: https://blog.csdn.net/weixin_33794672/article/details/92894022