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" # 交易失败