当前位置:网站首页>1.支付系统
1.支付系统
2022-07-06 09:24:00 【小白阿远】
项目场景:
用户购买东西时支付的场景,这里以电脑支付为例
支付的流程
支付宝沙箱的配置
登陆上支付宝之后进入到上边的网址,然后进入到控制台,找到沙箱应用
将app_id,以及认证的公钥和私钥复制保存
进入到flask项目中进行支付宝的一些配置
RSA2密钥可以下载支付宝沙箱工具辅助生成
公钥和私钥可以和视图写到同一个文件中,方便查找,调用
# 支付宝配置
ALIPAY_APPID = '2016101800716047' # 沙箱环境中alipay应用ID
ALIPAY_DEBUG = True
ALIPAY_URL = 'https://openapi.alipaydev.com/gateway.do' # alipay沙箱环境支付宝网管
ALIPAY_RETURN_URL = 'http://127.0.0.1:8888/payment/callback/' # 支付完成后支付宝回调我们应用的地址
app_private_key_string = open("project/private.txt").read()
alipay_public_key_string = open("project/public.txt").read()
公钥和私钥设置为读取状态即可
alipay = AliPay(
appid="",
app_notify_url=None, # 默认回调url
app_private_key_string=app_private_key_string,
alipay_public_key_string=alipay_public_key_string,
# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
sign_type="RSA2", # RSA 或者 RSA2
debug=True # 默认False
)
支付宝配置信息配置好之后要生成登录支付宝连接
def get_pay_url(out_trade_no, total_amount, subject):
# 生成登录支付宝连接
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=out_trade_no,
total_amount=str(total_amount),
subject=subject,
return_url=settings.ALIPAY_RETURN_URL,
)
# 响应登录支付宝连接
# 真实环境电脑网站支付网关:https://openapi.alipay.com/gateway.do? + order_string
# 沙箱环境电脑网站支付网关:https://openapi.alipaydev.com/gateway.do? + order_string
alipay_url = settings.ALIPAY_URL + "?" + order_string
return alipay_url
配置信息可以封转一个方法,哪里需要直接即可调用
支付宝配置完之后就可以进行生成订单以及支付的一系列操作
在生成订单以及支付的时候记得一定要判断该用户是否登录
如果未登录是无法生成订单以及支付的:可以理解为下图所示
生成订单时的订单号可以按照年月日拼接随机数的形式,以确保每个订单的订单号不同例如:
def get_order_id():
"""
SYL202008241212121200005/24
生成订单号: 格式: SYL + 年月日时分秒 + 5位随机数
:return:
"""
d = datetime.datetime.now()
base = 'SYL'
time_str = '%04d%02d%02d%02d%02d%02d' % (d.year, d.month, d.day, d.hour, d.minute, d.second)
rand_num = str(random.randint(10000, 99999))
return base + time_str + rand_num
支付的时候需要需要将订单号以及其他的订单信息写入到数据库中,以便后续的操作
order_str = alipay.api_alipay_trade_page_pay(
subject="实验楼消费",
out_trade_no="%s" % order, # 订单号 注意,标准的json格式没有 '' 单引号,只有 "" 双引号,python默认为 '' 单引号
total_amount=price, # 订单价格
)
# 出现debug的时候该路由无法正常使用
# request_url = 'https://openapi.alipaydev.com/gateway.do?' + order_str
request_url = alipay._gateway + '?' + order_str
db.session.commit()
生成订单时需要判断前后端的订单号是否一致,如果不一致就不能进行支付
判断的时候需要将数据库里的订单号解码出来才能进行判断
rds_order = rds.get("order" + str(user_id))
rds_order = rds_order.decode()
order_id = Orders.query.filter_by(order_id=order).first()
if order_id:
resp["code"] = 405
resp["message"] = "该订单已存在,请确认后再次提交"
return resp
# 将订单入库
price = int(float(price) * 100) # 将价格单位改为分
goods = 1
order = Orders(user=user_id, order_id=order, total_amount=price, record=record, goods=goods)
db.session.add(order)
db.session.commit()
支付之后要查询该订单是否完成支付
def get_pay_result(self, order):
alipay = AliPay(
appid="2021000118696349",
app_notify_url=None, # 默认回调url
app_private_key_string=app_private_key_string,
alipay_public_key_string=alipay_public_key_string,
# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
sign_type="RSA2", # RSA 或者 RSA2
debug=True # 默认False
)
# 此为支付宝交易查询接口
response = alipay.api_alipay_trade_query(trade_no=order, out_trade_no=False)
return response
如果支付出现错误,要将错误原因错误信息返回给用户
通过订单号查询订单的状态无误即可
然后回调给支付宝,对支付进行最后的判断
判断它是否合法,或者金额是否存在偏差,如若无误的话即可返回给前端购买成功的信息,反正则返回购买失败的信息,让用户重新购买操作
边栏推荐
- Detailed explanation of three ways of HTTP caching
- 7-1 output all primes between 2 and n (PTA programming)
- 浙大版《C语言程序设计实验与习题指导(第3版)》题目集
- . Net6: develop modern 3D industrial software based on WPF (2)
- 关于超星脚本出现乱码问题
- HackMyvm靶機系列(3)-visions
- Ucos-iii learning records (11) - task management
- Record an edu, SQL injection practice
- XSS unexpected event
- 7-4 hash table search (PTA program design)
猜你喜欢
Xray and burp linkage mining
Hackmyvm target series (2) -warrior
Statistics 8th Edition Jia Junping Chapter 5 probability and probability distribution
[paper reproduction] cyclegan (based on pytorch framework) {unfinished}
Attack and defense world misc practice area (GIF lift table ext3)
JDBC看这篇就够了
《统计学》第八版贾俊平第十三章时间序列分析和预测知识点总结及课后习题答案
Statistics 8th Edition Jia Junping Chapter 3 after class exercises and answer summary
HackMyvm靶机系列(4)-vulny
xray与burp联动 挖掘
随机推荐
{1,2,3,2,5}查重问题
[issue 18] share a Netease go experience
How does SQLite count the data that meets another condition under the data that has been classified once
7-15 h0161. Find the greatest common divisor and the least common multiple (PTA program design)
HackMyvm靶機系列(3)-visions
Circular queue (C language)
记一次api接口SQL注入实战
Résumé des points de connaissance et des réponses aux exercices après la classe du chapitre 7 de Jia junping dans la huitième édition des statistiques
内网渗透之内网信息收集(五)
JDBC看这篇就够了
《英特尔 oneAPI—打开异构新纪元》
《统计学》第八版贾俊平第三章课后习题及答案总结
Captcha killer verification code identification plug-in
The difference between layer 3 switch and router
Statistics 8th Edition Jia Junping Chapter IX summary of knowledge points of classified data analysis and answers to exercises after class
网络基础之路由详解
HackMyvm靶机系列(4)-vulny
Harmonyos application development -- address book management system telmanagesys based on listcontainer [phonebook][api v6]
Chain team implementation (C language)
Build domain environment (win)