-
Notifications
You must be signed in to change notification settings - Fork 378
统一退款函数refund问题 #5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
谢谢, 我在线上测试了网页扫码的退款,目前应该是好的 |
哦,我想可能是我这里出了问题,我使用refund_web_order接口,错误是没有提供验签或证书,我之前的只有一个partnerid,appid是新创建的应用未签约的,也就是我使用refund_web_order接口走的是我新创建应用,按你说的 我的新应用的开发者信息和之前的合作者在支付宝那边是指向同一个信息吗?这个我再去求证一番,不好意思,给你添麻烦啦。 |
老实说我现在并不明白你所描述的问题。但是我可以描述一下我这边的流程:
|
是的,我也是这么做的,然后我贴一下我的代码,你看看是哪里的问题。 class AlipaySetting:
"""
支付宝参数
"""
# 项目名称
SUBJECT = '脑洞平台众筹主题翻译金'
# 网关地址
WAP_GATEWAY = 'https://openapi.alipaydev.com/gateway.do?'
WEB_GATEWAY = 'https://mapi.alipay.com/gateway.do?'
# 商户私钥
PRIVATE_KEY_PATH = os.path.join(FILE_PATH, 'rsa_private_key.pem')
# 支付宝公钥
ALIPAY_PUBLIC_KEY_PATH = os.path.join(FILE_PATH, 'alipay_public_key.pem')
ALIPAY_PUBLIC_KEY_MAPI_PATH = os.path.join(FILE_PATH, 'alipay_public_key_for_
8000
mapi.pem')
# 支付宝分配给开发者的应用ID, 必须
ALIPAY_APP_ID = '2016073000129126'
ALIPAY_PARTNER = '2088611118876511'
# 接口名称 必须, 这里默认阿里支付宝接口的 手机网站支付类接口名
ALIPAY_METHOD = 'alipay.trade.wap.pay'
# 仅支持JSON
ALIPAY_FORMAT = 'JSON'
# 商户请求参数的签名串,详见签名 必须
ALIPAY_SIGN = ''
# 编码,新旧必须, 请求使用的编码格式,如utf-8,gbk,gb2312等
ALIPAY_CHARSET = 'utf-8'
... 同一级目录下的alipay_api.py # -*- coding: utf-8 -*-
"""
Created on 2017-01-10
支付宝接口
@author: Varwey
"""
from alipay_config import AlipaySetting as ali_s
from alipay import AliPay, AliPayException
# 实例化支付宝python sdk
alipay = AliPay(
partner=ali_s.ALIPAY_PARTNER,
web_notify_url=ali_s.ALIPAY_NOTIFY_URL,
web_private_key_path=ali_s.PRIVATE_KEY_PATH,
web_alipay_public_key_path=ali_s.ALIPAY_PUBLIC_KEY_MAPI_PATH # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥
)
def create_web_direct_pay_by_user(out_trade_no, total_amount, subject=None):
"""
用户点击支付宝付款时生产交易链接,这里为web端
:param out_trade_no: 网站订单系统中唯一订单匹配号
:param total_amount: 交易总金额数
:param subject: 描述内容
:return: url string
"""
order_string = alipay.create_web_trade(
out_trade_no=str(out_trade_no),
total_amount=total_amount,
subject=subject or ali_s.SUBJECT,
return_url=ali_s.ALIPAY_RETURN_URL
)
return ali_s.WEB_GATEWAY + order_string
def refund_for_web(out_trade_no, trade_no, refund_amount, refund_reason=None):
"""
用户退款接口,供web端调用
:param out_trade_no: 脑洞众筹参与付款唯一id号
:param trade_no: 众筹参与付款流水号
:param refund_amount: 退款金额,不能大于付款金额
:param refund_reason: 退款原因
:return: bool or 异常
"""
try:
alipay.refund_web_order(out_trade_no=out_trade_no, trade_no=trade_no, refund_amount=str(refund_amount))
except AliPayException as e:
raise e
return True 开始我是这样的,付款并没有问题,但是退款refund_for_web函数 调用alipay.refund_web_order出错了: TypeError
TypeError: argument of type 'NoneType' is not iterable 我检查代码发现,我使用的即使到账,初始并未传入appid,导致退款的接口中self.__appid是None。 于是,我异想天开的在支付宝开放平台申请了一个应用,因为它有appid,将其传入运行,很显然是行不通的于是出现了报错: alipay.exceptions.AliPayException
AliPayException: AliPayException<code:40002, message:无效的AppID参数> 总结:网页版即使到账的退款这里我怎么做才能退款,这里只能走即时转账有密退款吗? |
即时到帐可以使用无密退款,并且用的就是你刚才提到的alipay.refund_web_order(out_trade_no=out_trade_no, trade_no=trade_no, *kwargs)
|
呃,我想说一下,其实我原来的代码是有bug的,刚才合并的你的pull request,然后即时到帐的退款才成功了。你本地代码是不是旧的? |
哦,我的锅...我本地代码更新了,检查了一下,但是我跑的另一个环境是旧代码...捂脸...... |
我尝试调用refund_web_order接口发现报错了,查看代码发现应该是refund函数中数据字典data的 appid key的值为传入的appid,不是默认的self.__appid.