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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

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

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

文章目錄

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

0.支付流程

1. 重點(diǎn)總結(jié)

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

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

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


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

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


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


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

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

2.后端代碼

pay.py詳細(xì)代碼如下:

# 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ù)庫(kù)異常")if order is None:return jsonify(errno=RET.NODATA, errmsg="訂單數(shù)據(jù)有誤")# 創(chuàng)建支付寶sdk的工具對(duì)象alipay_client = AliPay(appid="2016081600258081",app_notify_url=None, # 默認(rèn)回調(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"), # 支付寶的公鑰,驗(yàn)證支付寶回傳消息使用,不是你自己的公鑰,sign_type="RSA2", # RSA 或者 RSA2debug=True # 默認(rèn)False)# 手機(jī)網(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, # 訂單編號(hào)total_amount=str(order.amount/100.0), # 總金額subject=u"愛(ài)家租房 %s" % order.id, # 訂單標(biāo)題return_url="http://127.0.0.1:5000/payComplete.html", # 返回的連接地址notify_url=None # 可選, 不填則使用默認(rèn)notify url)# 構(gòu)建讓用戶(hù)跳轉(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()# 對(duì)支付寶的數(shù)據(jù)進(jìn)行分離 提取出支付寶的簽名參數(shù)sign 和剩下的其他數(shù)據(jù)alipay_sign = alipay_dict.pop("sign")# 創(chuàng)建支付寶sdk的工具對(duì)象alipay_client = AliPay(appid="2016081600258081",app_notify_url=None, # 默認(rèn)回調(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"),# 支付寶的公鑰,驗(yàn)證支付寶回傳消息使用,不是你自己的公鑰,sign_type="RSA2", # RSA 或者 RSA2debug=True # 默認(rèn)False)# 借助工具驗(yàn)證參數(shù)的合法性# 如果確定參數(shù)是支付寶的,返回True,否則返回falseresult = alipay_client.verify(alipay_dict, alipay_sign)if result:# 修改數(shù)據(jù)庫(kù)的訂單狀態(tài)信息order_id = alipay_dict.get("out_trade_no")trade_no = alipay_dict.get("trade_no") # 支付寶的交易號(hào)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)用戶(hù)跳轉(zhuǎn)到支付寶連接location.href = resp.data.pay_url;}}});});

4.前端html

order.html中部分代碼:

<li order-id={{order.order_id}}><div class="order-title"><h3>訂單編號(hào):{{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ā)表評(píng)價(jià)</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>愛(ài)家-我的訂單</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>愛(ài)家租房&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爱家租房--订单支付(支付过程)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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