【国家防沉迷实名认证系统–NODEJS】

首先是插件引入和常量定义

const https = require('https');
const querystring = require("querystring");
const crypto = require('crypto');let host = 'api.wlc.nppa.gov.cn';
let host2 = 'api2.wlc.nppa.gov.cn';
let path = '/idcard/authentication/check';
let queryPath = "/idcard/authentication/query";
let loginoutPath = "/behavior/collection/loginout";
let method = 'POST';
let secretKey = '';// TODO: 填写自己申请的认证数据
let appId = '';    // TODO: 填写自己申请的认证数据
let bizId = '';     // TODO: 填写自己申请的认证数据
let signPreStr = secretKey + 'appId' + appId + 'bizId' + bizId + 'timestamps';

然后上代码:

/*** 请求身份认证* @param {String}   ai  可使用用户账号id* @param {String}   identity  身份证号* @param {String}   name  真实名字* @param {Function} cb  回调*/
Authentication.prototype.getIdentityResult = function (ai, identity, name, cb) {let idJson = {'ai': ai,'name': name,'idNum': identity};let postData = JSON.stringify(idJson);let encr = encrypt(postData);let encrData = JSON.stringify({'data': encr});let timestamps = Date.now();let signStr = signPreStr + timestamps + encrData;let sha256 = crypto.createHash('sha256');sha256.update(signStr, 'utf8');let sign = sha256.digest('hex');let identityResult = '';let options = {hostname: host,path: path,method: method,headers: {'Content-Type': 'application/json; charset=utf-8','Content-Length': encrData.length,'appId': appId,'bizId': bizId,'timestamps': timestamps,'sign': sign}};let self = this;let req = https.request(options, (res) => {res.setEncoding('utf-8');if (res.statusCode === 200) {res.on('data', (chunk) => {identityResult += chunk;});res.on('end', () => {logger.info('get identity result : %j, idJson: %j', identityResult, idJson);let result = JSON.parse(identityResult);if (0 === result.errcode) {if (0 === result.data.result.status) {// TODO: 认证成功回调cb && cb(null, idJson);return;} else if (1 === result.data.result.status) {// TODO: 认证超时回调cb();return;}} else if (2004 === result.errcode) {// TODO: 认证超时回调cb();return;}// TODO: 认证失败回调cb();});} else {// TODO: 网页请求失败回调cb();}});// 将数据写入请求主体。req.write(encrData);req.on('error', (e) => {// TODO: 网页请求出错回调cb();});req.end();
};let encrypt = function (postData) {try {let key = Buffer.from(secretKey, 'hex');let iv = crypto.randomBytes(12);let cipher = crypto.createCipheriv('aes-128-gcm', key, iv);let encr = cipher.update(postData, 'utf8', 'base64');encr += cipher.final('base64');//cipher.getAuthTag() 方法返回一个 Buffer,它包含已从给定数据计算后的认证标签。//cipher.getAuthTag() 方法只能在使用 cipher.final() 之后调用 这里返回的是一个十六进制后的数组let tags = cipher.getAuthTag();encr = Buffer.from(encr, 'base64');//由于和java对应的AES/GCM/PKCS5Padding模式对应 所以采用这个拼接let totalLength = iv.length + encr.length + tags.length;let bufferData = Buffer.concat([iv, encr, tags], totalLength);return bufferData.toString('base64');} catch (e) {console.log("Encrypt is error", e);return null;}
};
/*** 查询认证信息* @param {String}   ai  可使用用户账号id* @param {Function} cb  回调*/
Authentication.prototype.queryAuthentication = function (ai, cb) {let getData = querystring.stringify({'ai': ai});let timestamps = Date.now();let signStr = secretKey + 'ai' + ai + 'appId' + appId + 'bizId' + bizId + 'timestamps' + timestamps;let sha256 = crypto.createHash('sha256');sha256.update(signStr, 'utf8');let sign = sha256.digest('hex');let queryResult = '';let options = {hostname: host,path: queryPath + '?' + getData,method: 'GET',headers: {'appId': appId,'bizId': bizId,'timestamps': timestamps,'sign': sign}};let req = https.request(options, (res) => {res.setEncoding('utf-8');if (res.statusCode === 200) {res.on('data', (chunk) => {queryResult += chunk;});res.on('end', () => {logger.info('get identity result : %j, getData: %j', queryResult, getData);let result = JSON.parse(queryResult);if (0 === result.errcode) {if (0 === result.data.result.status) {// TODO: 认证成功回调cb();return;} else if (1 === result.data.result.status) {// TODO: 认证超时回调cb();return;}} else if (2004 === result.errcode) {// TODO: 认证超时回调cb();return;}// TODO: 认证失败回调cb();});} else {// TODO: 网页请求失败回调cb();}});req.on('error', (e) => {// TODO: 网页请求出错回调cb();});req.end();
};
/*** 注册限制   ct  用户行为数据上报类型0:已认证通过用户2:游客用户 di  游客模式设备标识,由游戏运营单位生成,游客用户下必填* @param {String}   si  游戏内部会话标识* @param {Number}   bt  游戏用户行为类型0:下线, 1:上线* @param {Number}   state* @param {String}   pi  已通过实名认证用户的唯一标识,已认证通过用户必填* @param {Function} cb  回调*/
Authentication.prototype.loginout = function (si, bt, state, pi, cb) {let idJson = {"no": 1,"si": si,"bt": bt,"ot": Math.floor(Date.now() / 1000)};if (state === 1) {idJson.ct = 2; // 游客用户idJson.di = pi;} else {idJson.ct = 0; // 已认证用户idJson.pi = pi;}let postData = JSON.stringify({"collections": [idJson]});let encr = encrypt(postData);let encrData = JSON.stringify({'data': encr});let timestamps = Date.now();let signStr = signPreStr + timestamps + encrData;let sha256 = crypto.createHash('sha256');sha256.update(signStr, 'utf8');let sign = sha256.digest('hex');let identityResult = '';let options = {hostname: host2,path: loginoutPath,method: method,headers: {'Content-Type': 'application/json; charset=utf-8','Content-Length': encrData.length,'appId': appId,'bizId': bizId,'timestamps': timestamps,'sign': sign}};let req = http.request(options, (res) => {res.setEncoding('utf-8');if (res.statusCode === 200) {res.on('data', (chunk) => {identityResult += chunk;});res.on('end', () => {logger.info('idJson: %j, loginout result : %j', idJson, identityResult);let result = JSON.parse(identityResult);if (0 === result.errcode) {cb && cb(null, 200);return;}cb && cb("error", 500);});} else {logger.error('Authentication loginout err code : %j, idJson: %j', res.statusCode, idJson);cb && cb("error", 500);}});// 将数据写入请求主体。req.write(encrData);req.on('error', (e) => {logger.error('Authentication loginout 请求遇到问题: %j, idJson: %j', e.message, idJson);cb && cb("error", 500);});req.end();
};

国家防沉迷实名认证系统--NODEJS相关推荐

  1. 中宣部防沉迷实名认证系统对接实例-JAVA版

    代码转自沟通群里,群号:960656498 ,有需求可以进去沟通一下 ,亲测都能用 ,线上使用时需要修改httpclient, 改成httpClient连接池 import static java.n ...

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

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

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

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

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

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

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

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

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

    1.SYS REQ PARTNER AUTH ERROR 官方错误信息: 状态码 1011 状态描述 SYS REQ PARTNER AUTH ERROR 接口请求方身份核验错误 这个错误常见原因:应 ...

  7. go实现网络游戏防沉迷实名认证系统AES-128/GCM加密

    加密示例 //访问密钥 secretKey:2836e95fcd10e04b0069bb1ee659955b //待加密数据 {"ai":"test-accountId& ...

  8. 用Node.JS和Think.JS实现的中宣部防沉迷实名认证系统

    开发接口文档巨坑. 很多坑是明显的错误. 现在实现了这个代码,贴在下面.有兴趣的自己下载去试试. const Base = require('./base.js'); const crypto = r ...

  9. 工厂如何实现无线wifi短信验证登录?工厂上网实名认证系统

    工厂如何实现无线wifi短信验证登录?工厂上网实名认证系统 工厂提供公共的无线wifi上网服务,需对用户进行实名认证.手机短信实名认证以其用户体验.综合成本等优势,成为工厂无线上网认证的首选方案. 一 ...

最新文章

  1. python使用缩进来体现代码之间的逻辑关系-python使用缩进来体现代码之间的逻辑关系吗?...
  2. 【数字信号处理】周期序列 ( 周期序列表示方法 | 主值区间表示法 | 模 N 表示法 )
  3. wxWidgets:wxFont概览
  4. Android基础——项目的文件结构(三)
  5. Python学习笔记 -- 列表2: 遍历:嵌套列表, 将其中同位置的元素组成新的列表
  6. IIS 之 未能加载文件或程序集“IBM.Data.DB2”或它的某一个依赖项。试图加载格式不正确的程序。...
  7. Mac brew报错Error: The following directories are not writable by your user: /usr/local/share/man/man5
  8. 杭电1229 还是A+B
  9. 同问 集成网卡和独立网卡哪个好?
  10. 网络期刊(个人使用)
  11. 我的C盘满了 如何清理一下
  12. Windows和Linux简单命令的总结
  13. mac终端命令(苹果终端命令)
  14. 论文写作-如何提高英语论文写作水平
  15. 云游戏学习与实践(一)——云游戏概述
  16. 联想私有云盘成功中标布丁酒店浙江股份有限公司云盘项目
  17. 访问www首页不跳转三级域名的三种方式 (struts welcome-file-list index.action问题)
  18. 华为p20何时升级到鸿蒙,华为P20什么时候发布?华为P20有哪些升级?
  19. 简单的Web日志分析
  20. boa cgi + web页实现文件的上传

热门文章

  1. 用户体验管理 - Managing user experience
  2. HTML制作彩带,用彩带制作漂亮心形风铃方法教程
  3. PMP 考点 第九章 项目资源管理
  4. 机器人上单神装_上单蒸汽机器人出装|蒸汽机器人怎么出装,看完你就知道了...
  5. 点击button按钮打开新的标签页
  6. 广告创意文案写作,平面广告文案写作,AI智能写作-写作机器人平台
  7. 亚马逊 根据差评怎么找到订单客户?
  8. Android.bp学习
  9. 众昂矿业:新能源或成萤石最大应用领域
  10. 老人机轮询紧急拨号功能