Python版(3.7.2)支付宝(Alipay)退款(refund)接口的开发

by Liu Yue/2019-05-03

    在之前的文章中介绍了如何编写支付宝支付接口 Python3.7.2+Django2.0.4 美多商城集成最新版支付宝支付接口(2019.04)

    匆忙之中只考虑了支付,其实当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,支付宝将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上。 交易超过约定时间(签约时设置的可退款时间)的订单无法进行退款 支付宝退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。一笔退款失败后重新提交,要采用原来的退款单号。总退款金额不能超过用户实际支付金额。

    那么根据支付宝的官方文档:https://docs.open.alipay.com/api_1/alipay.trade.refund

    扩充一下我们的支付宝支付类就可以了,从文档中可知,out_trade_no(支付订单号),refund_amount(退款金额),这两个参数是必须要传的,所以打开之前写好的pay.py文件,新增退款方法:    

#请求支付宝退款接口
def api_alipay_trade_refund(self, refund_amount, out_trade_no=None, trade_no=None, **kwargs):
        biz_content = {
            "refund_amount": refund_amount
        }
        biz_content.update(**kwargs)
        if out_trade_no:
            biz_content["out_trade_no"] = out_trade_no
        if trade_no:
            biz_content["trade_no"] = trade_no
        data = self.build_body("alipay.trade.refund", biz_content)
        url = self.__gateway + "?" + self.sign_data(data)
        r = requests.get(url)
        html = r.content.decode("utf-8")
        return html
然后在Django的视图方法中加一个退款视图

def refund(request):
    #实例化支付类
    alipay = get_ali_object()
    #调用退款方法
    order_string = alipay.api_alipay_trade_refund(
    #订单号,一定要注意,这是支付成功后返回的唯一订单号
    out_trade_no="20190503214355",
    #退款金额,注意精确到分,不要超过订单支付总金额
    refund_amount="20.00",
    #回调网址
    notify_url='http://localhost:8000/md_admin/alipayreturn'
    )
    return HttpResponse(order_string)
    如果订单号和退款金额正确的话,请求该接口就会返回退款成功的返回值,查看支付宝钱包,相应的退款应该会及时到账

    

      值得一提的是,之前写得支付demo中,订单号的生成并不严谨,直接将time.time()拿来用了,其实应该将日期格式化这样订单号的可读性会增加,这里补上这个函数

#根据日期生成唯一订单号
def get_order_code():
    order_no = str(time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())))
    return order_no