fzlee/alipay

获取用户信息怎么调用

beimusky opened this issue · 9 comments

接口:
https://opendocs.alipay.com/open/02xtla

使用模式3.0:
dc_alipay.server_api(
"alipay.system.oauth.token",
biz_content={
"grant_type": "authorization_code",
"code": '85792b3286284f05b985f8dbb510AX82',
}
)

提示:
alipay.exceptions.AliPayValidationError

res = dc_alipay.server_api(
"alipay.system.oauth.token",
grant_type="authorization_code",
code="85792b3286284f05b985f8dbb510AX82"
)
print(res)
这种关键字传参,也报错

fzlee commented

你是在什么场景下需要调用这个接口?
这个需要使用到ISVAlipay。

如果你现在的开发任务需要使用到这种程度,我建议你看一下这个库的源代码

主要是看一看对数据进行封装的逻辑,不需要看加解密那一部分。

不然后面的开发会很吃力

使用场景,转账到用户支付宝账户
其中可以使用姓名校验方式和用户user_id方式。
经过实际场景发现,让用户自主填写姓名和账号,容错率太低,多个空格或者多个数字都会失败。导致后期处理异常和重复打款以及沟通用户修改账户成本极高。所以需要通过授权方式,直接拿到user_id ,基本不会出错。
源码我看到611行, raw_string = urlopen(url, timeout=self._config.timeout).read().decode()
是这里解析不成功,实际此时支付宝已经返回正常的数据了。
经过测试
我切换到client_api,直接post拼接的地址,业务没问题。一切正常。
但是,这个业务理论上应该是用server_api的

fzlee commented

请使用isvalipay

yixjue commented

@fzlee 我也遇到了类似的问题,我跟 @beimusky 的需求一样,使用模式3.0,并且改用 isvalipay 后也是同样的报错。以下是我的代码及报错提示。

`alipay_obj.server_api('alipay.system.oauth.token', biz_content={'grant_type': 'authorization_code', 'code': 'xxx'})

Traceback (most recent call last):
File "", line 1, in
File "/xxx/lib/python3.9/site-packages/alipay/init.py", line 229, in server_api
return self.verified_sync_response(data, response_type)
File "/xxx/lib/python3.9/site-packages/alipay/init.py", line 613, in verified_sync_response
return self._verify_and_return_sync_response(raw_string, response_type)
File "/xxx/lib/python3.9/site-packages/alipay/init.py", line 595, in _verify_and_return_sync_response
result = response[response_type]
KeyError: 'alipay_system_oauth_token_response'`

yixjue commented

使用场景,转账到用户支付宝账户 其中可以使用姓名校验方式和用户user_id方式。 经过实际场景发现,让用户自主填写姓名和账号,容错率太低,多个空格或者多个数字都会失败。导致后期处理异常和重复打款以及沟通用户修改账户成本极高。所以需要通过授权方式,直接拿到user_id ,基本不会出错。 源码我看到611行, raw_string = urlopen(url, timeout=self._config.timeout).read().decode() 是这里解析不成功,实际此时支付宝已经返回正常的数据了。 经过测试 我切换到client_api,直接post拼接的地址,业务没问题。一切正常。 但是,这个业务理论上应该是用server_api的

@beimusky 你好,“切换到client_api,直接post拼接的地址”请问这个代码是怎么编写的

https://github.com/fzlee/alipay/blob/master/docs/apis.zh-hans.md
使用这种原始的方式,自己拼接请求

url = 'https://openapi.alipay.com/gateway.do?' + dc_alipay.client_api("alipay.user.info.share", **data)
res = requests.post(url).json().get('alipay_user_info_share_response')

yixjue commented

https://github.com/fzlee/alipay/blob/master/docs/apis.zh-hans.md 使用这种原始的方式,自己拼接请求

url = 'https://openapi.alipay.com/gateway.do?' + dc_alipay.client_api("alipay.user.info.share", **data) res = requests.post(url).json().get('alipay_user_info_share_response')

谢谢,这种方式没问题