1支付流程
当购物车商品筛选完毕点击结算按键时,跳转到支付宝支付流程
1.1支付宝支付时序流程图
1.2 沙箱模拟
这里支付并不是支付宝真正的交易,而是使用沙箱模拟交易,一般开发的时候,都是可以先去沙箱测试一下,可以去蚂蚁金服开放平台注册一下.使用这个功能首先要登陆,这个功能是免费的
1.2.1查看一下沙箱的基本功能
这里会用到一个知识点 公钥非对称加密
商家与用户的模拟测试
相关知识
公钥非对称加密
这里举个例子,方便理解.
张三和张三朋友,除了平时的交流,还有一种加密的交流方式.
有一天,张三朋友发现张三老婆出轨了,他要把这个信息告诉张三,让张三早做准备,转移财产,抓住相关证据等一系列事情.
于是他就使用张三给他的公钥把要告诉张三的事情进行加密,加密成一串16进制的代码,而这串代码,传输给张三的途中,也可能被其他人截取,但这串代码只有张三用私钥解密,才能知道里面的内容是什么,其他人没有私钥,就算获取了这串代码,也没有办法知道内容
支付宝订单支付相关文章:
https://github.com/fzlee/alipay/blob/master/README.zh-hans.md
与支付宝接口对接
#进入虚拟环境
workon env3
#安装 alipay
pip install python-alipay-sdk --upgrade
1.2.2公私钥的生成
这里生成的公私钥是属于爱鲜蜂这个app的
私钥是爱鲜蜂app自己独有,公钥交给支付宝,
这样相当于起到搭建了一个私密的信息交流的通道的作用
密钥是RSA算法加密,具体可百度一下 RSA
openssl,这是一个开源组织,http通信时加密的协议是由此组织开发的
生成密钥文件
2048是位数
OpenSSL
OpenSSL > genrsa -out app_private_key.pem 2048 #生成私钥
OpenSSL > rsa -in app_private_key.pem -pubout -out app_public_key.pem #导出公钥
OpenSSL > exit
查看一下私钥,私钥以MII开头
-----BEGIN RSA PRIVATE KEY----- #标识开头
-----END RSA PRIVATE KEY----- #标识结尾
导出公钥,
然后把这串公钥配置到支付宝
查看一下支付宝的公钥
把它保存下来
1.2.3 建立单例模型
新建一个文件夹,将保存的支付宝的公钥和爱鲜蜂的私钥,公钥放进去,然后新建一个myalipay.py文件
导入密钥
建立一个alipay的单例对象
这里用的是手机网站支付,因为这个app是手机app.
支付也可以用电脑网页支付,可能会多一些步骤,但都类似,只需要填沙箱账号和密码就行
先打印一下支付链接
1.2.4 测试
运行一下这个myalipay.py文件,先打印一下支付要跳转的链接,测试一下,点击这个链接,
有可能虚拟机内部的火狐浏览器会弹出浏览器版本过低的页面,解决的方法有两个,
升级火狐浏览器,这个有点麻烦,可以自己去操作一下
还有就是把这个链接复制一下,在windows下的浏览器打开,
然后会弹出支付页面,当然这个并不是我们平常使用的支付宝的支付页面,这个只是沙箱的测试而已
这里我们选择支付宝账号密码登陆,使用沙箱的测试的买家账号
去登陆这个账号
选择支付
支付成功,可以查看一下沙箱的测试的两个账户的金额的变动
当支付成功后,会有一个验证通知,参考一下这个github文章
要把这一串data取出来, signature = data.pop(“ sign ”) 是要把签名取出来,用这个签名signature去验证这个data是否是正确的
成功的话会返回success=True,说明能验证这个是支付宝发过来的订单成功的验证通知
这里是同步回调,支付成功后支付宝会发送一个get请求,异步的话是发送post请求,
先去加一个视图函数
如果是异步请求的话,会有一个csrf_token验证,但是现在获取不到,加一个装饰器,去免除csrf_token的上传
支付成功后,支付宝会返回一些参数,data,要把它转成一个字典的形式
然后拿到signature签名
可以用print打印一下data和签名,查看是否正确
然后去验证alipay
导入alipay,用这个签名signature去验证这个data是否是正确的
添加一下url
改一下回调的接口
先查看下ip地址(也可用127.0.0.1)
改一下回调的接口,如果支付不成功,可能出现的原因是订单号重复,可以修改一下,金额可改可不改
,也有可能appid变了,查看一下沙箱
重新运行一下这个文件
把这一串复制到浏览器(我虚拟机的火狐浏览器不能用,用的是外部的浏览器)
输入沙箱账号密码,支付成功后会跳转,
如果不能跳转,可能是测试的协议不支持https协议,
把url改为http协议,
浏览器中把前缀https改为http就行了,可以弹出支付成功四个字
查看一下打印的内容
1.2.5
简单介绍一下 data是一个字典
"trade_no": "2019060122001481341000018029", #支付宝生成的订单号
"out_trade_no": "2012316141645", #自己定义的订单号
"charset": "utf-8", #字符集
"seller_id": "2088102177900470", #卖家id
"version": "1.0", #版本号
"app_id": "2016093000628824", "auth_app_id": "2016093000628824", #沙箱应用的appid
"total_amount": "80.00", #订单总价
"method": "alipay.trade.wap.pay.return", #支付方法
"sign_type": "RSA2", #签名的类型
"timestamp": "2019-06-01 11:43:07", #时间戳
支付宝的签名,
这串签名是根据支付宝私钥加密了data这串字符后生成的,而我们这里有支付宝的公钥,使用公钥验证后,确认这是由支付宝发来的讯息,验证成功,页面返回支付成功,反之,页面返回支付失败
ANDzeIP8hd9XLOMqrKr/O4GtyE6kIPQZmoabAJxnKNB0KRr7QGNXbIYyUfcle0c0/6Kat08G506fIc4joR9tVR9d2i1TEIKrt1GPi/cZSD9p09EI4JFEPqP1hGiycGvTyk3DML88GzSWmxtL345bhwhNq2mvSg3zL4sZxBcNzLwo7RAmViIH/XI5rNH7tq87j7ta3JMEkPpGU3lODxn90teRYV8WVOkFpW+3EjlW3i5onPJEPkEUDyn1vYMK7zCQF6l7U46UiIwPD2fPuaxm8ee/5n1dt2uly7/jR1XmpspxB2lDuX3Ck9WWfFS7QeILKKHwv61jZbbbQhRlVOK7sw==
支付的流程大概是这样,接下来去写一下订单,把订单传到后台