// 將支付寶的參數轉發給後端接口,注意從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)) # 支付寶的交易編號
閱讀更多 果動科技 的文章