alipay接入步骤

沙箱环境

https://openhome.alipay.com/platform/appDaily.htm?tab=info

  

使用

1,配置支付宝公钥到应用
2,配置应用公钥到支付宝
pip install python-alipay-sdk --upgrade # 安装SDK
OpenSSL> genrsa -out app_private_key.pem 2048 # 私钥
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 公钥

 

生成订单

order_number = datetime.now().strftime("%y%m%d%H%M%S") + "%08d" % user.id + "%04d" % random.randint(0, 9999)

  


根据参数信息实例化支付对象

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 = alipay.api_alipay_trade_app_pay(
out_trade_no=recharge_obj.out_trade_number, # 订单号
total_amount=float(recharge_obj.money), # 订单金额
subject=recharge_obj.name, # 订单标题
# 服务端的地址,自定义一个视图函数给alipay "https://example.com/notify"
notify_url=current_app.config.get("ALIPAY_NOTIFY_URL") 
)
# 返回 order_string给前端去发起支付请求

  

处理支付结果

# 同步处理支付结果(前端)
"""
支付宝会给前端支付结果,然后前端告知后端结果!,同时后端也可以去支付宝查询订单之类的操作
"""

  

# 异步处理支付结果(支付宝-POST请求)
data = request.form.to_dict() # 接收支付结果的异步通知数据
# sign 不能参与签名验证
signature = data.pop("sign")
# 根据参数信息实例化支付对象
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) # 可选, 请求超时时间
)
# 检测通知数据
res = alipay.verify(data, signature)
if res 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()
recharge.is_pay = True
user = User.query.get(recharge.user_id)
user.money += recharge.money
db.session.commit()
return "success" # 必须只能是success
else:
return "fail" # 交易失败

  



posted @ 2020-12-30 09:41  bajie_new  阅读(808)  评论(0编辑  收藏  举报