一万块的火腿
# 订单支付页面 支付方式(结账,优惠劵)
前言:支付宝沙箱环境(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-----
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())

浙公网安备 33010602011771号