django的支付宝支付功能实现
1081阅读 · 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="****"
本文标题:
django的支付宝支付功能实现
本文作者:
天行者
发布时间:
2020年04月18日 - 11:04
最后更新:
2020年04月18日 - 11:34
许可协议:
署名-非商业性使用 4.0 国际许可协议