Flask联调第三方支付模块(支付宝)

支付宝沙箱

支付宝沙箱基础配置

支付宝开放平台
如果从www.alipay.com访问,选择我是开发者。


这里就要涉及到一个密钥的问题RSA加密算法
它是一种非对称性加密算法,由一对密钥组成,一个是公钥,用来加密,可以公开; 一个是私钥,用来解密,必须自己保存,不能公开。

我们可以使用支付宝的开发助手来生成:


到这里我们需要注意到四点
1.应用公钥(public key)需提供给支付宝账号管理者上传到支付宝开放平台。
2.应用私钥(private key)由开发者自己保存,需填写到代码中供签名时使用。
3.生成的私钥需妥善保管,避免遗失,不要泄露。
4.密钥和应用(APPID)一一对应,即开发者需要为名下的每个应用分别设置密钥,且不同应用的密钥不能混用。

当然如果这里看不懂也可以观看支付宝的官方文档
https://opendocs.alipay.com/common/02kipl

创建支付接口

#下载支付宝的SDK  pip install python-alipay-sdk
#导入alipay 
from alipay import AliPay

#初始化alipay
alipay = AliPay(
    appid = '你的支付宝沙箱应用的id',  #
	app_private_key_string = '你的私钥',
	alipay_public_key_string = '支付宝公钥',
	app_notify_url = None, #回调地址
	sign_type = 'RSA2', #签名算法
	debug = True, #请求来到支付宝沙箱
   )

#生成支付地址  成功后会返回一个地址 也就是我们的订单支付地址
order_url = alipay.api_alipay_trade_page_pay(
	subject = '商家收款',    #订单项目名
	out_trade_no = order_id,   #订单号
	total_amount = total_price,   #订单价格
	return_url = '同步通知地址',
	notify_url = '异步通知地址'
	)

打开链接后得到的是这样的一个页面

一个输入金额,如何输入密码付款的页面 ,图片好像违规了显示不出来。

用户名 和 支付密码 在支付宝开发者品台有写
使用买家账号登录。

支付成功后的回调

在订单支付成功之后 我们的页面回到我们设置的同步通知地址(异步的需要内网穿透)
回调的路由里 携带了很多的参数:
在这里插入图片描述
这些参数都是什么(订单号,订单价格,appid,签名)
这里面签名是最重要的 因为签名是决定这个订单是否更改过 是否正常
(签名 把其他所有的参数,按照一定的规则进行加密,其他参数如果修改了那签名就匹配不上了)

  1. 获取所有支付宝开放平台的 post 内容,不包括字节类型参数,如文件、字节流,剔除 sign 字段,剔除值为空的参数;
  2. 按照第一个字符的键值 ASCII 码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值 ASCII 码递增排序,以此类推;
  3. 将排序后的参数与其对应值,组合成 参数=参数值 的格式,并且把这些参数用 & 字符连接起来,此时生成的字符串为待签名字符

下面来进行校验

data = request.args.to_dict()
#获取支付后的回调参数

sign = data.pop('sign')
# pop这一步  是把签名以出栈的方式从data里拿出来 data里就没有sign了
# 这样我们就可以那签名 和参数来进行校验了

rs = alipay.verify(data, sign) #verify alipay自带的的一个校验
# 这一步是验签 按照同样的方式进行加密,与sign的值进行对比
# 如果比对不通过则  说明支付失败 数据被修改了
# 如果比对成功则说明支付成功

校验成功后 支付流程也就结束了