一万块的火腿

# 订单支付页面  支付方式(结账,优惠劵)
前言:支付宝沙箱环境(Beta)是协助开发者进行接口功能开发及主要功能联调的辅助环境。沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑。在开发者应用上线审核前,开发者可以根据自身需求,先在沙箱环境中了解、组合和调试各种开放接口,进行开发调通工作,从而帮助开发者在应用上线审核完成后,能更快速、更顺利的进行线上调试和验收工作。
一、开通支付宝沙箱环境
沙箱环境地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info
访问上面url,支付宝扫码登录,实名认证,根据提示创建应用,生成相应的沙箱应用环境。生成并上传RSA2(SHA256)的应用公钥,详见生成RSA密钥;



### 生成优惠码脚本

###### 生成一个随机的串,用户输入到输入框中,使用优惠卷,价格打折!与库里对比,打折

import random
import string
import pymysql

code = string.ascii_letters + string.digits

def Code():
return ''.join(random.sample(code, 4))

print(Code())

def Mycode(group):
return '-'.join(Code() for i in range(group))

Mycode = Mycode(4)
print(Mycode)


import random
import string
import pymsql

连接数据库

conn=pymysql.connet(host='',user='',password='',db='',charset='utf8')

string.ascii_letters #字符串
string.digits #数字 0-9

定义随机串元素

code=string.ascii_letters + string.digits #(字母+数字)

随机码不能太短,定义获取四位的随机码

def getcode():
return ''.join(random.sample(code,4)) #定义字符 定义字符长度

定义4列4位码

def key(group):
return '-'.join([getcode() for i in range(group)])

print(key(4))
mycode=key(4)

创建游标对象

cursor=conn.cursor()

定义sql语句

sql="insert into 表名 (code,discount) values ('%s',%s)" % (mycode,'0.8')
print(sql) #展示sql语言,看是否完整

入库操作 ,执行sql

cursor.execute(sql)

提交事务

conn.commit()

关闭游标

cursor.close()

关闭数据库连接

conn.close


```p
#优惠卷表
class Codes(models.Model):
	#主键
	id=models.AutoField(primary_key=True)
	#随机码
	code=models.CharField(max_length=100)
	#折扣  每种随机码对应相应的折扣
	discount=models.FloatField()   #打折,浮点
	#是否过期
	status=models.IntegerFiels(default=1)  #默认为一,1为可以使用
	
	#表名
	class Meta:
		db_table='codes'

ok,你会发现我们的优惠卷已经入库了!

#序列化器
class CodesSer(serializer.ModelSerializer):
	class Meta:
		model=model.Code
		fields='__all__'


#优惠卷使用接口
class SingleCode(APIbiew):
	def get(self,request):
		#获取前端用户输入的优惠码
		code=request.GET.get('code')
		#与表中数据进行匹配获取单商品详情
		codes=Codes.objects.filter(code=code).first()
		#序列化
		codes_ser=CoderSer(codes)   #一条数据,所以我们不用加many=True
		
		
		#判断优惠劵使用状态
		如果为一可以使用,当为0时则优惠劵已被使用过!
		if 优惠劵未被使 用 ==0:
			
			优惠劵被使用过,无效 Code码
		else:
			codes.statiss=0 
			codes.save()
		
		
		return HttpResponse(codes_ser.data)
#优惠价:myprice
#原价:price

#前端输入Code码
优惠劵:<input type='text' v-model='discount'/>  
<button @click='usecode'>使用优惠劵</button>  #绑定事件我们把数据传到后代
#实际上订单页面并不会只显示优惠劵的价格,还有商品原价。这样可以给用户视觉上的一个冲击,看优惠了多少!  优惠价 以及原价  当用户没有使用优惠卷的时候我们把优惠价隐藏
<span  v-show='myprice'>优惠价:{{myprice}}<span>

#使用优惠劵
usecode(){
	//调用接口,数据传给后台
	//设置优惠价
	var totalprice=this.totalprice;
	this.myprice= totalprice * 优惠折扣   #优惠价=商品原价*后台返回的折扣
	
	//这有一个判断,当用户在此输入用过的优惠码时,显示当前优惠码已被使用
	if 优惠码使用状态为0时{
		显示该优惠劵已被使用过
		return    #返回,不做任何处理
	}
	
}

所谓的重置按钮就是当你点击事件时把你当前输入的数据反空
<button @click='rest'>重置<button>

rest(){
	this.username =='';
}

订单

订单id 价格 订单用户 订单号

#订单表
class Orders(models.Model):
	#主键
	id=models.AutoField(primary_key=True)
	#订单id 一般来说订单id由时间戳(订单涉及钱财,如果用户订单出错,技术人员通过订单号来判断这是那个具体时间的订单)一般来说,大点的公司会进行分表这样存储, 方便(那张表,那个月份)
	orderid=models.CharField()
	#用户id
	uid=models.IntegerField()
	#价格
	price=models.IntegerField()
	#支付状态
	status=models.IntegerField(default=0)  #0:待支付
	
	class Meta:
		db_table='orders'
import time
import hashlib
#订单入库,当调用这个方法时,即使用时间戳并生成顶单id

class Orders(APIview):
	def get(self,request):
		#接收参数   用户id  价格
		#后台验证签名,验签
		sign=request.GET.get('sign','')
		md5=hashlib.md5()
		#定义加密对象
		sign_str=''  我们在前台生成的md5-js对象  #要与前台加密对象一致
		#转码
		sign_utf8=str(sign_str).encode(encoding='utf-8')
		#加密
		md5.update(sign_utf-8)
		#生成密文
		md5_server=md5.hexdigest()
		print(md5_server)
		#然后我们比对在前端加密和后端的md5加密,如果相同下一步,否则信息已被纂改
		#比对签名
		if 前端加密 != 后台加密:
			订单信息被纂改
		else:
			数据一致,进行订单入库操作
		#订单号是我们自己生成的
		#根据时间戳生成订单号
		
		#进行入库逻辑
		
		
订单号的用处:
	1.方便我们好查
	2.防止订单号重复(使用时间戳)

import time

#定义订单号
def get_order_code():
	#注意 Y:year m:month  d:day  H:小时   M:分钟 S:秒
	order_no=time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
	
	return order_no

支付

初始化订单数据,展示我的订单详情页面、也就是说当我们在购物车中点击去支付的时候展示当前订单信息

前端MD5加密------js-md5
1.概述

是通过前台js加密的方式对密码等私密信息进行加密的工具

2.js加密的好处

(1)用js对私密信息加密可避免在网络中传输明文信息,被人截取数据包而造成数据泄露。
(2)避免缓存中自动缓存密码。比如在使用谷歌浏览器登陆时,输入的用户名和密码会自动缓存,下次登陆时无需输入密码就可以实现登陆,这样就给别人留下漏洞,当别人用你电脑登陆或把input的type改为test 那么你的密码就泄露了.使用js加密时,缓存的加密后的密文,用密文做密码登陆是不成功的,即使泄露也是泄露的密文,对密码不会造成威胁,缺点是每次登陆时都要手动输入密码,较麻烦。
(3)使用js加密,减少了服务器加密时的资源消耗,从理论上提高了服务器的性能。为了安全,很有必要再做服务器端的加密.无论从理论还是实际,两道门比一道门要安全些.至少给攻击者造成了一个障碍。

3.安装使用

(1)安装

npm install js-md5 

(2)main.js中引入

import md5 from 'js-md5';
Vue.prototype.$md5 = md5;

(3)使用

this.$md5("加密内容")
支付签名
进行签名验证(价签) md5-js 不可逆,防止恶意纂改数据,进行入库操作
methods:{
    //结账
    checkout(totalprice){
        //判断是否优惠劵
        if(this.myprice !=0){
            totalprice=this.myprice
        }
        //进行签名验证(价签)
        var sign ='mysign' + 'price='+totalprice;
        sign = md5(sign)
        console.log(sign)
        //使用箭头函数吧参数传过去
    }
}

沙箱应用

网页登陆支付宝--->开发者中心----->沙箱环境----->沙箱应用--->查看appid 应用公钥 私钥等配置信息。

我们用沙箱账号中的买家信息登陆 沙箱版钱包。

支付宝加密RSA 所以我们也用RSA加密和支付宝的所匹配以防纂改信息

pip install cryptography      #这是一个库,加密搞的
支付宝支付接口:一万的火腿
RSA签名验签工具 ---> 非Java使用--->生成public_key 和 private_key. 俩个文件加头尾标识我们用工具生成的公钥与私钥。把商户应用公钥放到应用公钥,公钥上传成功后,会自动生成支付宝公钥,我们把支付宝公钥放到本地的public_key(公钥),私钥不变。
#公钥

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApF51QND1p2rOvjx90zERrkDyRyEvdAzijGyjzch1fHgmrYVWMU9DboyWHKACLutwjSV5etTK90cN6rqs64KzRtWzgarjcUpzXpdxTINpn2KsUXHJQYHaz6tvodNdEIf4OB1PKzmNkMWMlBh0Z+KK5RQlU0yGedXbcGvh1dJqCdqhakppRa+DumIdC6IIgagT/Dz3X6kSw9mdxcn73JyJ6XGCSkifUJUtfX94oXg01L1jmtXPV5HJH/wzLVXVJVuRRmRNug6TssmRwowbsFIAiq9rX/mH1tIWbnc/MEPzJMWeKb//JlNPPXbocAJaH17taDGOF2cyOgTtWomMUxgouQIDAQAB
-----END PUBLIC KEY-----
#私钥
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAxckxbXy+we5P7xFoeEK7DmWPpC2vlpFHUhpS8ZA7omHAx4O0
S6sW+ZijxLUcMKOhCNI78bQQwRkRwwXIEaVl9ob1j1ysCRDXxOmvvMntV6WFoWRe
bJ2suGBwvmaeE+dgdSLdFdCvalVMHWhEJGOv/UbD6uuS3zL6fBPMpr2Tcm7gs/h5
fPA8hBAekYRHP5yZk4+3vh3LZxGVzWZU6AstOdCdXDEtYEx5bbKj035d6Yr9UEHy
FWULy+Jp50a+HyDqNQcCAH3V0Ty+/wYk7H8/Oong4N4V+eZOgBcgYIeQaTkgsfMT
UKOsGZgxJMCu7UT0yDJ0q9DakJqbGxZKdfXrAwIDAQABAoIBAE/hq2HiARVIT+Zp
bH0tzmjJIhOYFBPGxzxkv10q+Lrjqj2qdtYc2qGiQXp//0uxuqdaabV8GUwz+NWA
b0aZO64u4dyt/BmJQOwZyc2A7Kf6hRci93P81rZ81OxBe9TkHTQSCaL27vIOUziJ
VQQxcvHjc9tcm6wj5cDZKk2pwXR0l+tGkThuwb/fwycREZ7YB8lA8gKQ519KgC3T
eTkWepiinl7S00D/plAANnjj6xbn16mQG1/Vx4yXG1CC/xemfpMiOh4BN9urrvqe
etueSKr7we5rBy9IAyxqeXfCTg2FlS7w19/+Y7ToZhWEXuHc4CiaMrI9tu9os51C
TDmer3ECgYEA4/JMKjO1MzEJmhKKA1ye8Qxaw7feVh1pa8rTcY175MWbe5Dt7NFA
EVK37BQUgm3S872UbdkvuVASpiPTvnH3HPClROendIGalOA87qvzSaGYgBOx0gHH
bZNH8fFakd0gIw+s5sfQHdUbFlE1JS79scc8tJVrgAjfrZb2N7zDLrkCgYEA3iCn
cKdEyKJKKT7I0R0SntWZN5ODcOoLNRS7HLiF54/T6/n3JRfHMWpUnI9BHtG9VP0n
2rhS2J3jZi8SokLOxQpEOlfa3ARTDbE2AREJui6AdkLgts7SEkGVx/Dsd3RqSL+0
btrW+38qc1omueV4bDhJy2E4yOb/9s+dGqU1KZsCgYBz81etC/p7XNFuj0mnJiEv
qsIs1sYBdhqfG2BtXbQNDjvmIjX1BggaB8LJEvnP0v/AvsnXCuiM0l96JbVbJeu2
y+6120TCLf8tBdfY7Jzn8ox5cgs9MWx5n7a0KrqQgjQLwbiI+FE0K6gItSxcise/
/AI0NeGmEl19ltIOTjXW+QKBgDbvPHnP5GL6P/0TWfbdic1eZhYolUlHmJ34Eo53
1CYAnBiwKT8zMkA2W9acVy6YEIsEUOb2zwZjhemvmpwmiZyRfW4wbCAdsayhNwns
fMte1MZqo8iSPcHmFnTsUI76a46yWp1P4fsw5/6/PPScm7un8BgsYy7McmFH10LP
uOYhAoGBAJQ8+XlmOxdrmrzWRPfA/FJoDu1OGr8alSKHdkHmKc/r7vmnUXmhDEBl
4IU64GqPCS0gFCoRz/vo0JwcDBvSdMnD0Gj9IgzTyYvzxLRL8G4cAH9EXbp1hjSC
pJpenui4fA7HsFdNJDLRxkg2yONiXFnpK55ylFGyk4NHGqqXmAIU
-----END RSA PRIVATE KEY-----

1577353504404

pip install alipay

import random
import os
from alipay import AliPay
from web.settings import BASE_DIR


appid='2016092600603658'
def Alpay():
    ali = AliPay(
        appid='2016092600603658',
        app_notify_url=None,
        alipay_public_key_path=os.path.join(BASE_DIR,'public_key.txt'),
        app_private_key_path=os.path.join(BASE_DIR,'private_key.txt'),
        debug=True
    )

    data = {
        'subject': '大火腿',
        'out_trade_no': str(random.randint(10000000000,99999999999)),
        'total_amount': str(9999999.99)
    }

    order_str = ali.api_alipay_trade_page_pay(**data)

    request_url = 'https://openapi.alipaydev.com/gateway.do?' + order_str

    print(request_url)

Alpay()

from django.shortcuts import render, redirect, HttpResponse
from utils.pay import AliPay
import time
 
 
def ali():
    # 沙箱环境地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info
    app_id = "2016092400583356"
    # 支付宝收到用户的支付,会向商户(我)发两个请求,一个get请求,一个post请求 - 用于表示支付成功or失败
    # POST请求,用于最后的检测
    notify_url = "http://42.56.89.12:80/page2/"
    # GET请求,用于页面的跳转展示
    return_url = "http://42.56.89.12:80/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,
        return_url=return_url,
        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
        # query_params:对象调用direct_pay
        query_params = alipay.direct_pay(
            subject="TEST商品",  # 商品简单描述
            out_trade_no="x2" + str(time.time()),  # 商户订单号
            total_amount=money,  # 交易金额(单位: 元 保留俩位小数)
        )
        # alipaydev,!!带着dev的都是沙箱环境!!
        pay_url = "https://openapi.alipaydev.com/gateway.do?{}".format(query_params)
        print(pay_url)
        # 朝这个地址发get请求


#定义批量删除逻辑
class Group_Del(View):
    #定义方法
    def post(self,request):
        #接收参数
        ids = request.POST.get("ids")
        #使用eval方法来强转为list
        ids = eval("["+ids+"]")
        #删除操作
        Product.objects.filter(id__in=ids).delete()
        return HttpResponse('ok')

#定义批量操作
class DoEditCart(View):
    #定义post请求
    def post(self,request):
        #获取参数
        id = request.POST.get("id")
        count = request.POST.get("count")

        #读取库存
        # procount = Product.objects.filter(id=int(id)).values("count")
        # print(procount)
        # procount = procount[0]['count']

        #使用get方法
        procount = Product.objects.get(id=int(id))
        procount = procount.count


        print(procount)

        #比对逻辑
        if int(count) > procount:
            return HttpResponse('库存不足')
        
        #获取购物车
        cartlist = request.session.get("cartlist")

        #清除购物车商品
        cartlist_new = filter(lambda n:n!=int(id),cartlist)
        #强转数据类型
        cartlist_new = list(cartlist_new)
        #将购买数量添加到购物车
        for x in range(int(count)):
            cartlist_new.append(int(id))
        
        #将购物车重新赋值
        request.session['cartlist'] = cartlist_new

        return HttpResponse('ok')


#原生sql定义用户详情页
#导入数据库连接方法
from django.db import connection

class UserInfo(View):
    #定义get方法
    def get(self,request):
        #获取用户名
        username = request.COOKIES.get('username')
        #定义游标
        cursor = connection.cursor()
        #execute执行sql语句
        cursor.execute(" select c.name,c.id from user as a left join user2group as b on a.id = b.uid left join usergroup as c on b.gid = c.id where a.username =  '%s' " % username )
        #调用fetchone fetchall
        res = cursor.fetchall()

        #查询普通用户的所有账号
        cursor.execute(" select c.id,c.username from usergroup as a left join user2group as b on a.id = b.gid left join user as c on b.uid = c.id where a.name = '普通用户' ")
        #调用fetchone fetchall
        res_normal = cursor.fetchall()


        #将游标关闭
        cursor.close()

        return render(request,'supermarket/userinfo.html',locals())


posted @ 2021-03-30 17:45  乐乐乐乐乐乐樂  阅读(101)  评论(0)    收藏  举报
jQuery火箭图标返回顶部代码