支付宝支付
拿取自己的公钥换取支付宝的公钥
自己的公钥私钥,支付宝的公钥,存放在文档中便于读取出来使用
将支付地址封装成一个方法
from alipay import AliPay
class AliTool():
privite_key = '' # 自己的私钥
public_key = '' # 支付宝的公钥
alipay = None # 实例化AliPay
domain = 'https://openapi.alipaydev.com/gateway.do?' #要跳转的支付地址前缀
def __init__(self):
self.get_privite_key()
self.get_public_key()
self.alipay = AliPay(
appid='2021000121616226', #自己沙箱应用的id
app_private_key_string=self.privite_key, #私钥
alipay_public_key_string=self.public_key,#公钥
app_notify_url=None, # 回调地址
sign_type='RSA2', # 签名算法
debug=True, # 请求来到支付宝沙箱
)
def get_privite_key(self):
with open('./keys/secret_key.txt', 'r',encoding='utf-8') as f:
self.privite_key = f.read()
f.close()
def get_public_key(self):
with open('./keys/alipay_public_key.txt', 'r',encoding='utf-8') as f:
self.public_key = f.read()
f.close()
def pay(self,title,total_price,order_num):
path = self.alipay.api_alipay_trade_page_pay(
subject=title, # 名字
out_trade_no=order_num, # 订单号
total_amount=total_price, # 价格
return_url='http://127.0.0.1:5000/user/pay_url', # 支付完成之后跳转的地址,要进行进一步的订单判断
notify_url='http://www.baidu.com', # 这个我也不晓得是啥
)
return self.domain + path #>>>>支付地址
支付地址后端接口
status:》》》 0 待支付 、1已支付、 2完成 、3已取消
class VipOrderView(Resource):
@login
def get(self,id):
# user_id = 1
user_id = g.user_id
order_num = datetime.datetime.strftime(datetime.datetime.now(),'%Y%m%d%H%M%S') +str(random.randint(10000,99999)) # 订单号
vip_info = VipListModel.query.get(id)
if not vip_info:
return jsonify({
'code':400,
'msg':'商品不存在'
})
v= VipOrderModel(
order_num = order_num,
vip_id = id,
user_id = user_id,
price = vip_info.price,
)
db.session.add(v)
db.session.commit()
# 调用定时任务 ,若未支付 延时100秒关闭订单,只是打印出来,同时将订单的状态改变,不会条状
current_app.schedule.add_job(close_order,'interval',seconds=100,args=[v.oid],
end_date = (datetime.datetime.now() + datetime.timedelta(minutes=1))
)
url = AliTool().pay('会员购买-%s' %vip_info.title,str(v.price),order_num)
return jsonify({
'code':200,
'msg':'成功',
'data':{
'url':url
}
})
在这里进行表单校验
class PayView3(Resource):
def get(self):
''''
request.args 获取url中传递的参数,使用 to_dict () 转化为key value对,
value的类型为字符串,比如传递url为
http://127.0.0.1:5000/?name=gp&age=11 输出 {'name': 'gp', 'age': '11'}
'''
args = request.args.to_dict() # 获取地址栏的所有数据
sign = args.pop('sign') # 拿出签名部分进行校验
rs = PayTool().alipay.verify(args,sign)
print('rs>>>>',rs)
if not rs:
return jsonify({
'code':400,
'msg':'参数错误'
})
code = args['out_trade_no']
orderdata = OrderModel.query.filter(OrderModel.order_num == code).first()
if not orderdata:
return jsonify({
'code':400,
'msg':'订单不存在'
})
if order_data.status == 3:
print('订单失效')
return redirect('http://127.0.0.1:8080/')
orderdata.status = 2 # 修改订单状态
db.session.commit()
return redirect('http://127.0.0.1:8080/')
api.add_resource(PayView3,'/pay_url')