支付宝介绍
-https://open.alipay.com/develop/manage 扫码登录
-网站支付:https://opendocs.alipay.com/open/270/105899
扫码登录自己的支付宝之后
这个是电脑网端的支付宝支付
网端的两种支付方式
第一种是自己在网端输入自己的用户名和密码、
第二种是自己用手机扫码支付
“”"
接入条件
-1 支付宝账号:个人和商户(需要用营业执照申请)
-2 网站:备案过ICP ICP证浙B2-20160559 ---》没有
-国内:所有网站--》通过工信部审核--》上线运营
-域名:购买,按年付费
-云服务器:有公网ip--》所有人都能根据ip访问这个机器
-阿里云买的服务器-->协助你备案--》两周
-3 营业执照,且支付宝账号名称需与营业执照主体一致
# 公司里:公司专门有财务
-1 商户号
-2 私钥
-3 公钥
-4 支付宝公钥
费率
0.6%
“”"
支付宝开发
https://opendocs.alipay.com/open/270/01didh?ref=api 开发流程介绍
“”"
支付流程
用户在我们网站前端---》点下单,立即购买---》向我们后端发起请求---》我们后端要请求支付宝--》支付宝返回给我们一个支付链接---》我们把链接返回给前端---》前端打开链接----》进入支付宝页面---》登录--》付款---》付款成功---》支付宝会两个回调:get post --->咱们后端接收到post回调后-->修改订单状态
关于回调
-用户付款成功,支付宝会有个回调
-get:调用前端---》给用户看
-post:调用后端--》修改订单状态的--》异步通知说明
-对于 PC 网站支付的交易,在用户支付完成之后,支付宝会根据 API 中商家传入的 notify_url,通过 POST 请求的形式将支付结果作为参数通知到商家系统。
-在进行异步通知交互时,如果支付宝收到的应答不是 success ,支付宝会认为通知失败,会通过一定的策略定期重新发起通知。通知的间隔频率为:4m、10m、10m、1h、2h、6h、15h。
我们现在申请不了商户—》开发测试只能用沙箱环境–》后期公司里申请了商户号后
-只需要修改:商户号,公钥,私钥即可
支付宝测试环境:
沙箱环境地址:测试环境—》数据都假的–》流程跟正常一样
-https://open.alipay.com/develop/sandbox/app?is_switch_sandbox=true
“”"
支付测试
支付宝提供了 API 也有SDK
官方的:https://opendocs.alipay.com/common/02n6z6 --》官方文档
# 创建一个文件
from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient
from alipay.aop.api.domain.AlipayTradePagePayModel import AlipayTradePagePayModel
from alipay.aop.api.request.AlipayTradePagePayRequest import AlipayTradePagePayRequest
if __name__ == '__main__':
"""
设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥等,其他配置值可以查看AlipayClientConfig的定义。
"""
alipay_client_config = AlipayClientConfig()
# alipay_client_config.server_url = 'https://openapi.alipay.com/gateway.do' # 真实环境 支付地址
alipay_client_config.server_url = '' # 沙箱环境
alipay_client_config.app_id = '' # 商户appid
# 注意 应用私钥
alipay_client_config.app_private_key = ''
# 阿里公钥
alipay_client_config.alipay_public_key = ''
"""
得到客户端对象。
注意,一个alipay_client_config对象对应一个DefaultAlipayClient,定义DefaultAlipayClient对象后,alipay_client_config不得修改,如果想使用不同的配置,请定义不同的DefaultAlipayClient。
logger参数用于打印日志,不传则不打印,建议传递。
"""
client = DefaultAlipayClient(alipay_client_config=alipay_client_config)
"""
页面接口示例:alipay.trade.page.pay
"""
# 对照接口文档,构造请求对象
model = AlipayTradePagePayModel()
model.out_trade_no = "000010200554"
model.total_amount = 8888
model.subject = "重启娃娃-保密发货" # 商品注释
model.body = "重启娃娃" # 商品名字
model.product_code = "FAST_INSTANT_TRADE_PAY"
request = AlipayTradePagePayRequest(biz_model=model)
# 两个回调地址:get回调 post 回调
request.return_url = 'http://www.baidu.com' # get回调 支付完成之后跳转回的地址
request.notify_url = 'http://www.baidu.com/post' # post 回调 我们看不到
# 得到构造的请求,如果http_method是GET,则是一个带完成请求参数的url,如果http_method是POST,则是一段HTML表单片段
response = client.page_execute(request, http_method="GET")
print("alipay.trade.page.pay response:" + response)
第三方库的sdk
接口加密的两种方式
第一种 :系统默认密钥 只需要配置
# 注意 应用私钥
alipay_client_config.app_private_key = ''
# 阿里公钥
alipay_client_config.alipay_public_key = ''
第二种 :自定义的密钥
"""
如果使用的是自定义密钥的方式
alipay_client_config.app_private_key 这里填写应用公钥
alipay_client_config.alipay_public_key 这里填写支付宝公钥
"""
支付宝软件:生成公钥私钥---》验证签名
下载安装地址:https://opendocs.alipay.com/common/02kipk?pathHash=0d20b438
-使用下载工具 生成应用公钥,应用私钥
-在沙箱环境自定义的密钥中填入应用公钥---》自动生成一个支付宝公钥
-如何有了三个 应用公钥,应用私钥(不要给别人),支付宝公钥
-咱们自己生成的跟支付宝提供给咱们的没有区别,只能用一个
第三方支付宝sdk
from alipay import AliPay, DCAliPay, ISVAliPay
from alipay.utils import AliPayConfig
# 支付宝网页下载的证书不能直接被使用,需要加上头尾
# 你可以在此处找到例子: tests/certs/ali/ali_private_key.pem
# 自己的私钥
app_private_key_string = open("./private_key.pem").read()
# 支付宝的公钥
alipay_public_key_string = open("./public_key_alipay").read()
alipay = AliPay(
appid="9021000134604",
app_notify_url=None, # 默认回调 url
app_private_key_string=app_private_key_string,
# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
alipay_public_key_string=alipay_public_key_string,
sign_type="RSA2", # RSA 或者 RSA2 生成密钥的加密方式
debug=False, # 默认 False
verbose=False, # 输出调试数据
config=AliPayConfig(timeout=15) # 可选,请求超时时间
)
# 电脑网站支付,需要跳转到:https://openapi.alipay.com/gateway.do? + order_string
import uuid
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=uuid.uuid4(), # 订单号
total_amount=8, # 价格
subject='充气娃娃', # 标题
return_url="https://www.baidu.com", # 支付完成回调地址
notify_url="https://www.baidu.com/post" # 可选,不填则使用默认 notify url
)
#
print('https://openapi-sandbox.dl.alipaydev.com/gateway.do' + order_string)
# 在同级目录创建两个文件存放 私钥和公钥
private_key.pem 私钥文件
-----BEGIN RSA PRIVATE KEY-----
# 支付宝的私钥
-----END RSA PRIVATE KEY-----
public_key_alipay 公钥文件
-----BEGIN PUBLIC KEY-----
# 支付宝的公钥
-----END PUBLIC KEY-----
支付宝支付封装
libs
├── iPay # aliapy二次封装包
│ ├── __init__.py # 包文件
│ ├── pem # 公钥私钥文件夹
│ │ ├── alipay_public_key.pem # 支付宝公钥文件
│ │ ├── app_private_key.pem # 应用私钥文件
│ ├── pay.py # 支付文件
└── └── settings.py
pay.py
from alipay import AliPay
from alipay.utils import AliPayConfig
from . import settings
alipay = AliPay(
appid=settings.APP_ID,
app_notify_url=None, # 默认回调 url
app_private_key_string=settings.APP_PRIVATE_KEY_STRING,
# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
alipay_public_key_string=settings.ALIPAY_PUBLIC_KEY_STRING,
sign_type=settings.SIGN, # RSA 或者 RSA2
debug=settings.DEBUG, # 默认 False
verbose=False, # 输出调试数据
config=AliPayConfig(timeout=15) # 可选,请求超时时间
)
settings.py
import os
#### 替换应用私钥 支付宝公钥 和 应用ID即可
# 应用私钥
APP_PRIVATE_KEY_STRING = open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'pem', 'app_private_key.pem')).read()
# 支付宝公钥
ALIPAY_PUBLIC_KEY_STRING = open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'pem', 'alipay_public_key.pem')).read()
# 应用ID
APP_ID = '9021000129694319'
# 加密方式
SIGN = 'RSA2'
# 是否是支付宝测试环境(沙箱环境),如果采用真是支付宝环境,配置False
DEBUG = True
# 支付网关
GATEWAY = 'https://openapi-sandbox.dl.alipaydev.com/gateway.do' if DEBUG else 'https://openapi.alipay.com/gateway.do'
ini.py
from .pay import alipay
from .settings import GATEWAY