Flask_懒人精灵_对接易如意网络验证示例

[复制链接]
查看5551 | 回复12 | 2022-4-15 20:42:18 | 显示全部楼层 |阅读模式
本帖最后由 Aitlo 于 2022-4-20 18:43 编辑

首先:自行创建易如意网络验证站点:

1,登录易如意后台

1.1,选择应用管理-添加应用-后点击修改设置

1.png

1.2修改登录控制-选择卡密登录-设置安全控制(不加密,不签名)

2.png

1.3,设置应用控制-收费模式-点击确认是我操作-点击确认修改

3.png

2,服务器安装Python flask 和 requests (推荐Python 3.6以上版本)


2.1, pip install flask

2.2, pip install requests

flask_server.py 源码:
  1. import json
  2. import os
  3. import requests
  4. import time
  5. import uuid
  6. import hashlib
  7. from flask import Flask, request, make_response,send_from_directory,jsonify

  8. app = Flask(__name__)#ascii
  9. app.config['JSON_AS_ASCII'] = False
  10. privateKey = 'aitlo@cy..' //加密检验私钥
  11. publicKey = 'www.iaitlo.com' // 加密校验公钥

  12. Total_dict = {}

  13. @app.route('/login',methods=['POST'])
  14. def login():
  15.     # 卡密登录验证
  16.     lrjl_dict = request.form.to_dict()
  17.     # 0,如果卡密已存在则先验证卡密和uuid
  18.     if lrjl_dict['kami'] in Total_dict and lrjl_dict['uuid'] != Total_dict[lrjl_dict['kami']]['uuid']:
  19.         return jsonify({'code':500,'msg':'卡密设备uudi不一致'})

  20.     if lrjl_dict['kami'] in Total_dict and lrjl_dict['uuid'] == Total_dict[lrjl_dict['kami']]['uuid']:
  21.         return heartbeat()
  22.     # 1,先验证签名
  23.     #   - 验证成功 执行后面,不成功返回签名错误
  24.     if request.method == 'POST':
  25.         sign = f'{lrjl_dict["signTime"]}-{hashlib.md5(privateKey.encode("utf-8")).hexdigest()}-{hashlib.md5(publicKey.encode("utf-8")).hexdigest()}'.upper()
  26.         server_sign = hashlib.md5(sign.encode('utf-8')).hexdigest()
  27.         if lrjl_dict['sign'] != server_sign:
  28.             return jsonify({'code':106,'mgs':'签名错误'})
  29.         yry_params = {'kami':lrjl_dict['kami'],'t':time.time(),'app':lrjl_dict['app']}
  30.    
  31.         respones = requests.post('http://192.0.0.1/api.php?act=km_logon',params=yry_params)
  32.         line_dict = respones.json()
  33.         # print(line_dict,'易如意返回数据')
  34.         if line_dict['msg'] == "卡密已使用" or line_dict['msg'] == "卡密已到期" or line_dict['msg'] == "卡密不存在":
  35.             return jsonify(line_dict)
  36.         elif line_dict['msg']['kami'] == lrjl_dict['kami']:
  37.             # 登录验证通过
  38.             if not lrjl_dict['kami'] in Total_dict:
  39.                 uuidStr = uuid.uuid4()
  40.                 Total_dict[lrjl_dict['kami']] = {'uuid':str(uuidStr),'vip':line_dict['msg']['vip']}
  41.                 return jsonify({'kami':lrjl_dict['kami'],'uuid':str(uuidStr),'vip':line_dict['msg']['vip']})
  42.     if lrjl_dict['msg'] == '卡密已使用':
  43.         return jsonify({'code': 500, 'msg': '卡密已使用'})
  44.     return jsonify({'code':500,'msg':'未知错误请联系管理员'})

  45. @app.route('/unpinless',methods=['POST'])
  46. def unpinless():
  47.     # 解绑设备
  48.     lrjl_dict = request.form.to_dict()

  49.     if lrjl_dict['kami'] in Total_dict and lrjl_dict['uuid'] == Total_dict[lrjl_dict['kami']]['uuid']:
  50.         del Total_dict[lrjl_dict['kami']]
  51.         return jsonify({'code':200,'msg':'已解绑设备','kami':lrjl_dict['kami']})
  52.     else:
  53.         return jsonify({'code':500,'msg':f'{lrjl_dict["kami"]}该卡密未绑定此设备,解绑失败!'})

  54. @app.route('/paycode',methods=['POST'])
  55. def payCode():
  56.     # 卡密充值
  57.     lrjl_dict = request.form.to_dict()
  58.     res = requests.post(url='http://192.0.0.1/api.php?act=card',params=lrjl_dict)
  59.     respones = res.json()
  60.     return jsonify(respones)
  61. @app.route('/heartbeat',methods=['GET','POST'])
  62. def heartbeat():

  63.     lrjl_verification_by = request.form.to_dict()

  64.     if lrjl_verification_by['kami'] in Total_dict:
  65.         vip_time = Total_dict[lrjl_verification_by['kami']]['vip']

  66.         if int(vip_time) > int(time.time()):
  67.             return jsonify({'code':200,'msg':'心跳验证'})
  68.     else:
  69.         return jsonify({'code':400,'msg':'心跳验证失败!'})
  70. if __name__ == '__main__':
  71.     # 自行修改上方 'http://192.0.0.1 为易如意站点域名 或者服务器ip

  72.     app.run(host='0.0.0.0',port='5000',debug=True)
复制代码


3, 自行修改.py的 http://192.0.0.1 为易如意开发文档-卡密登录-URL地址,需修改的是logoin函数和payCode函数里面的代码

4.png
4, flask_server.py可放在网站根目录: / 或者站点目录下
5.进入服务器运行窗口启动 flask_server.py 文件
5.png
6,易如意网络验证.lua 文件源码:
  1. RunUIState = true
  2. HeartbeatSecond = 3000
  3. Time = systemTime()
  4. KaMiLong = 16
  5. privateKey = '9a391cacc7a22bb9c93ae89619a94823' -- 服务器flask_server.py文件 私钥 MD5转码后的值
  6. publicKey = '2be10ab07b455b41220e11231279ca47'  -- 服务器 公钥 MD5转码后的值 可自行修改

  7. function getFileJsonData()
  8.     -- 获取注册后服务器保存客户端json文件数据
  9.     local baespaht = getSdPath().."/com.lrjl.game"
  10.     local lrjljsonpath = getSdPath().."/com.lrjl.game/verification.json"
  11.     if fileExist(lrjljsonpath) then
  12.         local ret = readFile(lrjljsonpath)
  13.         return jsonLib.decode(ret)
  14.     else
  15.         if fileExist(baespaht) == false then
  16.             mkdir(baespaht)
  17.         end
  18.         
  19.     end
  20. end

  21. function MkFile()
  22.     -- 创建一个json文件保存服务器返回数据
  23.    
  24.    
  25. end

  26. function heartbeat(jsonData)
  27.     -- 心跳验证
  28.     local getJsonData = getFileJsonData()
  29.     print(getJsonData)
  30.     local loginUrl = 'http://192.168.0.104:5000/heartbeat'
  31.     local uuid = getJsonData['uuid']
  32.     local vip = getJsonData['vip']
  33.     local kami = getJsonData['kami']
  34.     local sign = getMD5Sign(Time,privateKey,publicKey)
  35.    
  36.     while UnpinlessState do
  37.         
  38.         local respones = httpPost(loginUrl,string.format("kami=%s&t=%s&signTime=%s&sign=%s&uuid=%s&vip=%s",kami,os.time(),sign['signTime'],sign['sign'],uuid,vip))
  39.         print(respones)
  40.         if respones.msg == '心跳验证失败!'then
  41.             print(respones.msg)
  42.             toast(respones.msg,0,0,20)
  43.             UnpinlessState = false
  44.         end
  45.         if respones.msg ~= '心跳验证' then
  46.             ui.newLayout("layout100")
  47.             ui.show("layout100")
  48.             ui.setTitleText("layout100","卡密已到期请充值")
  49.             sleep(1000*3600)
  50.             exitScript()
  51.         end
  52.         sleep(HeartbeatSecond)
  53.     end
  54.      
  55.    
  56. end



  57. function getMD5Sign(Time,privateKey,publicKey)
  58.     -- 获取数据签名sign 转为md5值
  59.     local sign = string.format("%s-%s-%s",Time,privateKey,publicKey)
  60.    
  61.     return {signTime=Time,sign=MD5(string.upper(sign))}
  62. end

  63. function OnClickPayCode()
  64.     -- 卡密充值
  65.     print('点击卡密充值')
  66.     local getUIData = ui.getData()
  67.     print(getUIData)
  68.     local app = 10000
  69.     local sign = getMD5Sign(Time,privateKey,publicKey)
  70.     local kamiEditId1 = getUIData.kamiEditId1
  71.     if string.len(kamiEditId1)>=KaMiLong then
  72.         ui.setTextView("OnekamiEditId1",kamiEditId1)
  73.         
  74.     end
  75.     local getUIData = ui.getData()
  76.     local OnekamiEditId1 = getUIData.OnekamiEditId1
  77.     local TwokamiEditId2 = getUIData.TwokamiEditId2
  78.     local time = os.time()
  79.     local payCodeUrl = 'http://192.168.0.104:5000/paycode'
  80.     local respones = httpPost(payCodeUrl,string.format("app=%s&mainkm=%s&kami=%s&t=%s&signTime=%s&sign=%s",app,OnekamiEditId1,TwokamiEditId2,time,sign.signTime,sign.sign))
  81.     print(respones)
  82.     respones = jsonLib.decode(respones)
  83.     if respones.msg == '充值成功'then
  84.         local getJsonData = getFileJsonData()
  85.         print(getJsonData)
  86.         getJsonData.vip = respones.time
  87.         print(getJsonData)
  88.         local lrjljsonpath = getSdPath().."/com.lrjl.game/verification.json"
  89.         io.output(lrjljsonpath)
  90.         io.write(jsonLib.encode(getJsonData))
  91.         io.close()
  92.         print(respones.msg)
  93.         toast(respones.msg,0,0,20)
  94.     else
  95.         print(respones.msg)
  96.         toast(respones.msg,0,0,20)
  97.     end
  98.    
  99. end

  100. function OnClickUnpinless()
  101.     -- 解绑设备按钮操作
  102.     local getJsonData = getFileJsonData()
  103.     print(getJsonData)
  104.     if getJsonData ~= nil then
  105.         uuid = getJsonData['uuid']
  106.     end
  107.     local getUIData = ui.getData()
  108.     local sign = getMD5Sign(Time,privateKey,publicKey)
  109.     local loginUrl = 'http://192.168.0.104:5000/unpinless'
  110.     local lrjljsonpath = getSdPath().."/com.lrjl.game/verification.json"
  111.     local respones = httpPost(loginUrl,string.format("kami=%s&t=%s&signTime=%s&sign=%s&uuid=%s",getUIData['kamiEditId1'],os.time(),sign['signTime'],sign['sign'],uuid))
  112.     print(respones)
  113.     respones = jsonLib.decode(respones)
  114.     if respones.code == 200 then
  115.         print(respones.msg)
  116.         toast(respones.msg,0,0,20)
  117.         if fileExist(lrjljsonpath) then
  118.             delfile(lrjljsonpath)
  119.             print('文件已删除!')
  120.             ui.setTextView("kamiTextId2","卡密到期时间:")
  121.             ui.setVisiblity("kamiTextId2",2)
  122.             UnpinlessState = false
  123.         end
  124.     elseif respones.code == 500 then
  125.         print(respones.msg)
  126.         toast(respones.msg,0,0,20)
  127.     end
  128.    
  129. end

  130. function OnClickKaMiLogin()
  131.     -- 卡密登录按钮操作
  132.     -- flask 登录验证url
  133.     UnpinlessState = true
  134.     local uuid = ''
  135.     local getJsonData = getFileJsonData()
  136.     print(getJsonData)
  137.     if getJsonData ~= nil then
  138.         uuid = getJsonData['uuid']
  139.     end
  140.     local loginUrl = 'http://192.168.0.104:5000/login'
  141.     -- 易如意创建应用ID
  142.     local app = 10000
  143.     -- 获取UI数据
  144.     local getUIData = ui.getData()
  145.     -- 获取sign签名
  146.     local sign = getMD5Sign(Time,privateKey,publicKey)
  147.    
  148.     local respones = httpPost(loginUrl,string.format("kami=%s&t=%s&signTime=%s&sign=%s&uuid=%s&app=%s",getUIData['kamiEditId1'],os.time(),sign['signTime'],sign['sign'],uuid,app))
  149.     print(respones)
  150.     respones = jsonLib.decode(respones)
  151.     print('登录验证返回数据:',respones)
  152.    
  153.     if respones.kami == getUIData['kamiEditId1'] and string.len(respones.vip) > 9 then
  154.         local lrjljsonpath = getSdPath().."/com.lrjl.game/verification.json"
  155.         io.output(lrjljsonpath)
  156.         io.write(jsonLib.encode(respones))
  157.         io.close()
  158.         print('登录成功,数据保存完毕')
  159.         toast("登录成功,启动设置页面!",0,0,20)
  160.         sleep(2000)
  161.         beginThread(heartbeat)
  162.         
  163.     elseif respones.msg == '心跳验证'then
  164.         print('登录成功,启动心跳验证')
  165.         toast("登录成功",0,0,20)
  166.         beginThread(heartbeat)
  167.     else
  168.         print('卡密设备信息不一致,登录失败!')
  169.         toast("卡密设备信息不一致,登录失败!",0,0,20)
  170.         sleep(2000)
  171.         toast("请充值或联系管理员!",0,0,20)
  172.     end
  173.     getJsonData = getFileJsonData()
  174.    
  175.     local timeView = os.date("%Y-%m-%d %H:%M:%S",getJsonData.vip)
  176.     ui.setTextView("kamiTextId2",string.format("卡密到期时间:%s",timeView))
  177.     ui.setVisiblity("kamiTextId2",1)
  178. end


  179. function clearTextData()
  180.     -- 清空输入框文字
  181.     ui.setEditText("kamiEditId1","",500,-2)
  182.     ui.setEditText("OnekamiEditId1","",500,-2)
  183.     ui.setEditText("TwokamiEditId2","",500,-2)
  184.    
  185. end

  186. function clearTextData_1()
  187.     -- 清空输入框文字
  188.     ui.setEditText("OnekamiEditId1","",500,-2)
  189.    
  190.    
  191. end

  192. function clearTextData_2()
  193.     -- 清空输入框文字
  194.     ui.setEditText("TwokamiEditId2","",500,-2)
  195.    
  196. end


  197. function RunUI()
  198.    
  199.     -- 启动UI界面
  200.     ui.newLayout("layout1",-1,720)
  201.     ui.setTitleText("layout1","易如意网络验证系统")
  202.     ui.addTabView("layout1","tabviewId1")
  203.     ui.addTab ("tabviewId1", "lab1", "卡密登录")
  204.     ui.addTab ("tabviewId1", "lab2", "卡密充值")
  205.     ui.addTextView("lab1","kamiTextId1","卡密:")
  206.     ui.addEditText("lab1","kamiEditId1","请输入卡密",500,-2)
  207.    
  208.     ui.addButton("lab1","kamiLoginbtnnId1","登录")
  209.     ui.setOnClick("kamiLoginbtnnId1","OnClickKaMiLogin()")
  210.     ui.setOnClick("kamiEditId1","clearTextData()")
  211.    
  212.     ui.newRow("lab1","row1")
  213.     ui.addButton("lab1","UnpinlessbtnnId1","解绑设备")
  214.     ui.setOnClick("UnpinlessbtnnId1","OnClickUnpinless()")
  215.     ui.addTextView("layout1","kamiTextId2","卡密到期时间:")
  216.     ui.setVisiblity("kamiTextId2",2)
  217.    
  218.     ui.addTextView("lab2","OnekamiTextId1","主卡密")
  219.     ui.addEditText("lab2","OnekamiEditId1","请输入主卡密",500,-2)
  220.     ui.newRow("lab2","row2")
  221.     ui.addTextView("lab2","OnekamiTextId2","新卡密")
  222.     ui.addEditText("lab2","TwokamiEditId2","请输入新卡密",500,-2)
  223.    
  224.     ui.addButton("lab2","PayCodebtnnId1","点击充值")
  225.     ui.setOnClick("PayCodebtnnId1","OnClickPayCode()")
  226.     ui.setOnClick("OnekamiEditId1","clearTextData_1()")
  227.     ui.setOnClick("TwokamiEditId2","clearTextData_2()")
  228.    
  229.    
  230.     ui.show("layout1")
  231.     while RunUIState do
  232.         sleep(1000)
  233.     end
  234.    
  235. end


  236. -- 以上源码是动态UI封装代码,根据需要自行修改.
  237. -- 以上 http://192.168.0.104:5000 该域名端口修改为自己服务器的ip:端口
复制代码


6.1, 修改易如意网络验证.lua文件访问的url地址 http://192.168.0.104:5000改为自己服务器的即可


7,在易如意后台创建卡密-添加卡密

QQ截图20220415201333.png

7.1, 设置生成卡密对应信息

7.png

运行结果:

5.jpg 4.jpg 3.jpg 2.jpg 1.jpg



回复

使用道具 举报

ca0111 | 2022-4-15 21:02:51 | 显示全部楼层
兔老板厉害
回复

使用道具 举报

lyxqge | 2022-4-16 00:35:57 | 显示全部楼层
老板厉害!
回复

使用道具 举报

gaokun | 2022-4-16 14:26:30 | 显示全部楼层
老板厉害!
回复

使用道具 举报

kimeti | 2022-4-17 23:23:48 | 显示全部楼层
这几天刚好我也搞了一个网络完整  不过另外的  用get和post
回复

使用道具 举报

Aitlo | 2022-4-18 21:24:18 | 显示全部楼层
kimeti 发表于 2022-4-17 23:23
这几天刚好我也搞了一个网络完整  不过另外的  用get和post

可以的
回复

使用道具 举报

1105455693 | 2022-4-20 14:15:08 | 显示全部楼层
可以的qqqqqqqqqqqqq
回复

使用道具 举报

wangqunmen | 2022-4-28 20:11:01 | 显示全部楼层
谢谢大佬分享 !
回复

使用道具 举报

718204413 | 2022-5-8 14:12:11 | 显示全部楼层

谢谢大佬分享 !
回复

使用道具 举报

718204413 | 2022-5-8 14:26:08 | 显示全部楼层


谢谢大佬分享 !
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则