python对接支付宝支付接口

该项目使用django对接支付宝网站支付接口

前期准备

1. APPID
2. 支付宝公钥-应用公钥-应用私钥
3. 安装支付宝平台python SDK
pip install python-alipay-sdk --upgrade (非官方)

调用支付接口

一般支付流程为:
前端向后端发送一个ajax post请求,携带订单id;

经过一部分的逻辑处理,我们调用支付宝电脑网站支付接口,支付宝根据我们的请求参数 最终返回支付页面的地址。此时,我们得到了支付页面的url,我们需要将它传给前端

from alipay import AliPay
class PayView(View):
    '''订单支付'''
    def post(self,request):
        #当用户点击去付款后,经过前面的判断后,
        # 进入下面的业务处理:使用python sdk调用支付宝的支付接口
        app_private_key_string = '-----BEGIN PRIVATE KEY-----\n' + '你的应用私钥' + '\n-----END PRIVATE KEY-----'
        alipay_public_key_string = '-----BEGIN PUBLIC KEY-----\n' + '你的支付宝公钥' + '\n-----END PUBLIC KEY-----'
        #初始化
        alipay = AliPay(
            appid="2016102500754813", #应用id
            app_notify_url=None,  #默认回调url; 支付宝后台完成支付的时候异步通知到商户的后台服务器的URL地址
            app_private_key_string=app_private_key_string,
            alipay_public_key_string=alipay_public_key_string,
            debug=True
        )
        #调用支付接口,电脑网站支付
        order_string = alipay.api_alipay_trade_page_pay(  # 调用支付宝接口,立刻返回 部分支付页面的url,我们需要引导用户去点击
            subject="测试订单",
            out_trade_no=request.POST.get('order_id',''),
            total_amount=100,
            return_url='https://www.baidu.com',  # 同步访问,支付成功后支付页面要跳转到哪个页面  django网站地址,并会传递参数,告诉网站用户支付的结果
            notify_url=None
        )
        # 支付宝处理完后 最终返回支付页面的地址,我们需要引导用户进入该地址页面
        # 将调用接口返回的url与固定url链接起来,就是完整的支付页面url
        pay_url = "https://openapi.alipaydev.com/gateway.do?" + order_string
        return JsonResponse({
    
    'pay_url':pay_url,'status':"SUCCESS"})

前端ajax得到后端响应 进入对应回调函数,得到支付页面的地址,并跳转到该支付页面;
由于我们是沙箱环境,所以只能通过api_alipay_trade_query接口查询交易结果,所以在跳转语句后还需向服务器发送一个ajax 请求,查询交易结果
在这里插入图片描述

前端代码:

success: function (result, text_status) {
    
      {
    
    # 成功以后的回调 返回字面量对象,描述状态的字符串 #}
                console.log(result, typeof result);
                console.log(text_status);
                if (result['status'] == 'SUCCESS') {
    
    
                    //引导用户到支付页面
                     window.open(result['pay_url']);
                    //浏览器访问 /order/check ,获取支付交易的结果
                    $.post({
    
    % url 'check' %},{
    
    
                        'order_id': order_id,
                'csrfmiddlewaretoken': '{
    
    { csrf_token }}'
                    },function (data) {
    
    
                        if (data["res"] == 1){
    
    
                            alert(data['msg']);
                            window.open('https://www.baidu.com');
{
    
    #                            location.reload();//刷新页面#}
                        }else{
    
    
                            alert(data['msg']);
                        }

                    });

                }
                else {
    
    
                    alert(result['ajax_delete_error_msg']);
                }
            }

在查询交易结果的视图中,我们同样需要初始化;由于用户支付时间不确定,所以我们需要在While中,不间断的请求支付宝查询接口,根据交易状态进行返回或者继续循环

class CheckView(View):
    def post(self,request):
        '''查看订单支付的结果'''
        app_private_key_string = '-----BEGIN PRIVATE KEY-----\n' + '你的用私钥' + '\n-----END PRIVATE KEY-----'
        alipay_public_key_string = '-----BEGIN PUBLIC KEY-----\n' + '你的应用公钥' + '\n-----END PUBLIC KEY-----'
        # 初始化
        alipay = AliPay(
            appid="2016102500754813",  # 应用id
            app_notify_url=None,  # 默认回调url; 支付宝后台完成支付的时候异步通知到商户的后台服务器的URL地址
            app_private_key_string=app_private_key_string,
            alipay_public_key_string=alipay_public_key_string,
            debug=True
        )


        while True:
            # 调用支付宝交易查询接口,返回交易结果 字典类型
            response = alipay.api_alipay_trade_query(
                out_trade_no=request.POST.get('order_id', '')   #订单号,必须是支付了的订单后,与上面的pay订单号一致
            )
            code = response.get('code')
            print(response)
            if code == '10000' and response.get('trade_status') == "TRASW_SUCCESS":
                #支付成功
                return JsonResponse({
    
    'res':1,'msg':'支付成功啦!'})
            elif code=="40004" or code=="10000" and response.get('trade_status') == 'WAIT_BUYER_PAY':
                #等待买家付款
                import time
                time.sleep(5)
                continue
            else:
                #支付出错
                return JsonResponse({
    
    'res':1,'msg':response})


猜你喜欢

转载自blog.csdn.net/qq_36291294/article/details/106449300
今日推荐