支付宝支付实现
简单使用支付宝字符的二次封装支付支付接口源码
支付宝支付实现
采用沙箱环境实现
https://openhome.alipay.com/platform/appDaily.html
下载软件生成支付宝公钥,(也可以用系统默认密钥)
https://opendocs.alipay.com/open/291/106097/
沙箱账号,用来实验 https://open.alipay.com/platform/appDaily.htm?tab=account
沙箱工具中下载相应软件即可
简单使用pip install python-alipay-sdk
from alipay import AliPay
# 个人私钥
app_private_key_string = """-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAgfA3BQ1y8xihyPKKPdXXQ/eOC1gcGvDpFdabp5xXeFk63h/h4V3D6WdfSg+Q59ea2bAfnlg/FRp8jCxMyTzQCBNFbk0FS3u840VHEsaRfziF90wgktZuWvlZ7xSic5vq0tyANtCWl8gawyf9C7gJijj497Xw9Q6PIxusHLYXcdBlHdiRBA3yJekiRGUVBz98qVwFvCp8brPLYBXuAjUhaOWm1kfY3nrLqAUzCtcVhiV7Kf61fhMzXgwzJ7GWcrRe2Bx3Lg7QG5L3RdDmwmpWbd7vqVev4mHqI0HlAJGbaK9/V/xnZO/OUX3cnQ8w5jtiYQTHPlhRihyIbBGv/EYCHwIDAQABAoIBAGJcwJmvi6PgsqAWknWqyjEmVj3aLjRqyFeCxQQFwuVUzs5VXj2nKGYonabHz87hlNRTkivg66gDC+NkqZ/wzB5A0F9mKKryeZOl3t6kuIGQ/UCuPT5K2vE9L0pf2XYgwotq5hgYoNc3YKL5Q4I6h+Y9qKKD9Wrc4ZgXG5wEcAz0OqKLjD/p49ia5z8JeaB5XfbrV1ATeQTWuIISITLb/tM7XdX1n+h3vVHr6LcA8VeUabQQilTjwnhhePqapDy4/HO6VMiuY9S8LEqX1i5wD7IzQIQ0/bLas7jDo6BkeHtGvdEE4ftq+IeuesAigaJZEtgm4w0LUReDBe7c1ZY+UrkCgYEAxHLt3aBBfCJmHt93AtMSR1zcL+onU/00OThC1vGHBbo7abLjb8qOwPgzP0ykjhq35HVl2tcFSkbSOzv1w6fOogD5BaeNeIiTYmr82cYLLl2XrTrlWvoXD1hFebQXA3qw8M6REBpk9AazW9Bj2zz0FWaMTQMeCihznBA9VjaNSlUCgYEAqVPZRVT1FosV6Gwn1eRtM7qJs0K98xnv6SGCqvce86tZ58MPbG0glq7tHfQSMZfo6NjsWoIoqKpjkVOQHNVoUHKlTmPRXj7h/4rB9zAdzCJdbH1KK7WnYNXrIsMtXgyzhHh4QxEoGm8/VkA8DVZfON4++hb9v+cZw1dfUPVa9qMCgYBpnWhouJm8RTol6vou2I+BMllmoTqXmw+Sm77DlIKE/8SlZPmFxp7M/COBKpFlnNO0zbD+4I8FieHI2smccQFUc7Vt5tDWNocWaHKcGi80tDixd3KLYN048LoZXkrpIfMy47t1rtsLnvaarASjf7eyMbnIRZ7G00ykYM65JQb9KQKBgDxrb/a+VunhXULe/OPkq1au9B2j7hWFpsagL3kDzuaRuPXq82D0G5HI/1EV2zwZAYG8jbHKCeoNSpP7pkuzlpJGJlgvY/DmLUw63fVvFOLXTFC+8C1il0QFcO6piFGr5I6bUgZUY+Py2D3Vk9gKftXS79PbSlYkh1vdnGRN+FRTAoGBAKtcF0uJGbg6Is2KkzMlWcSkORpZealm3mTQ1PxNCNyFQlDQFbL7GWXF3zQgfcSIjXjHHdRh+bmP4nKbL8oyqtVgQtpj3l671UVJiCxjDBs3T3TJtVNCBAd6OLAr6D01jwMaEKnZFTZhTXoyQ7HzAxTjK84wMx0m7nYYw2jHT3j7
-----END RSA PRIVATE KEY-----
"""
# 支付宝公钥
alipay_public_key_string = """-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGE2+tkMKpLb4m+aJDxaZHkFTVTkbOAgXfZD594Bl6rPbYQVdHpanNYTA0CG2GgJ7C0qI4YO3T+QiogncZhKmgW6nYPwCEsdug2fkgKDs+9AX/WZJj8BTUiJsEV+ntN8Xu7HpaY6JMIgMb4mJ8rfx++aXQr4xOA8OPtZMLbmLVDmjEr/rjr5UXhy8BYQF3temb4J9qMHC90moiCT0HLKPOelUartasTinyZqGVuefd+rCBA7cX7Y7DMP52YHwXotWWZhjeHl5+fk6XL5X/BYJwbfT/rnGESaLLFSNdxHhvUwltnDSJS6Y+GI94xIRevztdr5UpNE+5z84+Np+eaBjQIDAQAB
-----END PUBLIC KEY-----
"""
alipay = AliPay(
appid="2021000119649792", # appid
app_notify_url='http://127.0.0.1:8000/home/', # the default notify path
app_private_key_string=app_private_key_string,
# alipay public key, do not use your own public key!
alipay_public_key_string=alipay_public_key_string,
sign_type="RSA2", # RSA or RSA2
debug=True # False by default
)
alipay_url = 'https://openapi.alipaydev.com/gateway.do?'
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no="213213", # 订单号不能重复
total_amount=9999, # 价格
subject='充气娃娃', # 商品名称
return_url="https://www.luffycity.com/free-course", # 回调链接.必须是公网域名
notify_url="https://www.luffycity.com/free-course"
)
print(alipay_url + order_string)
# 结果就是支付链接,需要单独开一个浏览器页面打开,不然会报钓鱼链接错误
支付宝字符的二次封装
文件结构
al_pay
-pem
-__init__.py
-pay.py
-setting.py
文件内容
# __init__.py
from .pay import alipay,gateway
# pay.py
from alipay import AliPay
from . import settings
# 个人私钥
app_private_key_string = settings.APP_PRIVATE_KEY_STRING
# 支付宝公钥
alipay_public_key_string = settings.ALIPAY_PUBLIC_KEY_STRING
alipay = AliPay(
appid=settings.APPID, # appid,换上自己的即课
app_notify_url=None, # the default notify path
app_private_key_string=app_private_key_string,
# alipay public key, do not use your own public key!
alipay_public_key_string=alipay_public_key_string,
sign_type=settings.SIGN_TYPE, # RSA or RSA2
debug=settings.DEBUG # False by default
)
gateway=settings.GATEWAY
# setting.py
import os
APPID = 2021000119649792
APP_PRIVATE_KEY_STRING = open(os.path.join(os.path.dirname(__file__), 'pem', 'private_key.pem')).read()
ALIPAY_PUBLIC_KEY_STRING = open(os.path.join(os.path.dirname(__file__), 'pem', 'al_public_key.pem')).read()
SIGN_TYPE = 'RSA2' # 加密方式
DEBUG = True
GATEWAY = 'https://openapi.alipaydev.com/gateway.do?' if DEBUG else 'https://openapi.alipay.com/gateway.do?'
支付支付接口源码
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import CreateModelMixin
from . import models
from . import serializer
from rest_framework.response import Response
from rest_framework_jwt.authentication import JSonWebTokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
# Create your views here.
class PayView(GenericViewSet, CreateModelMixin):
queryset = models.Order.objects.all()
serializer_class = serializer.OrderModelSerializer
# jwt内置的必须配置内置认证类使用
authentication_classes = [JSONWebTokenAuthentication]
permission_classes = [IsAuthenticated]
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data, context={'request': request})
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.context.get('pay_url'))
class SuccessView(APIView):
def get(self, request, *args, **kwargs):
out_trade_on = request.query_params.get('out_trade_on')
order = models.Order.objects.filter(out_trade_on=out_trade_on)
if order.order_status == 1:
return Response(True)
return Response(False)
def post(self, request, *args, **kwargs):
from luffy.libs.al_pay import alipay
from luffy.utils.logger import log
data = request.data
out_trade_no = data.get('out_trade_on', None)
gmt_payment = data.get('gmt_payment', None)
signature = data.pop('sign')
sucess = alipay.verify(data, signature)
if sucess and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):
models.Order.objects.filter(out_trade_no=out_trade_no).update(order_status=1, pay_time=gmt_payment)
log.info('%s订单支付成功' % out_trade_no)
return Response('success')
else:
log.error("%s订单有问题" % out_trade_no)
return Response('error')



