趁着刚把支付宝功能完工,这里我来总结一下。前端
名称 | 类型 | 描述 |
---|---|---|
user_id | integer | 用户ID |
payment_no | string | 支付单号(支付的时候生成一个惟一的支付单号) |
transaction_no | string | 流水号(支付宝返回的惟一流水号) |
status | string | 支付状态('sucess'成功, 'fail'失败,default:'initial'未支付) |
total_money | decimal | 支付总金额 |
payment_at | datetime | 付款时间 |
raw_response | text | 支付宝返回的原始数据结果集 |
名称 | 类型 | 描述 |
---|---|---|
payment_id | integer | 对应的支付记录id |
status | string | 订单状态(是不是付款成功,default:'initial'未支付) |
pay_options = { "service" => 'create_direct_pay_by_user', "partner" => ENV['ALIPAY_PID'], "seller_id" => ENV['ALIPAY_PID'], "payment_type" => "1", "notify_url" => ENV['ALIPAY_NOTIFY_URL'], "return_url" => ENV['ALIPAY_RETURN_URL'], "anti_phishing_key" => "", "exter_invoke_ip" => "", "out_trade_no" => payment.payment_no, "subject" => "xx商品购买", "total_fee" => payment.total_money, "body" => "xx商品购买", "_input_charset" => "utf-8", "sign_type" => 'MD5', "sign" => "" }
老版的时候写的demo是进行md5进行加密,比较简单,在新版中,须要采用RSA密钥。数据库
支付宝需求和原理:express
RSA密钥验签流程: 支付宝会要求咱们本身生成RSA的公钥和私钥,而后开发平台支付宝也会生成的一对这样的密钥,咱们本身生成的和支付宝生成的须要交换彼此的公钥,咱们利用本身生成的密钥对数据进行加密,而后拿到支付平台生成的公钥,再对彼此的私钥进行验证。json
实现步骤:api
给前端返回(加密后):微信
app_id=2020012345678&method=alipay.trade.page.pay&charset=utf-8&version=1.0×tamp=2017-12-06+16%3A54%3A14¬ify_url=http%3A%2F%2Fmallbear.com%2Fapi%2Fmobile%2Ftrades%2F4952%2Falipay_return&sign_type=RSA&biz_content=%7B%22out_trade_no%22%3D%3E%2220171206115444TNCWK%22%2C+%22subject%22%3D%3E%2220171206115444TNCWK%22%2C+%22timeout_express%22%3D%3E%2224h%22%2C+%22total_amount%22%3D%3E227.0%2C+%22product_code%22%3D%3E%22QUICK_MSECURITY_PAY%22%7D&sign=wSLRgh%2BRcHUYA4FIeOm73TRvvqsK%2F6TApMNjgJ3uqqo%2BMK%2BLIjIpqulSE5kIJ7%2BWLScGh9M9N8NmK3dD4BAlWnfaSai2H1Rgsb8eSD%2By1g5BRhnRIt6MlNkKwucEUnlKO1kR5rsZAEAVoowxOqT1HFUvrJLsr%2BeOJp6dnEeyfo8%3D
实际操做中须要注意的点总结: 1. 在构建支付宝请求参数的时候,须要先把biz_content转换成json格式,而后把请求参数进行加密提交,把支付宝返回的参数中的签名和(本地的公钥+支付宝返回的参数)生成的签名进行校验比对 2. 验签的时候,用的是支付宝提供的公钥,每64个字符要换行 3. 获取请求参数的时候去掉无用的参数app
params.except(*request.path_parameters.keys)