日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flask爱家租房--订单支付(支付过程) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 0.支付流程
  • 1. 重點總結(jié)
  • 2.后端代碼
  • 3.前端js
  • 4.前端html

0.支付流程

1. 重點總結(jié)

1)用戶進入“我的訂單”頁面,點擊“去支付”;
觸發(fā)后端js中的函數(shù),發(fā)出ajsx異步請求,調(diào)用后端相應(yīng)接口order_pay(order_id),目的是構(gòu)建讓用戶跳轉(zhuǎn)的支付連接地址,并推送給用戶進行付款操作;因為請求方式是PUT,因此需要在參數(shù)中加入X-CSRFToken;

2)在后端進行邏輯處理,構(gòu)建出跳轉(zhuǎn)的支付鏈接地址pay_url(并指出用戶完成支付后返回的地址return_url)。

支付鏈接地址經(jīng)過js回調(diào)函數(shù)處理,將此pay_url返回給前端頁面,此時自動打開手機支付寶app,用戶對相應(yīng)的訂單進行支付操作,


支付完成后,跳轉(zhuǎn)return_url相對應(yīng)的前端頁面paycomplete.html,如下圖所示。

3)用戶在支付完成后,需要修改數(shù)據(jù)庫中訂單的相關(guān)信息,比如說訂單的狀態(tài)status,以及支付寶的交易號trade_no,此時前端頁面中的js向后端發(fā)送ajsx異步請求,向后端相應(yīng)接口save_order_payment_result()發(fā)出邏輯處理。


js中alipayData = document.location.search.substr(1),切割URL中的參數(shù)信息,并以form格式將參數(shù)信息推送給后端接口,后端接收數(shù)據(jù);


為安全起見,借助工具校驗參數(shù)的合法性,確定參數(shù)是支付寶真實發(fā)出的;

最后修改數(shù)據(jù)庫的訂單狀態(tài)信息。
此時,點擊前文中支付成功界面中的“回到我的訂單”,會發(fā)現(xiàn)訂單狀態(tài)已經(jīng)從“去支付”變?yōu)椤鞍l(fā)表評論”。

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):"""發(fā)起支付寶支付"""user_id = g.user_id# 判斷訂單狀態(tài)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="數(shù)據(jù)庫異常")if order is None:return jsonify(errno=RET.NODATA, errmsg="訂單數(shù)據(jù)有誤")# 創(chuàng)建支付寶sdk的工具對象alipay_client = AliPay(appid="2016081600258081",app_notify_url=None, # 默認回調(diào)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)# 手機網(wǎng)站支付,需要跳轉(zhuǎn)到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)# 構(gòu)建讓用戶跳轉(zhuǎn)的支付連接地址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():"""保存訂單支付結(jié)果"""alipay_dict = request.form.to_dict()# 對支付寶的數(shù)據(jù)進行分離 提取出支付寶的簽名參數(shù)sign 和剩下的其他數(shù)據(jù)alipay_sign = alipay_dict.pop("sign")# 創(chuàng)建支付寶sdk的工具對象alipay_client = AliPay(appid="2016081600258081",app_notify_url=None, # 默認回調(diào)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)# 借助工具驗證參數(shù)的合法性# 如果確定參數(shù)是支付寶的,返回True,否則返回falseresult = alipay_client.verify(alipay_dict, alipay_sign)if result:# 修改數(shù)據(jù)庫的訂單狀態(tài)信息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) {// 引導(dǎo)用戶跳轉(zhuǎn)到支付寶連接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">發(fā)表評價</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>

返回頂部

總結(jié)

以上是生活随笔為你收集整理的Flask爱家租房--订单支付(支付过程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 朝桐光一区二区三区 | 在线观看第一页 | 日韩精品中文字幕一区二区三区 | 日本二区三区视频 | www.婷婷.com| 欧美生活一级片 | 可以看污的网站 | 俄罗斯毛片 | 欧美日韩毛片 | 亚洲一级特黄毛片 | 国产性―交一乱―色―情人 | 亚洲免费av在线 | 碰碰97 | 国产精品我不卡 | 麻豆电影网站 | 熟妇女人妻丰满少妇中文字幕 | 久久久久国产一区 | 在线观看日本中文字幕 | 国产aa视频| 欧美一级黄色片 | 日韩香蕉网 | 91精品国产综合久久精品图片 | 日本视频免费看 | 亚洲精品在线电影 | 豆花av| 激情久久av一区av二区av三区 | 91官网在线观看 | 免费一级欧美 | 一区二区三区韩国 | 超碰最新上传 | 欧美你懂得 | 三级黄色av | 日本乱轮视频 | 成人性色生活片 | 国产精品91在线观看 | 一级毛片黄色 | 国产日日夜夜 | aaa黄色片| 国产精品久久久久久久久绿色 | 潘甜甜在线 | 美女隐私免费 | 97人妻一区二区精品免费视频 | 热九九精品 | 久久这里都是精品 | 四虎影库永久在线 | 欧美日韩中文一区 | 麻豆视频一区二区三区 | 911看片 | 免费看黄色的网站 | 亚州av片 | 亚洲精品在线视频观看 | 午夜在线视频免费 | 国产偷怕 | 黄色三级在线视频 | 波多野结衣黄色片 | 欧美一区二区三区婷婷月色 | 亚洲精品香蕉 | 全部毛片永久免费看 | 神马午夜伦| 欧美日本免费 | 欧美一区二区在线免费观看 | 久久久久久影院 | 精品久久久久一区二区 | 亚洲啪啪网站 | 伊人久久久久久久久久久久久 | 国产睡熟迷奷系列精品视频 | 一级黄色在线播放 | 999久久久免费精品国产 | 日本三级黄色录像 | 日韩欧美99| 熟女毛毛多熟妇人妻aⅴ在线毛片 | 丁香六月激情综合 | 中文字幕一区二区三区四区不卡 | 在线免费看av | 无套白嫩进入乌克兰美女 | 五月激情六月丁香 | 日日干日日干 | www.激情| 三级黄网 | 就爱av | 黄wwwww| 欧美久久久久久久 | 婷婷在线观看视频 | 国产91在线看 | 精品久久久视频 | www狠狠操| 美女乱淫 | 国产一区二区高清视频 | 一区二区精品在线观看 | 亚洲一区二区三区在线看 | 日韩av免费一区 | 精品视频无码一区二区三区 | 日本电影大尺度免费观看 | 强开小受嫩苞第一次免费视频 | 四虎影院在线免费播放 | 国产a v一区二区三区 | 亚洲天堂性 | 韩国一区二区在线播放 | 成人免费黄色网 |