flask 支付宝的使用
1. 需要去官方网页里面登录自己的账号
https://open.alipay.com/
2. 登录后需要保存一些数据
- 进入网址之后进行登录=》控制台=》沙箱
- 保存APPID
- 保存公钥&密钥
3. 安装支付宝模块
pip install python-alipay-sdk --upgrade
pip uninstall PyCrypto
pip uninstall PyCryptodome
pip install PyCryptodome
4. 封装支付宝支付方法
- 创建一个keys/private_key.txt写入私钥
-----BEGIN RSA PRIVATE KEY-----
写入保存到的私钥
-----END RSA PRIVATE KEY-----
- 创建一个keys/public_key.txt写入公钥
-----BEGIN PUBLIC KEY-----
写入保存到的公钥
-----END PUBLIC KEY-----
- 创建一个utlis/pay.py写入代码
from datetime import datetime
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from urllib.parse import quote_plus
from urllib.parse import urlparse, parse_qs
from base64 import decodebytes, encodebytes
import jsonclass AliPay(object):"""支付宝支付接口(PC端支付接口)"""def __init__(self, appid, app_notify_url, app_private_key_path,alipay_public_key_path, return_url, debug=False):self.appid = appidself.app_notify_url = app_notify_urlself.app_private_key_path = app_private_key_pathself.app_private_key = Noneself.return_url = return_urlwith open(self.app_private_key_path) as fp:self.app_private_key = RSA.importKey(fp.read())self.alipay_public_key_path = alipay_public_key_pathwith open(self.alipay_public_key_path) as fp:self.alipay_public_key = RSA.importKey(fp.read())if debug is True:self.__gateway = "https://openapi.alipaydev.com/gateway.do"else:self.__gateway = "https://openapi.alipay.com/gateway.do"def direct_pay(self, subject, out_trade_no, total_amount, return_url=None, **kwargs):biz_content = {"subject": subject,"out_trade_no": out_trade_no,"total_amount": total_amount,"product_code": "FAST_INSTANT_TRADE_PAY",# "qr_pay_mode":4}biz_content.update(kwargs)data = self.build_body("alipay.trade.page.pay", biz_content, self.return_url)return self.sign_data(data)def query_pay(self, out_trade_no,return_url=None, **kwargs):biz_content = {"out_trade_no": out_trade_no,# "product_code": "FAST_INSTANT_TRADE_PAY",# "qr_pay_mode":4}biz_content.update(kwargs)data = self.build_body("alipay.trade.query", biz_content, self.return_url)return self.sign_data(data)def build_body(self, method, biz_content, return_url=None):data = {"app_id": self.appid,"method": method,"charset": "utf-8","sign_type": "RSA2","timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),"version": "1.0","biz_content": biz_content}if return_url is not None:data["notify_url"] = self.app_notify_urldata["return_url"] = self.return_urlreturn datadef sign_data(self, data):data.pop("sign", None)# 排序后的字符串unsigned_items = self.ordered_data(data)unsigned_string = "&".join("{0}={1}".format(k, v) for k, v in unsigned_items)sign = self.sign(unsigned_string.encode("utf-8"))# ordered_items = self.ordered_data(data)quoted_string = "&".join("{0}={1}".format(k, quote_plus(v)) for k, v in unsigned_items)# 获得最终的订单信息字符串signed_string = quoted_string + "&sign=" + quote_plus(sign)return signed_stringdef ordered_data(self, data):complex_keys = []for key, value in data.items():if isinstance(value, dict):complex_keys.append(key)# 将字典类型的数据dump出来for key in complex_keys:data[key] = json.dumps(data[key], separators=(',', ':'))return sorted([(k, v) for k, v in data.items()])def sign(self, unsigned_string):# 开始计算签名key = self.app_private_keysigner = PKCS1_v1_5.new(key)signature = signer.sign(SHA256.new(unsigned_string))# base64 编码,转换为unicode表示并移除回车sign = encodebytes(signature).decode("utf8").replace("\n", "")return signdef _verify(self, raw_content, signature):# 开始计算签名key = self.alipay_public_keysigner = PKCS1_v1_5.new(key)digest = SHA256.new()digest.update(raw_content.encode("utf8"))if signer.verify(digest, decodebytes(signature.encode("utf8"))):return Truereturn Falsedef verify(self, data, signature):if "sign_type" in data:sign_type = data.pop("sign_type")# 排序后的字符串unsigned_items = self.ordered_data(data)message = "&".join(u"{}={}".format(k, v) for k, v in unsigned_items)return self._verify(message, signature)
- 封装调用支付方法,下面的app_id需要写入自己保存的APPID
#导入支付基类
from utils.pay import AliPay#初始化阿里支付对象
def get_ali_object():# 沙箱环境地址:https://openhome.alipay.com/platform/appDaily.htm?tab=infoapp_id = "2021000120615296" # APPID (沙箱应用)# 支付完成后,支付偷偷向这里地址发送一个post请求,识别公网IP,如果是 192.168.20.13局域网IP ,支付宝找不到,def page2() 接收不到这个请求notify_url = "http://127.0.0.1:5000/callback"# 支付完成后,跳转的地址。return_url = "http://localhost:8080/"merchant_private_key_path = "./keys/private_key.txt" # 应用私钥alipay_public_key_path = "./keys/public_key.txt" # 支付宝公钥alipay = AliPay(appid=app_id,app_notify_url=notify_url,return_url=return_url,app_private_key_path=merchant_private_key_path,alipay_public_key_path=alipay_public_key_path, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥debug=True, # 默认False,)return alipay
- 去蓝图调用
# 支付宝平台
from utils.procom import get_ali_object@shops_bp.route('/alipay')
def getalipay():alipay = get_ali_object()res = alipay.direct_pay(subject='订单:123456', # 商品描述out_trade_no='66666'), # 用户购买的商品订单号total_amount = 66.6) # 交易金额pay_url = f"https://openapi.alipaydev.com/gateway.do?{res}"# return redirect(pay_url) # 访问是跳转到pay_url页面return jsonify({'code': 200, 'url': pay_url})
- 前端使用window跳转
window.location.href = url
flask 支付宝的使用相关推荐
- alipay支付宝支付的python实现(flask)
1,环境 ubuntu16.04,python3.6, alipay-sdk-python(3.20) 2,安装包 alipay提供了python包,封装了很多api调用.签名验证等功能,直接 pip ...
- python客户端修改session_python中flask的Session设置的方法介绍
本篇文章给大家带来的内容是关于python中flask的Session设置的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 什么是Session? cookie: 客户端浏览 ...
- Flask爱家租房--订单支付(支付过程)
文章目录 0.支付流程 1. 重点总结 2.后端代码 3.前端js 4.前端html 0.支付流程 1. 重点总结 1)用户进入"我的订单"页面,点击"去支付" ...
- flask常用的第三方平台,第三方库,扩展包
Flask的一些第三方平台 小米推送(本来没想用小米的,抵不住前几年小米手机买的好名气大,我就用用试试.这里说一下和其他平台相比的不足点,小米推送目前不支持富文本的但是效率是很不错的.) ShareS ...
- python接入支付宝接口
安装包 # 安装python-alipay-sdk# --upgrade 是你之前安装了pycrypto, 加它是升级, 一次都没安装的用户, 直接pip install python-alipay- ...
- 基于python Flask搭建mockServer服务
前言: 为什么要用mockserver呢!我们自己内部接口需要使用微信,支付宝的支付功能,就需要验证和打钱才能返回固定的成功返回信息,成本太高,我们就可以用MockServer来模拟返回,绕过验证. ...
- p2p银行充值功能模块 支付宝调用
银行充值简介 用户要想要投标的话,那么需要往p2p平台上进行充值 使用支付宝沙箱 调用支付宝充值接口进行测试 用户余额页面展示用户的余额 点击充值调用跳转到银行充值页面 输入密码,密码正确调转到支付宝 ...
- 千锋Flask学习笔记
千锋Flask学习笔记 文章目录 千锋Flask学习笔记 写在前面 1. Flask介绍 2. Views 3. Request 4. Response 5. 会话技术 6. 模型和模板 7. 数据传 ...
- Python基于Flask框架前后端分离实现房屋租赁民宿预订平台
技术环境: PyCharm + Flask + Python2.7或Python3.6 + Redis + mysql 技术简介:采用Python环境和Flask框架实现的一个爱家租房平台,整个项目的 ...
最新文章
- java表达式由什么组成_必知必会之Lambda表达式
- 低功耗无线模块超远距离无线传输实现中继的方法
- c语言程序设计慕课版答案第6章,C语言程序设计答案黄保和编第6章函数.doc
- css tips —— 神奇的max-width,min-width, width覆盖规则
- 2010中国存储创新年会
- 牛客网Java笔试题目
- 亲爱的我拿什么拯救你的木讷?
- 上传截断_文件上传路径截断实例
- JavaScript高级程序设计(第4版)学习随笔【第六章】
- JAVA_Android开发官网
- 【BP数据预测】差分进化算法优化BP神经网络数据预测【含Matlab源码 1315期】
- 简单移动平均线(Simple Moving Average,SMA) 定义及使用
- 4组64节蓄电池内阻/温度/电压一体监测方案
- 高光谱图像可视化增强matlab
- 几款Mac照片编辑软件推荐
- tinkerCAD入门操作(2):移动、旋转和缩放对象
- Problem 2 素数公式
- 呼叫中心系统解决方案
- 非线性ode及在工程中的应用第四次作业更正版
- (30 gadget day 2) 最简单也最复杂的Gadget - YubiKey
热门文章
- 【RPO技巧拓展】————5、RPO攻击初探
- 如何制作u盘pe启动盘?
- OTA前装搭载率逼近50%,哪些供应商正在领跑细分赛道
- 企业微信【加入群聊】群活码十问十答
- 新出炉的 100+ 篇技术热文,在微信热传,别错过哦
- superMap Cesium(超图) ---scene open()用法
- Oracle 使用xtts升级11g-to-19c
- HTML+CSS+JS大作业:网站设计——家具装修公司(12页 bootstrap, 响应式)
- php notice undefined variable,PHP错误提示,Notice: Undefined variable
- 坎坷的微信小程序【笔记】