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.pswp.cn/news/452588.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452588.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452588.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信小程序利用key實現列表性能的提升

微信小程序利用key實現列表性能的提升 key值在列表渲染的時候&#xff0c;能夠提升列表渲染性能&#xff0c;為什么呢&#xff1f;首先得想想小程序的頁面是如何渲染的&#xff0c;主要分為以下幾步&#xff1a; 將wxml結構的文檔構建成一個vdom虛擬數頁面有新的交互&#xff0…

CentOS MySQL 5.7編譯安裝

CentOS MySQL 5.7編譯安裝 MySQL 5.7 GA版本的發布&#xff0c;也就是說從現在開始5.7已經可以在生產環境中使用&#xff0c;有任何問題官方都將立刻修復。 MySQL 5.7主要特性&#xff1a; 更好的性能&#xff1a;對于多核CPU、固態硬盤、鎖有著更好的優化&#xff0c;每秒100…

為什么設計師創造的編程語言更受歡迎?

導讀&#xff1a;在編程的世界里&#xff0c;語言紛繁多樣&#xff0c;而大部分真正廣泛流行的語言并不是那些學術界的產物&#xff0c;而是在通過自由發揮設計出來的。 和那些在最后期限重壓下產生的語言版本比較起來&#xff0c;從一定程度上來看&#xff0c;從學術界產生出…

狀態轉換圖簡介

狀態轉換圖(簡稱為狀態圖)通過描繪系統的狀態及引起系統狀態轉換的事件&#xff0c;來表示系統的行為。此外&#xff0c;狀態圖還指明了作為特定事件的結果系統將做哪些動作。 &#xff08;一&#xff09;狀態 狀態是任何可以被觀察到的系統行為模式&#xff0c;一個狀態代表…

C#常用單元測試框架比較:XUnit、NUnit和Visual Studio(MSTest)

做過單元測試的同學大概都知道以上幾種測試框架&#xff0c;但我一直很好奇它們到底有什么不同&#xff0c;然后搜到了一篇不錯的文章清楚地解釋了這幾種框架的最大不同之處。 地址在這里&#xff1a;http://www.tuicool.com/articles/F3eEn2j 簡而言之&#xff0c;三者是非常相…

實驗五 類和對象-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…

Vector用法詳解

這篇文章的目的是為了介紹std::vector&#xff0c;如何恰當地使用它們的成員函數等操作。本文中還討論了條件函數和函數指針在迭代算法中使用&#xff0c;如在remove_if()和for_each()中的使用。通過閱讀這篇文章讀者應該能夠有效地使用vector容器&#xff0c;而且應該不會再去…

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下各權限的細分

PS&#xff1a;有時候你發現用root權限都不能修改某個文件&#xff0c;大部分原因是曾經用chattr命令鎖定該文件了。chattr命令的作用很大&#xff0c;其中一些功能是由Linux內核版本來支持的&#xff0c;不過現在生產絕大部分跑的linux系統都是2.6以上內核了。通過chattr命令修…

紅帽linux lnmp搭建,Linux(redhat5.4)下lnmp環境的搭建

在前面我們已經實現了lamp架構的創建&#xff0c;今天就讓我們來看一看lnmp架構是如何實現的。計劃的實驗步驟如下&#xff1a;1. 數據庫mysql的安裝2. Nginx的安裝&#xff0c;libevent(編譯庫代碼)的安裝&#xff0c;pcre的安裝3. Php的安裝4. 測試1. Mysql 的安裝//注意:小編…

為什么借助開源學習是最有效的?

導讀&#xff1a;盛大創新院高級研究員莊表偉近日編撰系列文章《借助開源項目&#xff0c;學習軟件開發》活動&#xff0c;引起業界關注。莊表偉認為&#xff0c;通過編撰這些文章&#xff0c;希望更多開發者能夠借助開源項目提高開發效率&#xff0c;減少重復勞動并從開源軟件…

redux middleware 源碼分析

原文鏈接 middleware 的由來 在業務中需要打印每一個 action 信息來調試&#xff0c;又或者希望 dispatch 或 reducer 擁有異步請求的功能。面對這些場景時&#xff0c;一個個修改 dispatch 或 reducer 代碼有些乏力&#xff0c;我們需要一個可組合的、自由增減的插件機制&…

Flsak愛家租房--訂單(獲取用戶訂單、用戶評論)

文章目錄0.頁面效果1.思路總結2.后端代碼3.前端js4.前端html0.頁面效果 1.思路總結 1&#xff09;用戶點擊“我的訂單”&#xff0c;js向后端獲取數據&#xff0c;并加載在前端的模板中&#xff1b; 2&#xff09;用戶點擊相應訂單的“去支付”按鈕&#xff0c;js向引導用戶…

【SCOI2005】【BZOJ1087】互不侵犯King(狀壓dp)

problem 在NN的棋盤里面放K個國王每個國王會攻擊它周圍的一圈共8個格子使他們互不攻擊&#xff0c;共有多少種擺放方案N < 9solution 用01串表示某一行放置的情況 首先枚舉當前做到第幾行&#xff0c;以及當前一共放了幾顆棋子。于是狀態f[i][j][k]表示到第i行&#xff0c;一…

軟件工程形式化技術簡介

形式化技術在軟件工程中有效的提高了開發的效率、改進了軟件開發的質量、減少了開發費用。形式化的技術容易在軟件的規約上取得一致性&#xff0c;它屬于一種非常有效的交流方式。 (一)非形式化的缺點 用自然語言書寫的系統規格說明書&#xff0c;可能存在矛盾、二義性、含糊性…

華為榮耀筆記本linux怎么下載軟件,華為magic book筆記本怎么下載軟件

大家好&#xff0c;我是時間財富網智能客服時間君&#xff0c;上述問題將由我為大家進行解答。華為magic book筆記本下載軟件的方法如下&#xff1a;1、首先&#xff0c;點擊桌面開始圖標&#xff0c;找到應用商店&#xff0c;并點擊。2、進入應用商店&#xff0c;點擊搜索欄&a…