本节文档下载地址:https://download.csdn.net/download/geek_xiong/11615541

目录

蚂蚁金服--支付宝的使用

订单支付

前后端代码编写

测试


蚂蚁金服--支付宝的使用

蚂蚁金服的链接地址:https://open.alipay.com/platform/manageHome.htm

使用沙箱账号做开发与测试

开发文档:https://openhome.alipay.com/developmentDocument.htm

使用python开发工具包:https://github.com/fzlee/alipay/blob/master/README.zh-hans.md

以上具体的可参考文档(自行下载)

订单支付

在我的订单界面显示房客预定过的订单,其中包括“待结单”、“去支付”、“发表评论”、“已完成”等,本节要完成的是“去支付”。

点击“去支付”按钮,调起支付宝接口,进入支付宝支付界面,需要自定义要展示的参数(标题、金额等)

前后端代码编写

URL:127.0.0.1:5000/api/v1.0/orders/<orderId>/payment

请求方式:POST

参数:订单编号

大致流程:

  • 获取用户的编号
  • 判断该订单的状态
  • 配置支付宝接口
  • 生成支付宝链接
  • 返回结果
# POST 127.0.0.1:5000/api/v1.0/orders/<orderId>/payment@api.route("/orders/<int:order_id>/payment", methods=['POST'])
@login_required
def order_pay(order_id):"""发起支付宝支付"""# 获取用户的iduser_id = g.user_id# 判断订单状态try:order = Order.query.filter(Order.id==order_id, Order.user_id==user_id, Order.status=="WAIT_PAYMENT").first()except Exception as e:current_app.logger.errer(e)return jsonify(errno=RET.DBERR, errmsg='数据库异常')if order is None:return jsonify(errno=RET.NODATA, errmsg='订单数据有误')# 创建支付宝sdk的工具对象alipay_client = AliPay(appid="2016101000651363",app_notify_url=None,app_private_key_path=os.path.join(os.path.dirname(__file__), "keys/app_private_key.pem"),alipay_public_key_path=os.path.join(os.path.dirname(__file__), "keys/alipay_public_key.pem"),sign_type="RSA2",debug=True)# 手机网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_stringorder_string = alipay_client.api_alipay_trade_wap_pay(out_trade_no=order.id,total_amount=str(order.amount/100.0),subject='爱家租房 %s' % order.id,return_url="http://127.0.0.1:5000/payComplete.html",notify_url=None  # 可选, 不填则使用默认notify url)# 构建让用户跳转的支付链接地址pay_url = constants.ALIPAY_URL_PREFIX + order_stringreturn jsonify(errno=RET.OK, errmsg="OK", data={"pay_url": pay_url})
# 支付宝的网关地址(支付宝的域名)
ALIPAY_URL_PREFIX = "https://openapi.alipaydev.com/gateway.do?"

支付成功后会返回结果,url如:

url如:http://127.0.0.1:5000/payComplete.html?charset=utf-8&out_trade_no=3&method=alipay.trade.wap.pay.return&total_amount=4500.00&sign=Givnobw%2FNN832970v....FNN8329&trade_no=2019082622001498191000030983&auth_app_id=2016101000651363&version=1.0&app_id=2016101000651363&sign_type=RSA2&seller_id=2088102178900710&timestamp=2019-08-26+17%3A41%3A35

我们并不想带着 这个结果回到订单页面,所以设置了一个过渡界面payComplete.html

<div class="container"><div class="top-bar"><div class="nav-bar"><h3 class="page-title">支付完成</h3><a class="nav-btn fl" href="/my.html"><span><i class="fa fa-angle-left fa-2x"></i></span></a></div></div><div class="orders-con"><p> 支付已完成 </p><a href="/orders.html">回到我的订单</a></div><div class="footer"><p><span><i class="fa fa-copyright"></i></span>爱家租房&nbsp;&nbsp;享受家的温馨</p></div></div><script type="text/javascript">function getCookie(name) {var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");return r ? r[1] : undefined;}var alipayData = document.location.search.substr(1);$.ajax({url: "/api/v1.0/order/payment",type: "put",data: alipayData,headers: {"X-CSRFToken": getCookie("csrf_token")}})</script>

当点击“回到我的订单”链接时,发送ajax请求,

后端根据url中的参数订单编号,将订单状态改为“发表评论”,即已支付完成

# put 127.0.0.1:5000/api/v1.0/order/payment@api.route("/order/payment", methods=['PUT'])
@login_required
def save_order_payment_result():"""保存支付订单结果"""alipay_dict = request.form.to_dict()# # 对支付宝的数据进行分离  提取出支付宝的签名参数sign 和剩下的其他数据alipay_sign = alipay_dict.pop("sign")# 创建支付宝sdk的工具对象alipay_client = AliPay(appid="2016101000651363",app_notify_url=None,app_private_key_path=os.path.join(os.path.dirname(__file__), "keys/app_private_key.pem"),alipay_public_key_path=os.path.join(os.path.dirname(__file__), "keys/alipay_public_key.pem"),sign_type="RSA2",debug=True)# 借助工具验证参数的合法性# 如果确定参数是支付宝的,返回True,否则返回falseresult = alipay_client.verify(alipay_dict, alipay_sign)if result:# 修改数据库的订单状态信息order_id = alipay_dict.get("out_trade_no")trade_no = alipay_dict.get("trade_no")  # 支付宝交易的流水号try:Order.query.filter_by(id=order_id).update({"status": "WAIT_COMMENT", "trade_no": trade_no})db.session.commit()except Exception as e:current_app.logger.error(e)db.session.rollback()return jsonify(error=RET.OK, errmsg='OK')
# models.py
class Order(...):...trade_no = db.Column(db.String(80))  # 交易的流水号 支付宝的

重新迁移一下数据库

python manage.py db initpython manage.py db migrate -m 'db tables'python manage.py db upgrade

测试

重新启动一下项目

flask爱家租房项目开发(十三)相关推荐

  1. flask爱家租房项目开发(一)

    目录 需求文档 创建工程目录以及flask配置 配置日志信息 数据库设计与迁移 静态文件的配置,使浏览器可以正常访问文件 csrf 防护机制 需求文档 需求功能 1. 主页     1.1 最多5个房 ...

  2. flask爱家租房项目开发(十二)

    下载地址:https://download.csdn.net/download/geek_xiong/11585216 预定房间功能 在房间详情页提供预定功能,点击进入预定页面,提交预定后页面跳转到我 ...

  3. flask爱家租房项目开发(十)

    本文代码文档下载地址:https://download.csdn.net/download/geek_xiong/11576968 目录 房屋管理 发布的房屋信息管理 后端代码编写 前端代码编写 我的 ...

  4. Flask爱家租房--订单支付(支付过程)

    文章目录 0.支付流程 1. 重点总结 2.后端代码 3.前端js 4.前端html 0.支付流程 1. 重点总结 1)用户进入"我的订单"页面,点击"去支付" ...

  5. Flask爱家租房--房屋管理(搜索房屋列表)

    文章目录 0.效果展示 1.后端接口 2.前端js 3.前端html 0.效果展示 1.后端接口 house.py部分接口: # GET /api/v1.0/houses?sd=2017-12-01& ...

  6. Flask爱家租房--房屋管理(获取房屋详情)

    文章目录 0.效果展示 1.思路总结 2.后端接口 3.前端js 4.前端html 0.效果展示 1.思路总结 1)房屋详情页面开始加载时,detail.js首先通过定义的函数(重点:document ...

  7. Flask爱家租房--订单(房东接单、拒单)

    文章目录 0.效果展示 1.效果展示 2.后端接口 3.前端js 4.前端html 0.效果展示 1.效果展示 1)当房东点击"客户订单",js向后端接口get_user_orde ...

  8. Flask爱家租房--房屋管理(获取主页幻灯片展示的房屋基本信息)

    文章目录 0.效果展示 1.重点总结 2.后端代码 3.前端js 4.前端html 0.效果展示 1.重点总结 1)当用户访问首页时,开始加载页面信息,此时index.js文件首先调用后端接口chec ...

  9. Flask爱家租房--房屋管理(获取房东发布的房源信息条目)

    文章目录 0.效果展示 1.重点总结 2.后端代码 3.前端html 4.前端js 0.效果展示 1.重点总结 1)用户点击"我的房源",页面开始加载,此时myhouse.js限定 ...

最新文章

  1. Docker学习(五)-----Docker查看日志
  2. 算法设计思想(3)— 迭代法
  3. python数据结构与算法:双向链表
  4. 中国18岁美女机器人:出得厅堂,下得厨房,还要什么女朋友!
  5. 跟着 Github 学习 Restful HTTP API 的优雅设计
  6. mvn 汇编_2020年积极向上的班级口号汇编71条
  7. xml.query() 实例演示
  8. 烟草局计算机笔试,2020年广西南宁烟草局什么时候笔试?
  9. [html] 如何禁用掉a标签的默认事件?
  10. AMD发布APPML源码,构建clMath库
  11. 哪些程序员在围观 996.ICU?Python 爬取 40000 条 GitHub 数据告诉你!
  12. win10使用debug
  13. ArcGIS-云南洱海流域地形图制作及使用图层下载(shp+dem)
  14. jinjia2 模板库- django/flask
  15. python多继承mro_Python的多继承问题-MRO和C3算法
  16. 一只蒟蒻的树形DP学习笔记
  17. word文档通配符换行_将多图微信文章快速转换为pdf或word的方法
  18. win10系统改win7设置bios方法图文教程
  19. V_rep与vs2019开发环境配置
  20. JavaScript中一个等号、二个等号、 三个等号 的区别

热门文章

  1. 使用python 搭建web服务器
  2. javac不是内部命令解决办法
  3. javac不是内部或外部命令,也不是可运行的程序解决办法和踩过的一些坑
  4. 关于win10系统JDK安装javac不是内部或外部命令等问题
  5. C++中字符型变量与整型的算术运算
  6. ZwCreateFile报错0xC0000043,STATUS_SHARING_VIOLATION
  7. three.js的demo例子-STL加载对象组件
  8. Python打包成exe文件_详细操作
  9. 微信收藏夹文件保存在服务器安全吗,开启这个功能,微信文件再也不怕过期
  10. 跳转到文字转语音设置界面