1.APP中支付宝接口的使用(Flask)
1.1准备工作
安装alipay的sdk,集成到flask项目中
pip install python-alipay-sdk --upgrade
切换到应用(如:users)目录下,新建keys文件保存应用的公私钥,以及支付宝的公钥
cd application/apps/users/
mkdir keys
cd keys
openssl
OpenSSL> genrsa -out app_private_key.pem 2048 # 私钥
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 导出公钥
OpenSSL> exit
目录结构如下:
在支付宝开发者平台获取支付宝的公钥,并将应用的私钥保存到支付宝
把支付宝的配置参数在应用中进行相应的保存
# 支付宝配置信息
ALIPAY_APP_ID = "2016091600523592"
ALIPAY_SIGN_TYPE = "RSA2"
ALIPAY_NOTIFY_URL = "https://example.com/notify"
ALIPAY_SANDBOX = True #测试时的沙箱环境,上线后要改为False
1.2业务流程
文字描述:
1.app端点击进行充值,选择充值金额,携带充值金额,向后端发起请求;
2.后端生成一个对应的订单号,并且生成一个状态为未支付的订单记录到数据表当中;创建支付宝的sdk对象,生成支付宝的order_string;将订单号Order_number和order_strin返回给前端;
3.app成功得到后台的响应拿到Order_string,通过支付宝模块对支付宝进行唤醒,进行支付;
4.支付宝将支付结果响应给app;
5.支付宝响应成功支付后,前端携带订单号去后端做同步通知,后端进行修改订单状态为已支付;同时支付宝访问后端的接口进行异步通知,校验支付状态;
创建支付宝sdk对象代码
# 创建支付宝sdk对象
app_private_key_string = open(
os.path.join(current_app.BASE_DIR, "application/apps/users/keys/app_private_key.pem")).read()
alipay_public_key_string = open(
os.path.join(current_app.BASE_DIR, "application/apps/users/keys/alipay_public_key.pem")).read()
alipay = AliPay(
appid=current_app.config.get("ALIPAY_APP_ID"),
app_notify_url=None, # 默认回调url
app_private_key_string=app_private_key_string,
alipay_public_key_string=alipay_public_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
sign_type=current_app.config.get("ALIPAY_SIGN_TYPE"),
debug=False, # 默认False
config=AliPayConfig(timeout=15) # 可选, 请求超时时间
)
# 根据订单信息生成order_string
order_string=alipay.api_alipay_trade_app_pay(
out_trade_no=recharge.out_trade_number, #订单号
total_amount=float(recharge.money), #订单金额
subject=recharge.name, # 订单标题
notify_url=current_app.config.get("ALIPAY_NOTIFY_URL") # 服务端的地址,自定义一个视图函数给alipay
)
#异步通知的校验
data = request.form.to_dict()
# sign 不能参与签名验证
signature = data.pop("sign")
success = alipay.verify(data,signature)
if success and data["trade_status"] in ("TRADE_SUCCESS","TRADE_FINISHED"):
'''充值成功'''
out_trade_number = data["out_trade_no"]
recharge=Recharge.query.filter(Recharge.out_trade_number==out_trade_number).first()
if recharge is None:
return "fail"
recharge.status=True
user=User.query.get(recharge.user_id)
if user is None:
return "fail"
user.money+=recharge.money
db.session.commit()
return "success" # 必须只能是success
2.web项目中支付宝接口(Django)
2.1准备工作
安装alipay的sdk,集成到flask项目中
pip install python-alipay-sdk --upgrade
切换到应用(如:users)目录下,新建keys文件保存应用的公私钥,以及支付宝的公钥
cd application/apps/users/
mkdir keys
cd keys
openssl
OpenSSL> genrsa -out app_private_key.pem 2048 # 私钥
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 导出公钥
OpenSSL> exit
目录结构如下:
在支付宝开发者平台获取支付宝的公钥,并将应用的私钥保存到支付宝
把支付宝的配置参数在应用中进行相应的保存
# 支付宝配置信息
ALIAPY_CONFIG = {
# "gateway_url": "https://openapi.alipay.com/gateway.do?", # 真实支付宝网关地址
"gateway_url": "https://openapi.alipaydev.com/gateway.do?", # 沙箱支付宝网关地址
"appid": "2016110100783773", # 沙箱中那个应用id
"app_notify_url": None,
"app_private_key_path": os.path.join(BASE_DIR, "apps/payments/keys/app_private_key.pem"),
"alipay_public_key_path": os.path.join(BASE_DIR, "apps/payments/keys/alipay_public_key.pem"),
"sign_type": "RSA2",
"debug": False,
"return_url": "http://www.lfcity.com:8080/payment/result", # 同步回调地址
"notify_url": "http://www.lfapi.com:8001/payment/result", # 异步结果通知
}