相信大家最近都被防沉迷 接口整的头疼 也有很多坑 下面介绍下对接沉迷的注意事项与接口代码

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 网络游戏防沉迷接口 代码与坑相关推荐

  1. 新版网络游戏防沉迷实名认证系统接口_php版本demo_新版防沉迷实名认证

    新版网络游戏防沉迷实名认证系统接口_php版本demo_新版防沉迷实名认证 <?php function aes_128_gcm($data, $key) {         $key = he ...

  2. PHP对接网络游戏防沉迷实名认证系统

    PHP对接网络游戏防沉迷实名认证系统 本次开发是自己结合他人的经验开发,但是源文章找不到了,所以自己写了一篇,直接上代码 <?phpnamespace Handlers;class Networ ...

  3. 网络游戏防沉迷实名认证系统- 常见问题02

    网络游戏防沉迷实名认证系统- 常见问题01 51. H5 小游戏或者单机也需要接入该系统吗? 答:所有获得版号且在运营网络游戏都需要接入网络游戏防沉迷实名 认证系统,小游戏平台也可以代为接入. 52. ...

  4. 网络游戏防沉迷实名认证系统常见错误说明

    1.{"errcode":1008,"errmsg":"SYS REQ PARTNER ERROR"} 这是你网络游戏防沉迷实名认证系统还没 ...

  5. 个推青少年网络游戏防沉迷解决方案,助力开发者构建完善的青少年保护系统!

    8月30日,国家新闻出版署下发<关于进一步严格管理 切实防止未成年人沉迷网络游戏的通知>.通知要求,严格限制向未成年人提供网络游戏服务的时间,所有网络游戏企业仅可在周五.周六.周日和法定节 ...

  6. 个推依托图像识别和实人认证服务,推出青少年网络游戏防沉迷解决方案

    8月30日,国家新闻出版署下发<关于进一步严格管理 切实防止未成年人沉迷网络游戏的通知>.通知要求,严格限制向未成年人提供网络游戏服务的时间,所有网络游戏企业仅可在周五.周六.周日和法定节 ...

  7. PHP调用wsdl文件类型的接口代码分享

    本文给大家分享了一个PHP调用wsdl文件类型的接口代码,非常的简单也很实用,有相关需求的小伙伴们可以直接拿去用的. 复制代码 代码如下: <?php // 本类由系统自动生成,仅供测试用途 c ...

  8. gin context和官方context_Go Web 小技巧(一)简化Gin接口代码

    不知道大家在使用 Gin 构建 API 服务时有没有这样的问题: 参数绑定的环节可不可以自动处理? 错误可不可以直接返回,不想写空 return, 漏写就是 bug 本文通过简单地封装,利用 go 的 ...

  9. PHP_TP5框架开发后端接口(代码编写思路)

    这半个月断断续续在学习用PHP的ThinkPHP框架开发后端API.现在总结记录一下开发一个接口需要做好哪些事,以此提高开发效率,并且也有不错的扩展性. 一.流程概要 基本是这么一个流程,略过环境搭建 ...

最新文章

  1. spark知识点八万字长文最全汇总和高频面试题目
  2. error2---BeginPath和EndPath之间的TextOut无法显示
  3. java字符编码方式总结
  4. 注解版poi操作工具
  5. SpringMVC请求中的普通、POJO、数组集合类型传参与类转换器
  6. 世界五百强面试题目及应答评点
  7. python Asyncore.dispatcher 理解
  8. matmul torch 详解_Pytorch | 详解Pytorch科学计算包——Tensor
  9. python3 发送qq邮件带图片
  10. 设置网页宽高的比例为16:9
  11. IMTOKEN 2.9.9官网1:1双端,用户管理系统,后台可查询用户使用情况
  12. 一篇优秀的硕士毕业论文是怎么写成的
  13. hdu 5418 Victor and World (floyd+状压dp)
  14. Bootstrap 字体图标和自定义矢量图标
  15. Anaconda安装说明
  16. linux服务器重启日志,Linux系统最近重启时间、错误日志
  17. 全网最全JavaScript正则表达式( 校验数字和字母)
  18. python3正则表达式替换_在Python 3中加速数百万的正则表达式替换
  19. 2022年乡村医生考试复习题及答案
  20. 实现手机归属地查询页面

热门文章

  1. 基于 openEuler 22.09 版本构建的 NestOS 全新发布
  2. 方向分布(标准差椭圆)
  3. 白话空间统计之九:方向分布(标准差椭圆)修正版
  4. 48个国际音标发音表
  5. Python os.getenv
  6. 上班工资太低了,哪些副业可以多赚钱?
  7. 《C#高级编程》读书笔记(十四):代码协定
  8. task06 PyTorch生态
  9. 0326 预习直播笔记
  10. C++中文车牌识别检测系统源码