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)) # 支付宝的交易编号


分享到:


相關文章: