p2p银行充值功能模块 支付宝调用

银行充值简介

用户要想要投标的话,那么需要往p2p平台上进行充值
使用支付宝沙箱 调用支付宝充值接口进行测试
用户余额页面展示用户的余额 点击充值调用跳转到银行充值页面
输入密码,密码正确调转到支付宝支付平台 登录账号密码进行充值
充值成功记录到银行记录表,并且返回余额页面

支付宝

我们项目中只支持一种支付方式,支付宝,所以采用单例模式。保证只生成一个实例。
企业法人信息(营业执照,法人身份证)支付宝的流程是支付宝创建应用,获取到appid。
生成公钥私钥,私钥生成放到本地,公钥去支付宝平台换取支付宝公钥,把支付宝公钥放到本地。支付宝采用的非对称加密方式。
qps限制100,先将请求的订单号放入队列,队列具有先进先出的特性,我使用的redis list做为队列, lpush加入,写一个接口用RRange每秒获取100个请求,向支付宝发起请求,
支付成功回调失败
两种:RRange取出来放入新的队列(sortedSet)中,回调成功从新队列中删除,定时任务每隔1分钟从新队列中取出前一分钟的记录,调用支付宝的查询接口查询是否支付成功,根据支付结果更新订单状态回调接口中的处理
在回调接口中一定重新验证签名,避免回调接口被拦截,输入新订单号直接成功带来的损失。由于回调中操作了多张表操作采用事务处理。
进入到支付宝开放平台 登录获取 appid 公钥 私钥

在这里插入图片描述

封装

在创建好的utils文件夹里创建alipayorder.go文件,进行封装

package utilsimport ("fmt"alipay "github.com/smartwalle/alipay/v3""os"
)var (appID = "2021000120615296"privateKey   = "MIIEowIBAAKCAQEAn7kWd+6GCZJ0QED03lwXYIp0dyO*****************************......"aliPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnXHeUM9kx6UkSV****************....."
)var Client *alipay.Clientfunc Init() {var err errorClient, err = alipay.New(appID, privateKey, false)if err != nil {fmt.Println("初始化支付宝失败, 错误信息为", err)os.Exit(-1)}Client.LoadAliPayPublicKey(aliPublicKey)
}

flask银行存管平台

支付宝充值时调用此接口 将用户id和金额写进充值表中
调用

#进行取钱
@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})

接口

在创建好的controller中的open_troller,go进行编写
前端页面点击充值按钮调用充值校验数据接口 接受前端传过来的用户id和密码 密码正确调用银行充值接口
银行充值接口返回flask银行存管平台 银行取钱路由
接着在调用获取支付宝地址接口 通过封装的 appid 公钥私钥 获取到支付宝充值页面
充值成功回调前端 重定向到前端网页地址 顺便调用更新用户表&充值表

package controllerimport ("encoding/base64""encoding/json""fmt""github.com/gin-gonic/gin""github.com/smartwalle/alipay/v3""io/ioutil""myproject/model""myproject/utils""net/http""net/url""strconv""strings""time"
)func Open(openGrp *gin.RouterGroup) {openGrp.Use().GET("/zinentiqu", zinentiqu) openGrp.Use().GET("/wenzi", Mywenzi)openGrp.Use().POST("/upload", upload)openGrp.Use().POST("/open", OpenBankViews)openGrp.Use().POST("/getpayurl", getpayurl)// 充值校验数据 调用银行进行取钱 openUser() // 获取支付宝地址 UplaodAlipay()openGrp.Use().GET("/huidiaoaly", huidiaoaly)// 回调前端  更新用户表&充值表 StatusUser()openGrp.Use().GET("/get/open", getOpenId)// 查询开户表openGrp.Use().GET("/get/user", getUser)// 获取用户余额openGrp.Use().GET("/aass", aass)
}
/*
充值==》调用银行管理平台进行添加==》
alxhou4794@sandbox.com
*/
// 查询开户表
func getOpenId(c *gin.Context) {id := c.Query("userid")user_info := model.OpenBank{}sql := "select * from open_banks where userid=?"model.GetDb().Raw(sql, id).Scan(&user_info)c.JSON(200, gin.H{"code": 200, "data": user_info})
}// 获取用户余额
func getUser(c *gin.Context) {id := c.Query("userid")user_info := model.User{}sql := "select * from users where id=?"model.GetDb().Raw(sql, id).Scan(&user_info)c.JSON(200, gin.H{"code": 200, "data": user_info})
}// 调用银行充值
func openUser(user_id, money string) float64 {var host = "http://127.0.0.1:5000/recharge"var param = map[string]string{"user_id": user_id,"money":   money,}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)}// 充值校验数据
func getpayurl(c *gin.Context) {data := make(map[string]interface{})_ = c.ShouldBind(&data)// 判断密码是否正确user_info := &model.OpenBank{}sql := "select * from open_banks where userid=?"model.GetDb().Raw(sql, data["userid"]).Scan(&user_info)if fmt.Sprint(user_info.Password) != data["password"] {c.JSON(200, gin.H{"code": 400, "msg": "密码错误"})return}// 调用银行进行取钱code := openUser(fmt.Sprint(data["userid"]), fmt.Sprint(data["num"]))var url_path stringif code == 200 {fmt.Println("000000000000000")// 获取支付宝地址url_path = UplaodAlipay(fmt.Sprint(data["num"]), fmt.Sprint(data["userid"]))}if url_path == "" {c.JSON(200, gin.H{"code": 400, "msg": "充值失败"})return}utils.GetRedis().Setex("user", 3600, data["userid"])c.JSON(200, gin.H{"code": 200, "msg": "跳转中...", "url": url_path})}// 获取支付宝地址
func UplaodAlipay(money, userid string) string {utils.Init()orderId := time.Now().UnixNano()var p = alipay.TradePagePay{}p.NotifyURL = "http://localhost:8000/huidiaoaly" // 异步回调p.ReturnURL = "http://localhost:8000/huidiaoaly" // 同步回调p.Subject = "要充值"p.OutTradeNo = fmt.Sprint(orderId) // 订单号p.TotalAmount = moneyp.ProductCode = "FAST_INSTANT_TRADE_PAY"url, err := utils.Client.TradePagePay(p)if err != nil {return ""}push_url := url.Scheme + "://" + url.Host + url.Path + "?" + url.RawQueryfmt.Println(">>>", url)return push_url
}/*
http://localhost:8000/news/callback?
charset = utf-8
out_trade_no = 1313423523
method = alipay.trade.page.pay.return
total_amount = 10.00
trade_no = 2022102422001493010501925475
auth_app_id = 2021000120615296
version = 1.0
app_id = 2021000120615296
sign_type = RSA2
seller_id = 2088621959391584
timestamp = 2022-10-24+16%3A31%3A59
*/
//alxhou4794@sandbox.com
//  tfdfue7174@sandbox.com
// 回调前端
func huidiaoaly(c *gin.Context) {// 回调前端c.Redirect(http.StatusMovedPermanently, "http://localhost:8080/status/")alipay.AckNotification(c.Writer)order, _ := utils.Client.GetTradeNotification(c.Request)fmt.Println("============", order.TotalAmount)// 通知已获取信息fmt.Println(">>>order:>>>", c.Query("userid"))if order == nil {fmt.Println("==验证失败==")} else {fmt.Println(order)}// TODO 更新状态res := utils.GetRedis().Get("user")fmt.Println("----------", res)StatusUser(fmt.Sprint(order.TotalAmount), fmt.Sprint(res))}// 更新用户表&充值表
func StatusUser(money, userid string) int {// 添加充值表id, _ := strconv.ParseInt(userid, 10, 0)money_float, _ := strconv.ParseFloat(money, 2000)fmt.Println(money_float)fmt.Printf(">>>%T\n", money_float)db := model.GetDb()rec_info := &model.Recharge{Userid: int(id),Money:  int(money_float),Status: 1,Type:   1,}db.Create(rec_info)// 更新用户表user_info := model.User{}sql := "select * from users where id=?"db.Raw(sql, id).Scan(&user_info)num := int(user_info.Tmoney) + int(money_float)db.Exec("update users set tmoney=? where id=?", num, userid)return 1
}func aass(c *gin.Context) {v := "10.01"res, _ := strconv.ParseFloat(v, 10)fmt.Println(res)fmt.Printf(">>>%T\n", int(res)+1)
}

请添加图片描述

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

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

相关文章

抓包抖音充值接口,实现微信支付宝充值抖币收款通道

前段时间搞了个抖音充值的通道,现在搞个YY充值的。 接下来这段时间的安排就是把各个这种平台的充值接口全分析一遍做成接口。 相比抖音的充值抖币接口,yy充值y币的风控就小很多,可以忽略不计,所以开发上也顺利很多。 把调用的相…

SpringBoot源码分析:SpringBoot整合Tomcat(三)

一、概述 SpringBoot整合Tomcat整体启动流程如下图,接下来我们就按照改流程分析SpringBoot中内嵌Tomcat的启动流程。 二、启动流程 通过AbstractApplicationContext.refresh方法进入AbstractApplicationContext.onRefresh方法。 之后进入子类ServletWebServerAppl…

Django对接支付宝实现支付宝充值金币功能

很多网站里都有金币、积分之类的虚拟货币,获取这些往往需要充值。那么问题来了,如何在Django中对接支付宝实现支付宝充值金币的功能呢?网上很多资料都是电商的,那些都会带有订单系统之类比较复杂,而充值金币功能不需要…

抓包抖音充值页面实现微信支付宝充值抖币,可提供api

抖币充值系统重写升级: 1.支持配置扫码配置多个CK 2.支持生成 微信/支付宝 支付二维码 扫码充值 3.支持 微信/支付宝 APP 直接唤醒充值 体验如下: 需要的小伙伴可私信 留言! 整个开发流程思路是以下几步: 1.抓包分析抖音的充值的整个流程&#xff0…

如何使用支付宝充值美区App store的礼品卡

如何使用支付宝充值礼品卡 可能很多人不知道,支付宝可以给美区App Store 充钱,无需信用卡直接购买美区 Apple ID、Google Play、Spotify、Hulu礼品卡,下面就给大家介绍怎么购买 1.城市切换为:旧金山(国际-> 北美洲…

p2p金融项目+支付宝充值

目录 前言 下载服务端SDK 时序图: 按照支付宝时序图的过程去做: 第一步: 第二步--2:生成充值记录(状态:充值中) 第四步:调支付宝的支付接口 第七八步:&#xff0…

RecyclerView实现仿支付宝充值界面

参考博客&#xff1a;https://www.jianshu.com/p/b4bb52cdbeb7 非常感谢上面这位博主的博客给了我非常好的灵感&#xff01;&#xff01;&#xff01; 下面我就先贴一下效果图&#xff1a; 布局代码&#xff1a; <?xml version"1.0" encoding"utf-8"…

JAVA端实现支付宝充值

2019独角兽企业重金招聘Python工程师标准>>> 前言&#xff1a;用户充值到平台 GitHub地址&#xff1a;https://github.com/wubiaowp/SpringCloud2.0.git 一、申请开发者账号-APPID、商户私钥、支付宝公钥、配置回调地址&#xff08;配置沙箱环境-测试&#xff09; 二…

discuz网站没备案无执照接入支付宝充值功能

discuz个人网站没备案无执照接入支付宝充值功能 文章目录 事情是这样的一、支付宝当面付是什么&#xff1f;二、如何申请当面付接口1.登录 支付宝商家中心2.点击“产品中心”&#xff0c;支付产品中选择当面付3.点击“立即开通”4.按步骤填写 三、创建应用及生成公钥和私钥1.登…

android约束布局充值页面,Android学习之RecylerView实习仿支付宝充值界面

今天周末&#xff0c;闲来无事&#xff0c;做了一个仿支付宝充值界面&#xff0c;主要知识点用RecylerView的GridlayoutManager布局管理器&#xff0c;实现不同数据类型&#xff0c;填充不同布局&#xff0c;功能包括单击选中&#xff0c;双击取消&#xff0c;支持可输入金额等…

DISCUZ插件微信支付宝充值积分69.220517最新版【收集免费】

DISCUZ应用中心成熟的微信支付宝积分充值插件&#xff0c;拥有大批使用的站长用户&#xff0c;稳定运行于用于各类站点&#xff0c;反馈优秀&#xff0c;收益丰厚&#xff1b; 一直被模仿&#xff0c;从未被超越。 DZ的积分体系功能已经十分强大&#xff0c;可以做很多事&…

Django对接支付宝实现支付宝充值金币功能示例

很多网站里都有金币、积分之类的虚拟货币&#xff0c;获取这些往往需要充值。那么问题来了&#xff0c;如何在Django中对接支付宝实现支付宝充值金币的功能呢&#xff1f;网上很多资料都是电商的&#xff0c;那些都会带有订单系统之类比较复杂&#xff0c;而充值金币功能不需要…

第9章集 合

文章目录 9.1 Java集合框架9.1.1 集合接口与实现分离9.1.3 迭代器9.1.4 泛型实用方法 9.2 集合框架中的接口9.3.1 链表9.3.2 数组列表9.3.3散列集9.3.4 树集9.3.5 队列与双端队列9.3.6 优先队列 9.4 映射9.4.1 基本映射操作9.4.2 更新映射条目9.4.3 映射视图9.4.4 弱散列映射9.…

MySQL数据库性能优化技巧介绍

MySQL是目前最流行和广泛使用的开源关系型数据库之一&#xff0c;随着数据量的增长和访问负载的提高&#xff0c;优化数据库性能变得至关重要&#xff0c;以确保系统能够高效地处理大量的并发请求。本文将记录一些MySQL数据库性能优化的技巧&#xff0c;提高数据库的运行效率&a…

基于kubesphere的k8s环境部署单点版本的rook-ceph

文章目录 前言一、rook-ceph是什么&#xff1f;二、开始部署1.环境准备2.软件包准备3.下载rook-ceph文件4. 部署operator5.创建ceph集群6.创建工具容器&#xff0c;检查集群状态7.准备dashboard的nodeport端口映射服务8.准备prometheus的metric端口映射服务 总结 前言 基于kub…

记录使用Echarts-gl实现3D地图

一、前言 最近项目需要做个大屏展示的&#xff0c;开始做了第一版用户觉得地图太过于单调了&#xff0c;给我发了一个视频&#xff0c;让我参考着做。我看着视频上的地图旋转了方向、地图有标记、看着像是3D的&#xff08;视频上的地图使用多个图层叠加起来、CSS样式做了旋转&…

Warning: [antd: Menu] `children` will be removed in next major version. Please use `items` instead.

Warning: [antd: Menu] children will be removed in next major version. Please use items instead. andt 更新导致警告 https://ant.design/components/menu-cn/ 在 4.20.0 版本后&#xff0c;我们提供了 的简写方式&#xff0c;有更好的性能和更方便的数据组织方式&#x…

关于remove的用法

java中remove的用法要密切注意自己调用的remove()方法中的&#xff0c;传入的是int类型还是一个对象。 比如上面的程序&#xff0c;list1是一个长度为4的list&#xff0c;list2是1个长度为1的list&#xff0c;但是由于list2.get(0)是一个integer 对象&#xff0c;所以会直接删…

Spring中Bean初始化和销毁的多种方式

Spring中Bean初始化和销毁的多种方式 一、Bean的多种初始化方式1.PostConstruct注解2.实现InitializingBean接口3.声明init-method方法 二、Bean的多种销毁方式1.PreDestroy注解2.实现DisposableBean接口3.声明destroy-method方法 三、总结 Spring中支持在Bean的加载时声明初始…

LayaAir destroy 销毁与 removeChild 移除节点

目录 destroy 释放内存 编码示例 removeChild 移除节点 destroy 销毁节点 1、JavaScript 运行时无法启动垃圾回收器&#xff0c;要确保一个对象能够被回收&#xff0c;需要删除对该对象的所有引用。Sprite 提供的 destory() 方法会帮助设置对象内部引用为 null。 2、例如…