欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

支付宝支付

程序员文章站 2022-03-07 09:17:18
支付宝支付: 使用支付宝支付需要有个商户号,这个商户号必须是企业申请,并且需要企业的营业执照:申请完了会给你个商户号 (一串数字) 沙箱环境(沙箱环境) https://openhome.alipay.com/platform/appDaily.htm?tab=info 点击支付后会向支付宝网关发送 ......

支付宝支付:

使用支付宝支付需要有个商户号,这个商户号必须是企业申请,并且需要企业的营业执照:申请完了会给你个商户号 (一串数字)  

沙箱环境(沙箱环境)

https://openhome.alipay.com/platform/appdaily.htm?tab=info

支付宝支付

点击支付后会向支付宝网关发送请求,应该在网关后面拼接用户支付相关信息,而这个信息需要进行加密才安全

加密方式:

对称加密:加密密钥和解密密钥用的是同一个

非对称加密:加密和解密的密钥不同,公钥可以随意分发,但是私钥一定不能泄露

安装模块:

pip3 install pycryptodome     加密解密模块

支付宝支付流程:

在网页端点击支付宝支付,跳转到支付宝支付页面,扫码支付完成,商家支付宝收到钱,支付宝给当前网页发送一个请求,告诉商家用户已付款成功了,然后商家就可以把订单状态改成已支付。

使用:alipaydemo来配置支付宝支付接口

 

1  拿到商户号,回调地址(支付成功跳转到自己服务器上,get请求(支付成功)和post请求(修改订单)),支付宝公钥,我的私钥---生成一个对象(alipay)

# 给支付宝发请求,信息要用支付宝公钥加密

# 支付宝给我响应信息,信息会用商户的公钥加密,回来之后再拿用户私钥解密

 

2 对象.direct_pay 传支付金额,支付商品描述,支付订单号---返回个加密的串(把前面参数加密了)
3 拿到加密的串拼到get请求参数部分pay_url = "https://openapi.alipaydev.com/gateway.do?{}".format(query_params)
4 重定向到该地址(向该地址发送get请求)
5 用户付款,付款成功支付宝会给我发送两个请求,一个是get请求,一个是post请求
6 咱们的程序需要处理这两个回调请求(请求回来需要验证签名)
 -get请求一般用于页面展示
 -post请求用于修改订单状态
-项目中需要配置:公钥私钥生成方式:https://docs.open.alipay.com/291/105971
-支付宝公钥:商户号中输入的应用公钥,会自动生成一个支付宝公钥,把它粘贴过来
-应用私钥(用户私钥)
-支付宝回调返回数据中会有:
-singn:必须验证签名,验证通过才能进行后续的修改
-订单id
-根据订单id修改订单状态
-如果用户付款了,但是你服务挂掉了?
-如果服务挂掉了,支付宝过一会会自动在回调(24内,隔一段时间就会回调),重启服务器即可

支付宝支付

支付宝支付

from django.shortcuts import render, redirect, httpresponse

from myutils.pay import alipay
import json
import time
def ali():
    # 沙箱环境地址:https://openhome.alipay.com/platform/appdaily.htm?tab=info
    app_id = "2016100100640466"
    # 支付宝收到用户的支付,会向商户发两个请求,一个get请求,一个post请求
    # post请求,用于最后的检测
    notify_url = "http://129.211.26.50/page2/"
    # get请求,用于页面的跳转展示
    return_url = "http://129.211.26.50/page2/"
    # 用户私钥
    merchant_private_key_path = "keys/app_private_2048.txt"
    # 支付宝公钥
    alipay_public_key_path = "keys/alipay_public_2048.txt"
    # 生成一个alipay的对象
    alipay = alipay(
        appid=app_id,   # 商户号
        app_notify_url=notify_url,    # post请求,用于最后的检测
        return_url=return_url,  # get请求,用于页面的跳转展示
        app_private_key_path=merchant_private_key_path,  # 用户私钥
        alipay_public_key_path=alipay_public_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥
        debug=true,  # 默认false,

    )
    return alipay


def page1(request):
    if request.method == "get":

        return render(request, 'page1.html')
    else:
        money = float(request.post.get('money'))
        # 生成一个对象
        alipay = ali()
        # 生成支付的url
        # 对象调用direct_pay
        # 该方法生成一个加密串
        query_params = alipay.direct_pay(
            subject="充气娃娃",  # 商品简单描述
            out_trade_no="x2" + str(time.time()),  # 商户订单号
            total_amount=money,  # 交易金额(单位: 元 保留俩位小数)
        )

        pay_url = "https://openapi.alipaydev.com/gateway.do?{}".format(query_params)
        print(pay_url)
        # 朝这个地址发get请求
        # from django.http import jsonresponse
        # return jsonresponse({'status':100,'url':pay_url})
        return redirect(pay_url)


def page2(request):
    # 支付宝如果收到用户的支付,支付宝会给我的地址发一个post请求,一个get请求
    alipay = ali()
    if request.method == "post":
        # 检测是否支付成功
        # 去请求体中获取所有返回的数据:状态/订单号
        from urllib.parse import parse_qs
        body_str = request.body.decode('utf-8')
        print(body_str)

        post_data = parse_qs(body_str)
        print('支付宝给我的数据:::---------',post_data)
        post_dict = {}
        for k, v in post_data.items():
            post_dict[k] = v[0]
        print('转完之后的字典',post_dict)
        # 做二次验证
        sign = post_dict.pop('sign', none)
        # 通过调用alipay的verify方法去认证
        status = alipay.verify(post_dict, sign)

        print('post验证', status)
        if status:
            # 修改自己订单状态
            pass
        return httpresponse('post返回')

    else:
        params = request.get
        sign = params.pop('sign', none)
        status = alipay.verify(params, sign)
        print('get验证', status)
        return httpresponse('支付成功')

注意:

支付宝支付

支付宝支付

支付宝支付

支付宝支付

支付宝支付

最后将支付宝支付项目文件打包到服务器,解压后运行python3 manage.py runserver 0.0.0.0:8004,端口自己写,启动支付宝支付项目

浏览器输入page1路由进行支付页面,提交跳到二维码支付页面page2,支付扫码成功页面会自动跳转,提示支付成功.