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

文章目录

  • 0.支付流程
  • 1. 重点总结
  • 2.后端代码
  • 3.前端js
  • 4.前端html

0.支付流程

在这里插入图片描述

1. 重点总结

1)用户进入“我的订单”页面,点击“去支付”;
在这里插入图片描述在这里插入图片描述触发后端js中的函数,发出ajsx异步请求,调用后端相应接口order_pay(order_id),目的是构建让用户跳转的支付连接地址,并推送给用户进行付款操作;因为请求方式是PUT,因此需要在参数中加入X-CSRFToken;
在这里插入图片描述在这里插入图片描述

2)在后端进行逻辑处理,构建出跳转的支付链接地址pay_url(并指出用户完成支付后返回的地址return_url)。
在这里插入图片描述在这里插入图片描述

支付链接地址经过js回调函数处理,将此pay_url返回给前端页面,此时自动打开手机支付宝app,用户对相应的订单进行支付操作,

在这里插入图片描述
支付完成后,跳转return_url相对应的前端页面paycomplete.html,如下图所示。
在这里插入图片描述
3)用户在支付完成后,需要修改数据库中订单的相关信息,比如说订单的状态status,以及支付宝的交易号trade_no,此时前端页面中的js向后端发送ajsx异步请求,向后端相应接口save_order_payment_result()发出逻辑处理。

在这里插入图片描述
js中alipayData = document.location.search.substr(1),切割URL中的参数信息,并以form格式将参数信息推送给后端接口,后端接收数据;在这里插入图片描述

在这里插入图片描述
为安全起见,借助工具校验参数的合法性,确定参数是支付宝真实发出的;
在这里插入图片描述

最后修改数据库的订单状态信息。
在这里插入图片描述此时,点击前文中支付成功界面中的“回到我的订单”,会发现订单状态已经从“去支付”变为“发表评论”。
在这里插入图片描述

2.后端代码

pay.py详细代码如下:

# coding:utf-8from . import api
from ihome.utils.commons import login_required
from ihome.models import Order
from flask import g, current_app, jsonify, request
from ihome.utils.response_code import RET
from alipay import AliPay
from ihome import constants, db
import os@api.route("/orders/<int:order_id>/payment", methods=["POST"])
@login_required
def order_pay(order_id):"""发起支付宝支付"""user_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.error(e)return jsonify(errno=RET.DBERR, errmsg="数据库异常")if order is None:return jsonify(errno=RET.NODATA, errmsg="订单数据有误")# 创建支付宝sdk的工具对象alipay_client = AliPay(appid="2016081600258081",app_notify_url=None,  # 默认回调urlapp_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",  # RSA 或者 RSA2debug=True  # 默认False)# 手机网站支付,需要跳转到https://openapi.alipaydev.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=u"爱家租房 %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})@api.route("/order/payment", methods=["PUT"])
def save_order_payment_result():"""保存订单支付结果"""alipay_dict = request.form.to_dict()# 对支付宝的数据进行分离  提取出支付宝的签名参数sign 和剩下的其他数据alipay_sign = alipay_dict.pop("sign")# 创建支付宝sdk的工具对象alipay_client = AliPay(appid="2016081600258081",app_notify_url=None,  # 默认回调urlapp_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",  # RSA 或者 RSA2debug=True  # 默认False)# 借助工具验证参数的合法性# 如果确定参数是支付宝的,返回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(errno=RET.OK, errmsg="OK")

3.前端js

order.js中部分代码:

$.get("/api/v1.0/user/orders?role=custom", function(resp){if ("0" == resp.errno) {$(".orders-list").html(template("orders-list-tmpl", {orders:resp.data.orders}));$(".order-pay").on("click", function () {var orderId = $(this).parents("li").attr("order-id");$.ajax({url: "/api/v1.0/orders/" + orderId + "/payment",type: "post",dataType: "json",headers: {"X-CSRFToken": getCookie("csrf_token"),},success: function (resp) {if ("4101" == resp.errno) {location.href = "/login.html";} else if ("0" == resp.errno) {// 引导用户跳转到支付宝连接location.href = resp.data.pay_url;}}});});

4.前端html

order.html中部分代码:

 <li order-id={{order.order_id}}><div class="order-title"><h3>订单编号:{{order.order_id}}</h3>{{ if "WAIT_COMMENT" == order.status }}<div class="fr order-operate"><button type="button" class="btn btn-success order-comment" data-toggle="modal" data-target="#comment-modal">发表评价</button></div>{{ else if "WAIT_PAYMENT" == order.status }}<div class="fr order-operate"><button type="button" class="btn btn-success order-pay">去支付</button></div>

paycomplete.html代码,此代码中有部分js代码,处理上文中的第三部分逻辑。

<!DOCTYPE html>
<html>
<head> <meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"><title>爱家-我的订单</title><link href="/static/plugins/bootstrap/css/bootstrap.min.css" rel="stylesheet"><link href="/static/plugins/font-awesome/css/font-awesome.min.css" rel="stylesheet"><link href="/static/css/reset.css" rel="stylesheet"><link href="/static/plugins/bootstrap-datepicker/css/bootstrap-datepicker.min.css" rel="stylesheet"><link href="/static/css/ihome/main.css" rel="stylesheet"><link href="/static/css/ihome/orders.css" rel="stylesheet">
</head>
<body><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 src="/static/js/jquery.min.js"></script><script src="/static/plugins/bootstrap/js/bootstrap.min.js"></script><script src="/static/plugins/bootstrap-datepicker/js/bootstrap-datepicker.min.js"></script><script src="/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js"></script><script src="/static/js/template.js"></script><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>
</body>
</html>

返回顶部

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

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

相关文章

实验五 类和对象-3

1.ex3.cpp 1 #include <iostream>2 #include <vector>3 #include <string>4 using namespace std;5 6 // 函数声明 7 void output1(vector<string> &); 8 void output2(vector<string> &); 9 10 int main() 11 { 12 vector<st…

linux 共享移动硬盘,随时登陆上QQ 自带Linux移动硬盘实战

在以往我们的观念中&#xff0c;移动硬盘顶多就是个移动存储设备&#xff0c;根本谈不上有什么功能&#xff0c;但今天这款一盘通却将我们原始的观念打了一个180大转弯&#xff01;如果你的电脑支持USB设备启动&#xff0c;那么只需要在BIOS进行一下更改&#xff0c;一盘通就可…

需求分析的图形工具(层次方框 warnier IPO)

1 层次方框图 层次方框图用树形结构的一系列多层次的矩形框描绘数据的层次结构。 例如&#xff0c;描绘一家计算机公司全部产品的数据结构可以用下图层次方框图表示。 这家公司的产品由硬件、软件和服务3类产品组成&#xff0c;软件产品又分为系统软件和应用软件&#xf…

如何处理错误信息 Pricing procedure could not be determined

2019独角兽企业重金招聘Python工程师标准>>> 当给一个SAP CRM Quotation文档的行项目维护一个产品时&#xff0c;遇到如下错误信息&#xff1a;Pricing procedure could not be determined 通过调试得知错误消息在function module CRM_PRIDOC_COM_PRCPROC_DET_SEL第…

Flask爱家租房--订单(下订单)

文章目录0 、效果展示1、思路总结2、后端代码3、前端js4、前端html0 、效果展示 detail.html booking.html 1、思路总结 1&#xff09;用户打开房屋详情页detail.html之后&#xff0c;后端detail.js会判断此访问用户是否为房东&#xff0c;若不是房东&#xff0c;则在详情…

红帽linux lnmp搭建,Linux(redhat5.4)下lnmp环境的搭建

在前面我们已经实现了lamp架构的创建&#xff0c;今天就让我们来看一看lnmp架构是如何实现的。计划的实验步骤如下&#xff1a;1. 数据库mysql的安装2. Nginx的安装&#xff0c;libevent(编译库代码)的安装&#xff0c;pcre的安装3. Php的安装4. 测试1. Mysql 的安装//注意:小编…

Flsak爱家租房--订单(获取用户订单、用户评论)

文章目录0.页面效果1.思路总结2.后端代码3.前端js4.前端html0.页面效果 1.思路总结 1&#xff09;用户点击“我的订单”&#xff0c;js向后端获取数据&#xff0c;并加载在前端的模板中&#xff1b; 2&#xff09;用户点击相应订单的“去支付”按钮&#xff0c;js向引导用户…

软件工程形式化技术简介

形式化技术在软件工程中有效的提高了开发的效率、改进了软件开发的质量、减少了开发费用。形式化的技术容易在软件的规约上取得一致性&#xff0c;它属于一种非常有效的交流方式。 (一)非形式化的缺点 用自然语言书写的系统规格说明书&#xff0c;可能存在矛盾、二义性、含糊性…

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

文章目录0.效果展示1.效果展示2.后端接口3.前端js4.前端html0.效果展示 1.效果展示 1&#xff09;当房东点击“客户订单”&#xff0c;js向后端接口get_user_orders()获取数据&#xff0c;订单页面开始加载&#xff1b; 2&#xff09;当房东确定接单时&#xff0c;js会向后端…

开发经验和屁股的关系

昨晚为CSDN俱乐部的同学们做了一个讲座《微博开发、云平台及一个微博应用开发的简单方案》。已经用屏幕录相机记录下来了&#xff0c;不想讲完一边和同学聊着&#xff0c;一边收拾&#xff0c;直接关机&#xff0c;教室中带有保护卡的电脑自然不给面子&#xff0c;录相文件就此…

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

文章目录0.效果展示1.思路总结2.后端接口3.前端js4.前端html0.效果展示 1.思路总结 1&#xff09;房屋详情页面开始加载时&#xff0c;detail.js首先通过定义的函数&#xff08;重点&#xff1a;document.location.search&#xff09;&#xff0c;截取需要向后端取得详情页面的…

MAC 安装 pygraphviz 找不到头文件

networkx的有向图只能通过箭头来区别两点之间的两条边&#xff0c;但是我在复现snake论文的时候&#xff0c;需要绘制两个交叉口之间的两条不同方向的路段&#xff0c;最后选择了pygraphviz 直接通过anaconda打开对应终端&#xff0c;pip install pygraphviz&#xff0c;一直报…

如此如此,怎能师夷长技以制夷!

以一个爱国的软件设计者的角度来看这样一个weibo,大概的内容就是&#xff1a;北京南站的4SQ上有个老外留言吐槽&#xff1a;“没有中国身份证根本就没法在自动售票机上买票&#xff0c;那他妈的他们弄个英文界面干屁啊&#xff01;” 出于行业的敏感性&#xff0c;我感到很有意…

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

文章目录0.效果展示1.后端接口2.前端js3.前端html0.效果展示 1.后端接口 house.py部分接口&#xff1a; # GET /api/v1.0/houses?sd2017-12-01&ed2017-12-31&aid10&sknew&p1 api.route("/houses") def get_house_list():"""获取房…

编程语言API性能大比拼

Ciaran是Skimlinks项目团队中的一名领导者&#xff0c;热爱开发&#xff0c;在业余时间喜欢研究一门新语言。作者和他的团队在开发Skimlinks项目时遇到了一些困难&#xff0c;于是做了这份测试&#xff0c;文中将Node.js、Scala、Go、Python、PHP进行对比&#xff0c;最终Pytho…

Python面试题总结(8)--操作类

1. 请写一个 Python 逻辑&#xff0c;计算一个文件中的大写字母数量 答&#xff1a;读取‘A.txt’中的大写字母数量 with open(A.txt) as f:"""计算一个文件中的大写字母数量"""count 0for i in f.read():if i.isupper():count 1 print(cou…

Flask--读取配置参数的方式

文章目录方法1. 使用配置文件方法2. 使用对象配置参数方法3. 直接操作config的字典对象项目实例方法1. 使用配置文件 首先将配置参数写在文件中&#xff0c;例如&#xff1a;config.cfg 然后导入: app Flask("__name__") app.config.from_pyfile("config.cf…

g开头的C语言编程软件,C语言函数大全(g开头)

函数名: gcvt功 能: 把浮点数转换成字符串用 法: char *gcvt(double value, int ndigit, char *buf);程序例:#include#includeint main(void){char str[25];double num;int sig 5; /* significant digits *//* a regular number */num 9.876;gcvt(num, sig, str);printf(&quo…

程序员成熟的标志《程序员成长路线图:从入门到优秀》

对好书进行整理&#xff0c;把好内容共享。 我见证过许多的程序员的成长&#xff0c;他们很多人在进入成熟期之后&#xff0c;技术上相对较高&#xff0c;一般项目开发起来比较自信&#xff0c;没有什么太大的困难&#xff0c;有的职位上也有所提升&#xff0c;成了项目经理、…