// 将支付宝的参数转发给后端接口,注意从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)) # 支付宝的交易编号
閱讀更多 果動科技 的文章