flask支付寶支付

// 將支付寶的參數轉發給後端接口,注意從url中拿數據的方法

// # 前端怎麼從URL中獲取參數,document.location.search,有問號,去除問號,.substr(1)

function getCookie(name) {

var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");

return r ? r[1] : undefined;

}

var params=documents.location.search.substr(1);

// 注意這個請求是加載完頁面以後就直接發起的

跳轉在頁面的 中

$.ajax({

url:'/api/v1_0/payments',

type:'post',

data:params,

headers:{

'X-CSRFToken':getCookie('csrf_token')

}

})

在自己定義的頁面中,將支付信息傳到後端

@api.route('/payment', methods=['post'])

def save_payment_result():

"""保存支付寶支付結果"""

payment_dict = request.form.to_dict()

if not payment_dict:

return jsonify(errno=RET.PARAMERR, errmsg='參數有誤')

# 構建支付寶工具對象

alipay_client = AliPay(

appid=current_app.config.get('ALIPAY_APPID'),

app_notify_url=None, # 默認支付寶通知的url

app_private_key_string=os.path.join(os.path.dirname(__file__), 'keys/app_private_key.pem'),

alipay_public_key_string=os.path.join(os.path.dirname(__file__), "keys/alipay_public_key.pem"),

# 支付寶的公鑰,驗證支付寶回傳消息使用,不是你自己的公鑰,

sign_type="RSA", # RSA 或者 RSA2

debug=True # 默認False

)

# 用構建的支付寶對象驗證發送過來的信息

sign = payment_dict.pop('sign')

# 判斷參數是否是有支付寶構建的

result = alipay_client.verify(payment_dict, sign)

# 將從字典中彈出的sign, 與字典剩下的鍵值對比較,看sign是否是有字典剩下的鍵值對加密得到的

# 如果返回true,表示校驗成功,參數是有支付寶構造的,否則為假

if result:

order_id = payment_dict.get('out_trade_no') # 我們自己的訂單編號

trade_no = payment_dict.get('trade_no') # 支付寶的交易編號

# 修改數據庫的數據,變更訂單狀態

try:

Order.query.filter(id=order_id).update({'status':'WAIT_COMMENT', 'trade_no': trade_no})

db.session.commit()

except Exception as e:

db.session.rollback()

current_app.logger.error(e)

return jsonify(errno=RET.DBERR, errmsg='記錄支付結果異常')

return jsonify(errno=RET.OK, errmsg='OK')

在訂單表中,添加字段

trade_no = db.column(db.string(128)) # 支付寶的交易編號


分享到:


相關文章: