支付宝沙箱支付(Django端)超适合小白哦~
1 支付宝沙箱支付
1.1 准备工作(超级适合小白的整理哦)
1.1.1 登录网站
1) 支付宝开放平台网址
https://openhome.alipay.com/platform/home.htm
2)进入管理中心
3)点击研发服务
1.1.2 支付宝开放平台开发助手安装
1) 安装选项
2) 选择安装位置
1.1.3 查看支付宝网页&移动应用文档
1) 进入文档中心
2) 找到支付API
3) 建立接口实质
- 其实就是路由拼接
1.1.4 生成秘钥
1.1.5 打开密钥文件
1.1.6 点击沙箱应用
1.1.7 点击沙箱应用中的RSA2(SHA256)密钥(推荐) 设置
1.1.8 设置完成
1.1.9 更改txt
(1)将应用私钥改成app_private_key.txt
(2)将应用公钥改成 alipay_public.txt
1.2 安装 alipay-sdk
pip install python-alipay-sdk --upgrade
1.3 具体代码
1.3.1 user/utils.py
def create_trade_no():
d = datetime.datetime.now()
base = 'SYL'
time_str = '%04d%02d%02d%02d%02d%02d' % (d.year, d.month, d.day, d.hour, d.minute, d.second)
rand_num = str(random.randint(10000, 99999))
return base + time_str + rand_num
print(create_trade_no())
1.3.2 settings.py
# 支付宝
ALIPAY_APP_ID = '2016102500758797'
APP_PRIVATE_KEY_STRING = open('{}/utils/alipay_key/app_private_key.txt'.format(BASE_DIR)).read()
ALIPAY_PUBLIC_KEY_STRING = open('{}/utils/alipay_key/alipay_public.txt'.format(BASE_DIR)).read()
ALIPAY_SIGN_TYPE = 'RSA2'
ALIPAY_SUBJECT = '实验楼'
1.3.3 views.py
from alipay import AliPayConfig, AliPay
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_jwt.utils import jwt_decode_handler
from goods.models import Orders
from syl import settings
from django.shortcuts import render
# Create your views here.
from user.utils import create_trade_no
# http://192.168.56.100:8888/goods/getpayurl/
class AliPayView(APIView):
def post(self, request):
alipay = AliPay(
appid=settings.ALIPAY_APP_ID,
app_notify_url=None,
app_private_key_string=settings.APP_PRIVATE_KEY_STRING,
alipay_public_key_string=settings.ALIPAY_PUBLIC_KEY_STRING,
sign_type=settings.ALIPAY_SIGN_TYPE,
debug=True,
config=AliPayConfig(timeout=15)
)
total = request.data.get('total')
token = request.data.get('token')
goods_id = request.data.get('goods_id')
user_info = jwt_decode_handler(token)
print(user_info)
user_id = user_info.get('user_id')
out_trade_no = create_trade_no()
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=out_trade_no,
total_amount=total,
subject=settings.ALIPAY_SUBJECT,
return_url='http://192.168.56.100:8888/goods/peyment/',
# notify_url='http://192.168.56.100:8888/'
)
pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string
dic = {
'order_id': out_trade_no,
'pay_method': 1,
'status': 1,
'total_amount': total,
'goods_id': goods_id,
'user_id': user_id
}
Orders.objects.create(**dic)
return Response(pay_url)
# http://192.168.56.100:8888/goods/peyment/
class PeymentView(APIView):
def get(self, request):
data = request.GET
print(data)
order_obj = Orders.objects.filter(order_id=data['out_trade_no']).first()
order_obj.trade_no = data['trade_no']
order_obj.pay_time = data['timestamp']
order_obj.status = 2
order_obj.save()
return Response(
{'msg':'ok', 'code':200}
)
1.3.4 urls.py
# -*- coding: utf-8 -*-
from django.urls import path
from . import views
urlpatterns = [
path('getpayurl/', views.AliPayView.as_view()),
path('peyment/', views.PeymentView.as_view())
]
1.4 测试订单
1.4.1 网址
http://192.168.56.100:8888/goods/alipay/
1.4.2 测试效果
1.5 测试网址
https://openapi.alipaydev.com/gateway.do?app_id=2016102500758797&biz_content=%7B%22subject%22%3A%22%5Cu5b9e%5Cu9a8c%5Cu697c%22%2C%22out_trade_no%22%3A%22SYL2020110916391588362%22%2C%22total_amount%22%3A%22500%22%2C%22product_code%22%3A%22FAST_INSTANT_TRADE_PAY%22%7D&charset=utf-8&method=alipay.trade.page.pay¬ify_url=http%3A%2F%2F192.168.56.100%3A8888%2F&return_url=http%3A%2F%2F127.0.0.1%3A8808%2F&sign_type=RSA2×tamp=2020-11-09+16%3A39%3A15&version=1.0&sign=gFpOrQibFzpSs95ozR6pTUN3%2Fgh%2FbbTAYo%2FXtQr3fxn91zkdL3c%2BIgCl8xEf0qdDABkCh%2B8sosAlhQmYABleUJH%2FlOC%2BCEAVbkpn2ecHIl%2FIKwlA7IS18rWJ7M7%2FI1i48XjFZe86H5lH6TstKCXZWiRF3i8BebBLyC75h90aef7bh2u15SCfVg1lyCJBKU8HENlSZZRLEmqA27oFmwpax3ZA5Dma56Em8Oc3F2SAqoIFUy4e2OyjxFXsu%2BO3d7qDGIsMnB841Fy3p7OYWlBVt5fECwi%2FVhsuxfDZGUp2hnwh%2FR8u64qAoln7n8SkLz1tRGBzKZe6W3HRkkYNFYpDuw%3D%3D
1.6 效果图
1.6.1 支付页面
1.6.2 支付成功页面
1.6.3 支付沙箱数据
2 后端整体页面展示
2.1 获取token
2.2 获取支付url
2.3 后端生成未支付订单
2.4 扫码支付
2.5 跳转回调页面
2.6 生成已支付订单
2.7 踩坑常在
- 不加签,会出现访问错误情况哦!(应用公钥就是public key)