支付宝签名文档:https://opendocs.alipay.com/open/291/105971#LDsXr
支付宝官方python_SDK:https://pypi.org/project/alipay-sdk-python/
网站&移动应用文档:https://opendocs.alipay.com/open/263/105809
沙箱环境文档:https://opendocs.alipay.com/open/200/105311
流程图:
前端入口:
<a href="https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=申请的id&scope=auth_user&redirect_uri=回调地址&state=盐值">支付宝登录</a>
代码:
import traceback
from alipay.aop.api.request.AlipayUserInfoShareRequest import AlipayUserInfoShareRequest
from alipay.aop.api.response.AlipayUserInfoShareResponse import AlipayUserInfoShareResponse
from Bas import settings
# 应用私钥
app_private_key_string = open("/Users/apple/PycharmProjects/untitled_bas/Bas/app_private_key_string.pem").read()
# 支付宝公钥
ali_public_key_string = open('/Users/apple/PycharmProjects/untitled_bas/Bas/ali_public_key.pem').read()
import logging
from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient
from alipay.aop.api.constant.ParamConstants import *
from alipay.aop.api.response.AlipaySystemOauthTokenResponse import AlipaySystemOauthTokenResponse
from alipay.aop.api.request.AlipaySystemOauthTokenRequest import AlipaySystemOauthTokenRequest
# 日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s',
filemode='a', )
logger = logging.getLogger('')
# 实例化客户端
alipay_client_config = AlipayClientConfig()
alipay_client_config.server_url = 'https://openapi.alipay.com/gateway.do'
# appid
alipay_client_config.app_id = settings.APPID_zfb
# 应用私钥
alipay_client_config.app_private_key = app_private_key_string
# 支付宝公钥
alipay_client_config.alipay_public_key = ali_public_key_string
# 初始化DefaultAlipayClient
client = DefaultAlipayClient(alipay_client_config, logger)
# code换token
def auth_token(auth_code):
request = AlipaySystemOauthTokenRequest()
request.code = auth_code
request.grant_type = "authorization_code"
# 执行API调用,即向支付宝发送请求
try:
#global response_content
response_content = client.execute(request)
except Exception as e:
print(traceback.format_exc(),e)
#response_content = client.execute(request)
if not response_content:
print("failed execute")
else:
response = AlipaySystemOauthTokenResponse()
# 解析响应结果
response.parse_response_content(response_content)
if response.is_success():
# 如果业务成功,可以通过response属性获取需要的值
auth_token = response.access_token
# print("get auth_token:" + response.access_token)
return auth_token
# 响应失败的业务处理
else:
# 如果业务失败,可以从错误码中可以得知错误情况,具体错误码信息可以查看接口文档
print(response.code + "," + response.msg + "," + response.sub_code + "," + response.sub_msg)
# 通过token获取user_info
def user_info(auth_token):
"""
:param auth_token前端点击链接,操作完,支付宝会带参数(auth_code)返回到回调页面
:return:
"""
# 构造请求参数对象 (非必要参数)
#
# model = AlipayEbppInvoiceTitleListGetModel()
# # 取出user_id参数并赋值
# model.user_id = "2088102177492087"
# 接口alipay.user.info.share获取用户信息)
request = AlipayUserInfoShareRequest()
# 初始化一个空字典,用与保存参数
udf_params = dict()
# 添加auth_token到字典 中
udf_params[P_AUTH_TOKEN] = auth_token
# 将udf_params字典参数添加到请求request中,即此时request(biz_model,udf_params)
request.udf_params = udf_params
# 执行API调用
try:
# 执行接口请求()
#global response_content
#发送请求
response_content = client.execute(request)
except Exception as e:
print(traceback.format_exc())
if not response_content:
print("failed execute")
else:
response = AlipayUserInfoShareResponse()
# 解析响应结果
response.parse_response_content(response_content)
# 响应成功的业务处理
if response.is_success():
# 如果业务成功,可以通过response属性获取需要的值
return [response.avatar,response.city,response.gender,response.nick_name,response.province,response.email,response.phone]
# 响应失败的业务处理
else:
# 如果业务失败,可以从错误码中可以得知错误情况,具体错误码信息可以查看接口文档
print(response.code + "," + response.msg + "," + response.sub_code + "," + response.sub_msg)
if __name__ == '__main__':
auth_token = auth_token(auth_code='d16ce5546607450983c9cc6f9beeZF29')
# 获取用户信息
user_infos = user_info(auth_token)
print(user_infos)
#['https://tfs.alipayobjects.com/images/partner/T1j7pDXkhcXXXXXXXX', '深圳市', 'm', 'w b', '广东省', None, None]