p2p开户银行审核模块功能实现

news2024/12/25 9:00:54

审核模块简介

用户提交开户申请后要等待审核通过才能审核成功
审核需要银行系统进行开户 使用flask框架搭建一个银行系统
用户提交审核 银行进行开户,在返回p2p后台通过审核

flask搭建测试银行系统

利用工厂模式搭建一个flask框架
在这里插入图片描述
app.py

from flask import Flask

def current_app():
    app = Flask(__name__)
    return app
app = current_app()

main.py

from app import app
from flask_cors import CORS
from comm.config import Config
from views.user import user_blue

#日志模块
import logging
from logging import FileHandler

app.config.from_object(Config)
CORS(app)

app.register_blueprint(user_blue)

if __name__=="__main__":
    handler = logging.FileHandler("logs/"+'log.txt')
    app.logger.addHandler(handler)
    app.run()

要创建一个新的mysql和表

# 用户表
create table user(
    id int primary key auto_increment,
    username varchar(50),
    password varchar(50),
    name varchar(50)
);
# 银行表 
create table bank(
    id int primary key auto_increment,
    card_number varchar(18),   # 身份证
    bank_code varchar(50),  # 银行卡
    name varchar(50),   # 用户名称
    user_id int 
  );
 
# 充值表
create table recharge(
    id int primary key auto_increment,
    user_id int,
    money decimal(10,2) default(0)    
);  

在views文件夹里创建py文件进行编写
将传递过来的名字 id等信息生成token返回
加一个装饰器 每次请求前验证token 如果不符合则报401
注意:两个装饰器的情况下会报错 需要导入 functools 命名装饰器解决
将传递的用户信息存入银行客户表中

from flask import Blueprint, jsonify
from flask_restful import reqparse
from db import db
import datetime, jwt
import time
import uuid
from flask import current_app as app, request
from utils.JwtTools import jwttool

user_blue = Blueprint('user', __name__)


import functools
# 加入授权
def istoken(func):
    functools.wraps(func)
    def weiend(*args, **kwargs):
        req = reqparse.RequestParser()
        req.add_argument("token")
        arse = req.parse_args()
        # 验证码token
        payload = jwttool.valid(arse["token"])
        if not payload:
            return jsonify({"code": 401})
        return func(*args, **kwargs)
    return weiend

# 生成token
@user_blue.route("/token")
def token_user():
    req = reqparse.RequestParser()
    req.add_argument("name")
    req.add_argument("userid")
    req.add_argument("appname")
    arse = req.parse_args()

    # 加入用户
    username = uuid.uuid4().hex
    password = uuid.uuid4().hex
    sql = "insert into user(username, password, name) values ('%s','%s','%s')" %(username, password, arse["appname"])
    db.update(sql)
    db.commit()

    # 生成token
    names=str(arse["name"])
    userid=str(arse["userid"])
    payload = {'name': names, 'userid': userid, 'exp': time.time() + 1296000}
    token = jwt.encode(payload, '1', algorithm='HS256')
    return jsonify({'code': 200, 'token': token})

# 给用户进行开户
@user_blue.route("/apply")
@istoken
def open_user():
    req = reqparse.RequestParser()
    req.add_argument("card_number")
    req.add_argument("bank_code")
    req.add_argument("name")
    arse = req.parse_args()

    # 加入银行管理平台数据库
    sql = "insert into bank(card_number, bank_code, name) values('%s','%s','%s')" %(arse['card_number'],arse['bank_code'],arse['name'])
    db.update(sql)
    db.commit()
    return jsonify({'code': 200})

# 进行去钱
@user_blue.route('/recharge')
def recharge():
    req = reqparse.RequestParser()
    req.add_argument("user_id")
    req.add_argument("money")
    arse = req.parse_args()

    print(arse)
    sql = f"insert into recharge(user_id, money) values ({arse['user_id']},{arse['money']})"
    db.update(sql)
    db.commit()

    return jsonify({'code': 200})

审核接口

在创建好的utils文件夹中创建test.go文件进行配置
由于银行系统是自己做出来进行测试的 审核自动进行
用户提交开户申请 系统每隔一段时间自动进行审核
发布开户信息到银行存管平台
调用flask银行后台接口,先获取生成的token
然后进行开户申请,审核通过

package utils
import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"myproject/model"
	"net/http"
	"net/url"
	"time"
)
// 发布开户信息到银行存管平台
func TestOpen() {
	//一直在执行的任务
	//从redis中读取任务
	//查询信息
	//调用银行存管平台接口
	r := RedisPool
	for {
		//获取长度,判断队列中是否有信息
		len := r.ListLen("openuser")
		if len > 0 {
			//从队列中取一个信息l.ListRange(key,start,end)
			openId := r.ListPop("openuser")
			// 获取数据库中的数据
			open_info := &model.OpenBank{}
			model.GetDb().Find(open_info, "id=?", openId)
			// 定义切片
			data := make(map[string]interface{})
			data["name"] = open_info.Name
			data["userid"] = open_info.Userid

			// 获取token
			token := openToekn(data)

			// 申请开户
			code := openUser(token, open_info.CardNumber, open_info.BankCode, open_info.Name)
			db := model.GetDb()
			sql := "update open_banks set status=? where id=?"
			if code == 200 {
				// 更新状态
				db.Exec(sql, 1, openId)
				fmt.Println("===已通过审核===")
			} else {
				// 更新状态
				db.Exec(sql, 0, openId)
				fmt.Println("---未通过审核---")
			}
		}
		fmt.Println(time.Now())
		time.Sleep(time.Second * 10)
	}
}
// 获取token
func openToekn(datas map[string]interface{}) string {
	var host = "http://127.0.0.1:5000/token"
	var param = map[string]string{
		"name":    fmt.Sprint(datas["name"]),
		"appname": "p2p",
		"userid":  fmt.Sprint(datas["userid"]),
	}

	uri, err := url.Parse(host)
	if err != nil {
		fmt.Println(err)
	}
	query := uri.Query()
	for k, v := range param {
		query.Set(k, v)
	}
	uri.RawQuery = query.Encode()

	response, err := http.Get(uri.String())
	if err != nil {
		fmt.Println(err)
	}
	result, err := ioutil.ReadAll(response.Body)
	if err != nil {
		fmt.Println(err)
	}
	//fmt.Println(">>", string(result))

	var v interface{}
	_ = json.Unmarshal([]byte(string(result)), &v)
	data := v.(map[string]interface{})

	return data["token"].(string)
}
// 开户申请
func openUser(token, card_number, bank_code, name string) float64 {
	var host = "http://127.0.0.1:5000/apply"
	var param = map[string]string{
		"token":       fmt.Sprint(token),
		"card_number": card_number,
		"bank_code":   bank_code,
		"name":        name,
	}

	uri, err := url.Parse(host)
	if err != nil {
		fmt.Println(err)
	}
	query := uri.Query()
	for k, v := range param {
		query.Set(k, v)
	}
	uri.RawQuery = query.Encode()

	response, err := http.Get(uri.String())
	if err != nil {
		fmt.Println(err)
	}
	result, err := ioutil.ReadAll(response.Body)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(">>", string(result))
	fmt.Printf("type: %T\n", result)

	var v interface{}
	_ = json.Unmarshal([]byte(string(result)), &v)
	data := v.(map[string]interface{})
	fmt.Println(data["code"])
	
	return data["code"].(float64)
}

在main里导入 自动执行

func main() {
	model.InitDB()       //导入model
	utils.ConnectRedis() //导入redis
	go utils.TestOpen()  // 导入开户
	// 1.创建路由
	r := gin.Default()

	r.Use(Cors())      //配置跨域
	route.PathRoute(r) //导入路由
	r.Run(":8000")
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

程序员必看内容连续集之 Redis 03

目录 一、Spring整合Redis 二、注解式开发 一、Spring整合Redis ①项目的pom文件导入依赖并修改 <redis.version>2.9.0</redis.version> <redis.spring.version>1.7.1.RELEASE</redis.spring.version><dependency><groupId>redis.clien…

(附源码)计算机毕业设计SSM抗新冠肺炎药品进销存管理系统

&#xff08;附源码&#xff09;计算机毕业设计SSM抗新冠肺炎药品进销存管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 …

Synchronized锁的使用

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章是关于并发编程中Synchronized锁的用法知识记录&#xff0c;由于篇幅原因&#xff0c;核心原理知识下篇记录。 本篇文章记录的基础知识&#xff0c;适合在学Java的…

进程的基本概念(操作系统)

目录 一、程序的顺序执行及其特征 二、程序的并发执行及其特征 三、进程的特征与状态 1、进程的定义和特征 2、进程的三种基本状态 3、进程的三种基本状态的转换 4、 挂起状态 四、进程控制块&#xff08;PCB&#xff09; 1. PCB作用&#xff1a; PCB是进程存在的唯一…

【力扣】正则表达式匹配--回溯法解剖

题目&#xff1a;10.正则表达式匹配 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符 * 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分字符串。 示…

maven配置阿里镜像,解决IDEA配置maven恢复默认配置问题

文章目录1.三个IDEA配置说明2.拷贝与修改settings.xml2.1 找到IDEA的mave配置文件settings.xml位置2.2 拷贝IDEA的settings.xml到.m2目录下2.3 打开settings.xml&#xff0c;配置本地库LocalRepository的路径2.4 删除默认镜像配置&#xff0c;配置阿里镜像2.5 保存文件3.验证是…

面试时,MySQL这些基础知识你回答的出来吗?

目录 【一】前言 【二】MySQL的并发控制 【三】数据库的事务 【四】隔离级别 【五】死锁 【六】存储引擎 6.1 InnoDB存储引擎 6.2 MyISAM存储引擎 【七】总结 【一】前言 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff0c;属于Oracle…

一文就读懂RPC远程调用核心原理

rpc核心原理 什么是rpc&#xff1f; rpc的全称是Remote Procedure Call&#xff0c;即远程过程调用&#xff0c;是分布式系统的常用通信方法。 Remote&#xff0c;简单来说的话就是两个不同的服务之间&#xff0c;两个服务肯定是两个不同的进程。因此&#xff0c;我们就从跨进…

【微服务】微服务万字实战,带你了解工程原理

微服务实战1、前期准备1.1 技术选型1.2 模块设计1.3 微服务调用2、创建父工程3、创建基础模块3.1 导入依赖3.2 创建实体类4、创建用户微服务4.1 创建shop-user模块4.2 用户微服务启动类4.3 创建配置文件5、创建商品微服务5.1 创建shop_product模块5.2 商品微服务启动类5.3 创建…

刷题日记【第六篇】-笔试必刷题【最近公共祖先+求最大连续bit数+二进制插入+查找组成一个偶数最接近的两个素数】

目录 选择题模块 1.下面哪个标识符是合法的&#xff1f;&#xff08;D&#xff09; 2.以下描述正确的是&#xff08;B&#xff09; 3.下列程序的运行结果&#xff08;B&#xff09; 4.下列关于容器集合类的说法正确的是&#xff1f;&#xff08;C&#xff09; 5.ArrayList…

【MySQL进阶】深入理解InnoDB记录结构

【MySQL进阶】深入理解InnoDB记录结构 参考资料&#xff1a;《MySQL是怎么运行的&#xff1a;从根儿上理解MySQL》。 前言&#xff1a; 我们一般使用的MySQL关系型数据库&#xff0c;更是经典中的经典&#xff0c;虽说MySQL已经非常成熟&#xff0c;但对于MySQL的掌握程度&a…

腾讯Java888道高频面试真题笔记+Java面试宝典

这多半年你是否达到了你年初定的目标&#xff0c;今年企业招聘要求也是更加的严格&#xff0c;对于低学历,以及技术实力不过关的更是雪上加霜。也是由于种种缘由&#xff0c;从5月开始就一直有粉丝私信要博主整理一些干货来帮助他们提升下自己&#xff0c;为了响应粉丝要求&…

Non-Autoregressive Coarse-to-Fine Video Captioning【论文阅读】

Non-Autoregressive Coarse-to-Fine Video Captioning 发表&#xff1a;AAAI 2021idea&#xff1a;&#xff08;1&#xff09;针对推理阶段不能并行&#xff0c;推理效率低的问题使用一种双向解码&#xff08;在bert中不使用sequence mask&#xff09;。&#xff08;2&#xf…

基于QD求解法的二分类SVM仿真

目录 1.算法概述 2.部分程序 3.算法部分仿真结果图 4.完整程序获取 CSDN用户&#xff1a;我爱C编程 CSDN主页&#xff1a;https://blog.csdn.net/hlayumi1234567?typeblog 擅长技术&#xff1a;智能优化&#xff0c;路径规划&#xff0c;通信信号&#xff0c;图像处理&…

【数据结构与算法分析】0基础带你学数据结构与算法分析06--树(TREE)

目录 前言 树的属性 树的实现 树的遍历与应用 深度有限遍历 (DFS) 广度优先遍历 (BFS) Not all roots are buried down in the ground, some are at the top of a tree. — Jinvirle 前言 Tree 是一些结点的集合&#xff0c;这个集合可以是空集&#xff1b;若不是空集…

【模型训练】YOLOv7行人检测

YOLOv7行人检测 1、YOLOv7算法行人检测模型训练2、YOLOv7模型模型评估3、模型和数据集下载1、本项目采用YOLOv7算法实现对行人的检测和识别,在一万多张行人检测数据集中训练得到,我们训练了YOLOv7模型,经评估我们得出了各个模型的评价指标; 2、目标类别数:1 ;类别名:pers…

笔试强训第15天(手套+ 查找输入整数二进制中1的个数)

选择 C barfoob_bar new B 会先创建一个B类对象&#xff0c;B类对象的构造需要调用B的构造函数&#xff0c;从而调用A的构造函数。A的构造函数中调用了 bar()函数&#xff0c;该函数虽然重写了&#xff0c;但这里不构成多态调用。因为虚表中的函数指针是在构造函数的初始化列表…

爱上源码,重学Spring IoC深入

回答&#xff1a; 我们为什么要学习源码&#xff1f; 1、知其然知其所以然 2、站在巨人的肩膀上&#xff0c;提高自己的编码水平 3、应付面试1.1 Spring源码阅读小技巧 1、类层次藏得太深&#xff0c;不要一个类一个类的去看&#xff0c;遇到方法该进就大胆的进 2、更不要一行…

【3D目标检测】SECOND: Sparsely Embedded Convolutional Detection

目录概述细节网络结构稀疏卷积方向分类损失函数概述 首先&#xff0c;本文是基于点云&#xff0c;并且将点云处理成体素的3D目标检测网络&#xff0c;提出的SECOND可以看做是VoxelNet的升级版。 提出动机与贡献 VoxelNet计算量比较大&#xff0c;速度比较慢&#xff08;训练和…

第二节:数据类型与变量【java】

目录 &#x1f4c3;前言 &#x1f4d7;1.数据类型 &#x1f4d5;2. 变量 2.1 变量概念 2.2 语法格式 &#x1f4d9;3.整型变量 3.1 整型变量 3.2 长整型变量 3.3 短整型变量 3.4 字节型变量 &#x1f4d8;4.浮点型变量 4.1 双精度浮点型 4.2 单精度浮点型 &#…