python对接支付宝即时到账

在对接支付宝即时到账支付的时候,还是遇到了一些坑。首先,支付宝没有提供SDK,不过我在github上找到了一个排名比较靠前的SDK,https://github.com/fzlee/alipay/blob/master/README.zh-hans.md。

下面开始说一些踩过的坑洞:

1):设置了app_notify_url才会回调

 刚开始没有设置,怎么也回调不进来,而且这个回调地址要和后台设置的一样。

ali_pay = AliPay(
    appid=settings.ALIPAY_APPID, # 从支付宝后台能获取到
    app_notify_url=settings.ALIPAY_NOTIFY_URL, # 在测试的时候,必须填写该值,否则不能触发回调
    app_private_key_path=os.path.join(settings.CERT_DIR, 'pri'),
    alipay_public_key_path=os.path.join(settings.CERT_DIR, 'pub'), # 注意,这里是支付宝的应用网关
    sign_type='RSA2',
    debug=False) # 在正式环境中,设置为False

2):debug参数设置为false

这个true是给沙盒用的,所以此处设置为true

3):设置支付宝网关

这个坑还是比较大的,不是应用的公钥,重要的事说3遍!!!

4):支付宝异步回调的签名验证问题

其实就一个函数verify解决,但是在django中需要把request对象映射一封到字典。

全部对接代码如下,已经测试通过。

# coding=utf-8

import logging
import os
import random
from copy import deepcopy
from alipay import AliPay
from django.conf import settings
from django.http.response import JsonResponse
from django.shortcuts import redirect

logging.basicConfig(filename='logger.log', level=logging.INFO)

ali_pay = AliPay(
    appid=settings.ALIPAY_APPID, # 从支付宝后台能获取到
    app_notify_url=settings.ALIPAY_NOTIFY_URL, # 在测试的时候,必须填写该值,否则不能触发回调
    app_private_key_path=os.path.join(settings.CERT_DIR, 'pri'),
    alipay_public_key_path=os.path.join(settings.CERT_DIR, 'pub'), # 注意,这里是支付宝的应用网关
    sign_type='RSA2',
    debug=False) # 在正式环境中,设置为False


def alipay_demo(request):
    return_url = request.GET.get('return_url', '') or 'http://www.baidu.com'
    test_oid = str(random.randint(100000000, 999999999))
    order_string = ali_pay.api_alipay_trade_page_pay(
        out_trade_no=test_oid,
        total_amount=0.01,
        subject='天天生鲜购物订单-{}'.format(test_oid),
        return_url=return_url,
    )

    # 生成客户端发起支付的地址和传参
    redirect_url = settings.ALIPAY_URL + '?' + order_string
    return redirect(redirect_url)


def check_pay(request):
    if request.method == 'POST':

        logging.info(request.POST)
        response = request.POST.dict()
        sign = response.pop('sign')

        # 对支付宝过来的请求进行校验
        if not ali_pay.verify(response, sign):
            logging.info('支付失败,验证没通过')
            return JsonResponse({
                'status': 0,
                'msg': '支付失败'
            })

        trade_status = response.get('trade_status')

        # 根据支付状态来判断支付成功否
        if trade_status in ("TRADE_SUCCESS", "TRADE_FINISHED"):
            # 支付成功
            # 返回支付结果
            logging.info('支付成功')
            return JsonResponse({
                'status': 1,
                'msg': '支付成功'
            })
        else:
            logging.info('支付失败')
            return JsonResponse({
                'status': 0,
                'msg': '支付失败'
            })

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

备案号:浙ICP备15006402号-2 备注:博客君在0.049里共执行38个查询, 总共占用内存 5.19MB