django的支付宝支付功能实现

http更改为https

django的支付宝支付功能实现

324阅读 · 0评论 · 2020/04/18发布   前往评论

关于支付宝的使用案例

以我的以前做的为例充值查看为例!首先当然是创建vip的app,然后在用户下设置models,因为我这个功能是vip支付,所以如下:

class Pay(models.Model):
    trade_no=models.CharField(max_length=100)#支付前生成的订单号
    user_id=models.IntegerField()
    pay_date=models.DateTimeField(auto_now_add=True)
    pay_price=models.FloatField()
    pay_state=models.IntegerField(default=0)#-1:支付失败 0:尚未支付 1:支付成功
    out_trade_no=models.CharField(max_length=100)#退单用的订单号

然后就是重中之重的vip功能实现环节了,通过views对支付功能进行实现,同时我这里使用的自己调用写好的模块的方式进行实现

from django.shortcuts import render
import time
from user.models import Pay
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
from tools.alitool import create_paypage_url, check_pay_state
from django.contrib.auth.decorators import login_required  # 必须要的登录请求


# Create your views here.
@login_required
def recharge(request):
    if request.method == "GET":
        out_trade_no = request.GET.get('out_trade_no') #从网址中拿参数
        if out_trade_no:
            pay = Pay.objects.filter(trade_no=out_trade_no)
            if pay:
                pay = pay[0]
                is_ok = check_pay_state(out_trade_no, 10)
                if is_ok:
                    request.user.all_price+=pay.pay_price
                    result = '支付成功'
                    pay.pay_state = 1
                    if request.user.all_price<10:
                        vip=0
                    elif request.user.all_price<100:
                        vip=1
                    elif request.user.all_price<1000:
                        vip=2
                    else:
                        vip=3
                    request.user.vip=vip
                    request.user.save()
                else:
                    result = '支付失败'
                    pay.pay_state = -1
                pay.save()
            else:
                result = '订单号不存在'
        else:
            result = '尚未支付'
    return render(request, 'vip.html', {'result': result})

调用的模块

import time, os
try:
    import qrcode
except ModuleNotFoundError as e:
    raise ModuleNotFoundError('qrcode未安装,请在终端执行pip install qrcode')
try:
    import alipay
except ModuleNotFoundError as e:
    raise ModuleNotFoundError('alipay未安装,请在终端执行pip install python-alipay-sdk')

APPNET = 'https://openapi.alipaydev.com/gateway.do'
RETURN_URL = 'http://127.0.0.1:8000/pay/'
APPID = '************'
APPNET = 'https://openapi.alipaydev.com/gateway.do'
APP_PRIVATE = """-----BEGIN RSA PRIVATE KEY-----
************
-----END RSA PRIVATE KEY-----"""
APP_PUBLIC = "************"
ALI_PUBLIC = """-----BEGIN PUBLIC KEY-----
************
-----END PUBLIC KEY-----"""
def creat_ali():  # 创建ali对象
    ali = alipay.AliPay(
        appid=APPID,
        app_notify_url=None,  # 默认回调url
        app_private_key_string=APP_PRIVATE,
        alipay_public_key_string=ALI_PUBLIC,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
        sign_type="RSA2",  # RSA 或者 RSA2
        debug=True,  # 默认False
    )
    return ali


def create_paypage_url(trade_no, price, subject):  # 生成网页支付地址
    order_string = creat_ali().api_alipay_trade_page_pay(
        out_trade_no=trade_no,
        total_amount=price,
        subject=subject,
        notify_url=None,  # 可选, 不填则使用默认notify url
        return_url=RETURN_URL  # 可选, 不填则使用默认notify url
    )
    pay_url = APPNET + '?' + order_string
    return pay_url



def check_pay_state(trade_no, timeout, qr_code=None):#检测支付状态
    ok = False
    while True:
        time.sleep(1)
        timeout = timeout - 1
        result = creat_ali().api_alipay_trade_query(trade_no)
        # print(result)
        print(f"等待支付还剩{timeout}秒")
        if result.get('trade_status') == 'TRADE_SUCCESS':
            print("支付成功")
            out_trade_no=result['out_trade_no']
            print(trade_no,out_trade_no)
            if qr_code:
                os.remove(qr_code)
            ok = True
            break
        if timeout==0:
            break

def create_qr_code(trade_no, price, subject, dir):#创建二维码链接及图像地址
      pass

def cancel_trade(trade_no, timeout):  # 取消订单
       pass

if __name__ == '__main__':
    trade_no = str(int(time.time()))
    price = 0.01
    subject = "vip充值"
    # url=create_paypage_url(trade_no, price, subject)
    # print(url)
    qrcode = create_qr_code(trade_no, price, subject, '')
    print(qrcode)
    check = check_pay_state(trade_no, 60)

这里有两个函数我没有写出来,希望大家能思考怎么去写实现!,如果实现不会的可以加我qq,我会告知!

将数据保存

@csrf_exempt
def pay_course(request):
    result = {}
    if not request.user.is_authenticated:
        result['code'] = '002'
        result['message'] = '请先登录'
    else:
        price = request.POST.get('price')
        trade_no = str(int(time.time()))
        price = float(price)
        page_url = create_paypage_url(trade_no, price, '电影vip充值')
        result['code'] = '001'
        result['message'] = '生成支付页成功'
        result['page_url'] = page_url
        pay = Pay()
        pay.trade_no = trade_no
        pay.user_id = request.user.id
        pay.pay_price = price
        pay.out_trade_no = ''
        pay.save()

    print(result)
    return JsonResponse(result)

建立url

    path('pay/', vip_views.recharge,name='pay'), 
    path('pay_course/', vip_views.pay_course,name='zf'),

前端展示

{% extends 'index-base.html' %}
{% block index-middle %}
    <div style="text-align: center">
    <h1>充值{{ result }}</h1>
    <input type="radio" name="price" checked value="10">价格:vip1 10元
    <br>
    <input type="radio" name="price" value="100">价格:vip2 100元
    <br>
    <input type="radio" name="price" value="1000">价格:vip3 1000元
    <br>
        <button id="pay" class="layui-btn layui-btn-sm">充值</button>
    </div>
{% endblock %}

{% block my-js-code %}
    <script>
        $(function () {
            $("#pay").click(function () {
                var price = $("input[name='price']:checked").val()
                alert("支付金额" + price)
                $.ajax({
                    url:"{% url 'zf' %}",
                    dataType:"JSON",
                    type:'post',
                    data:{
                        price:price,
                    },
                    success:function (data,status,xhr) {
                        if(status=='success'){
                            if(data['code']=='001'){
                                var page_url=data['page_url']
                                $(location).attr('href',page_url)
                          }
                        }
                    }
                })
            })
        })
    </script>
{% endblock %}

sitting设置

APPID='*********'
APPNET='https://openapi.alipaydev.com/gateway.do'
APP_PRIVATE="****"
APP_PUBLIC="*****"
ALI_PUBLIC="****"



本文作者: 天行者
发布时间: 2020年04月18日 - 11:04
最后更新: 2020年04月18日 - 11:34
转载请保留原文链接及作者


登录 后回复

共有0条评论