PHP 网络游戏防沉迷接口 代码与坑
相信大家最近都被防沉迷 接口整的头疼 也有很多坑 下面介绍下对接沉迷的注意事项与接口代码
1、首先在 接口测试 中获取到 APPID、Secret Key、bizId等测试数据 同时配置IP白名单 配置访问ip
2、直接上代码 ,需要用到的方法,自己写的 直接拿过去修改下可以用的
/* * 请求身份验证接口* $name 姓名,$card 身份证号,$member_id 平台用户id,$test_code 测试码*/
function getIdCard($name,$card,$member_id,$test_code='')
{$secret_key = ''; //正式secret_key$appId = ''; //正式appId $bizId = ''; //正式bizId $timestamps = getMillisecond(); //当前毫秒时间戳$url = 'https://api.wlc.nppa.gov.cn/idcard/authentication/check';if($test_code) {$secret_key = 'a84b4e7eaa4854cc7faf68285c4a61f7'; //测试secret_key$appId = '2dea4362b36f4b5d9ab19aef5801d72e'; //测试appId $bizId = '1101999999'; //测试bizId$url = 'https://wlc.nppa.gov.cn/test/authentication/check/'.$test_code;}$head = ['appId'=>$appId,'bizId'=>$bizId,'timestamps'=>$timestamps];//请求头$header[] = 'Content-Type:application/json;charset=utf-8';$header[] = 'appId:'.$appId;$header[] = 'bizId:'.$bizId;$header[] ='timestamps:'.$timestamps;//请求体$body['ai'] = md5($member_id); //32位 不然也会报错$body['name'] = $name;$body['idNum'] = $card;//请求体加密$data['data'] = bodyEncrypt($body,$secret_key);//请求头签名 一般报错1011是签名错误$header[]= 'sign:'.getSign($data,[],$secret_key,$head);//请求查询接口$res = reqCurl($url,3,'post',$data,$header);$res = json_decode($res,true);return $res;
}/* * 查询身份接口* $name 姓名,$card 身份证号,$member_id 平台用户id,$test_code 测试码*/
function queryIdCard($name,$card,$member_id,$test_code='')
{$secret_key = '';$appId = '';$bizId = '';$timestamps = getMillisecond();$member_id = md5($member_id);$url = 'https://api.wlc.nppa.gov.cn/idcard/authentication/query?ai='.$member_id;if($test_code) {$secret_key = 'a84b4e7eaa4854cc7faf68285c4a61f7';$appId = '2dea4362b36f4b5d9ab19aef5801d72e';$bizId = '1101999999';//查询接口是get请求 所以ai拼接到 url后面$url = 'https://wlc.nppa.gov.cn/test/authentication/query/'.$test_code.'?ai='.$member_id; }//get请求携带ai 所以签名得时候ai也要参与 不然会1011$head = ['ai'=>$member_id,'appId'=>$appId,'bizId'=>$bizId,'timestamps'=>$timestamps];$header[] = 'Content-Type:application/json;charset=utf-8';$header[] = 'appId:'.$appId;$header[] = 'bizId:'.$bizId;$header[] ='timestamps:'.$timestamps;$body['ai'] = $member_id;$body['name'] = $name;$body['idNum'] = $card;$header[]= 'sign:'.getSign('',[],$secret_key,$head);//请求查询接口$res = reqCurl($url,3,'get',[],$header);$res = json_decode($res,true);return $res ;
}/* * 查询身份接口* $member_id 平台用户id,pi 身份接口返回得pi,bt/ct 如文档,$test_code 测试码*/
function queryLoginout($member_id,$pi,$bt=0,$ct=0,$test_code='')
{$secret_key = '';$appId = '';$bizId = '';$timestamps = getMillisecond();$time = time();$url = 'http://api2.wlc.nppa.gov.cn/behavior/collection/loginout';if($test_code) {$secret_key = 'a84b4e7eaa4854cc7faf68285c4a61f7';$appId = '2dea4362b36f4b5d9ab19aef5801d72e';$bizId = '1101999999';$url = 'https://wlc.nppa.gov.cn/test/collection/loginout/'.$test_code;}$head = ['appId'=>$appId,'bizId'=>$bizId,'timestamps'=>$timestamps];$header[] = 'Content-Type:application/json;charset=utf-8';$header[] = 'appId:'.$appId;$header[] = 'bizId:'.$bizId;$header[] ='timestamps:'.$timestamps;//这里值得注意 没有collections 也会1011$body['collections'][] = ['no'=>1,'si'=>$member_id,'bt'=>$bt,'ot'=>$time,'ct'=>$ct,'pi'=>$pi];$data['data'] = bodyEncrypt($body,$secret_key);$header[]= 'sign:'.getSign($data,[],$secret_key,$head);//请求查询接口$res = reqCurl($url,3,'post',$data,$header);$res = json_decode($res,true);return $res;
}//返回当前的毫秒时间戳
function getMillisecond()
{ list($t1, $t2) = explode(' ', microtime()); return (float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000);
} /*** 对请求报文体进行加密* @param $body* @return string*/
function bodyEncrypt($body,$secret_key)
{$key = hex2bin($secret_key);$cipher = "aes-128-gcm";$ivlen = openssl_cipher_iv_length($cipher);$iv = openssl_random_pseudo_bytes($ivlen);$encrypt = openssl_encrypt(json_encode($body), $cipher, $key, OPENSSL_RAW_DATA,$iv,$tag);return base64_encode(($iv.$encrypt.$tag));
}/*** 接口签名* @param $body* @param $query_params*/
function getSign($body_data='',$query_params,$secret_key,$header){if(!empty($body_data)) {$encrypted_body = json_encode($body_data);} else {$encrypted_body = '';}$sys_params = $header;$final_params = array_merge($sys_params, $query_params);ksort($final_params);$str_params = '';foreach ($final_params as $k => $v) {$str_params .= $k.$v;}$str_params .= $encrypted_body;$str_params = $secret_key.$str_params;$hash = hash('sha256', $str_params);return $hash;}//自定义curl
function reqCurl($url,$timeout = 3,$method="get",$body = [],$header=['Content-Type: application/json;charset=utf-8']){ $ret = "";$ch = curl_init($url);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_HTTPHEADER, $header);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);// https请求 不验证证书和hostscurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 从证书中检查SSL加密算法是否存在(默认不需要验证)curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);if($method == "post"){curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));}$buffer = curl_exec($ch); curl_close($ch); if ($buffer === false || empty($buffer)) {$ret = "";} else {$ret = $buffer;}return $ret;
}
3、一些坑的注意
在 测试接口 下面还有一个文档 用于测试 这些测试接口得,不要想直接正式测 ,必须测试全部通过 才能正式使用 不然正式得回报1008
如果报错 1011 大概率是你的sign错误 或者你参数问题影响你得签名 我就犯了一个错误,用加密函数生成 请求体 然后在sign签名得时候再次调用加密函数 最后报错1011
如数据上报接口没有加上collections参数
查询接口没有携带业务参数ai
header格式不正确
明文信息需要加上"collections"参数,格式如:{"collections":[{"no":XXX,"si":"XXX",等等等}]} 请根据文档
其他像 1004 1005 文档上有原因 主要是1011 与1008 这两个错误比较难理解 还有一个1001 这个应该是参数不符合规则
值得注意 报文data的加密 注意php版本 这里使用的是7.3,同时加密需要有openssl扩展
还有就是测试接口得时候 要按照他文档参数传参 (每个接口对应的参数是不同的 是根据参数判断是测试什么接口) 并且要注意他得接口测试的目的是什么 比如认证失败 结果要失败才能通过
PHP 网络游戏防沉迷接口 代码与坑相关推荐
- 新版网络游戏防沉迷实名认证系统接口_php版本demo_新版防沉迷实名认证
新版网络游戏防沉迷实名认证系统接口_php版本demo_新版防沉迷实名认证 <?php function aes_128_gcm($data, $key) { $key = he ...
- PHP对接网络游戏防沉迷实名认证系统
PHP对接网络游戏防沉迷实名认证系统 本次开发是自己结合他人的经验开发,但是源文章找不到了,所以自己写了一篇,直接上代码 <?phpnamespace Handlers;class Networ ...
- 网络游戏防沉迷实名认证系统- 常见问题02
网络游戏防沉迷实名认证系统- 常见问题01 51. H5 小游戏或者单机也需要接入该系统吗? 答:所有获得版号且在运营网络游戏都需要接入网络游戏防沉迷实名 认证系统,小游戏平台也可以代为接入. 52. ...
- 网络游戏防沉迷实名认证系统常见错误说明
1.{"errcode":1008,"errmsg":"SYS REQ PARTNER ERROR"} 这是你网络游戏防沉迷实名认证系统还没 ...
- 个推青少年网络游戏防沉迷解决方案,助力开发者构建完善的青少年保护系统!
8月30日,国家新闻出版署下发<关于进一步严格管理 切实防止未成年人沉迷网络游戏的通知>.通知要求,严格限制向未成年人提供网络游戏服务的时间,所有网络游戏企业仅可在周五.周六.周日和法定节 ...
- 个推依托图像识别和实人认证服务,推出青少年网络游戏防沉迷解决方案
8月30日,国家新闻出版署下发<关于进一步严格管理 切实防止未成年人沉迷网络游戏的通知>.通知要求,严格限制向未成年人提供网络游戏服务的时间,所有网络游戏企业仅可在周五.周六.周日和法定节 ...
- PHP调用wsdl文件类型的接口代码分享
本文给大家分享了一个PHP调用wsdl文件类型的接口代码,非常的简单也很实用,有相关需求的小伙伴们可以直接拿去用的. 复制代码 代码如下: <?php // 本类由系统自动生成,仅供测试用途 c ...
- gin context和官方context_Go Web 小技巧(一)简化Gin接口代码
不知道大家在使用 Gin 构建 API 服务时有没有这样的问题: 参数绑定的环节可不可以自动处理? 错误可不可以直接返回,不想写空 return, 漏写就是 bug 本文通过简单地封装,利用 go 的 ...
- PHP_TP5框架开发后端接口(代码编写思路)
这半个月断断续续在学习用PHP的ThinkPHP框架开发后端API.现在总结记录一下开发一个接口需要做好哪些事,以此提高开发效率,并且也有不错的扩展性. 一.流程概要 基本是这么一个流程,略过环境搭建 ...
最新文章
- spark知识点八万字长文最全汇总和高频面试题目
- error2---BeginPath和EndPath之间的TextOut无法显示
- java字符编码方式总结
- 注解版poi操作工具
- SpringMVC请求中的普通、POJO、数组集合类型传参与类转换器
- 世界五百强面试题目及应答评点
- python Asyncore.dispatcher 理解
- matmul torch 详解_Pytorch | 详解Pytorch科学计算包——Tensor
- python3 发送qq邮件带图片
- 设置网页宽高的比例为16:9
- IMTOKEN 2.9.9官网1:1双端,用户管理系统,后台可查询用户使用情况
- 一篇优秀的硕士毕业论文是怎么写成的
- hdu 5418 Victor and World (floyd+状压dp)
- Bootstrap 字体图标和自定义矢量图标
- Anaconda安装说明
- linux服务器重启日志,Linux系统最近重启时间、错误日志
- 全网最全JavaScript正则表达式( 校验数字和字母)
- python3正则表达式替换_在Python 3中加速数百万的正则表达式替换
- 2022年乡村医生考试复习题及答案
- 实现手机归属地查询页面