合肥网站备案培训教育
这几天涉及到一个个人项目的支付开发场景,正好完成之后,做一下开发记录,给有需要的朋友做一下参考
涉及安装Python环境请参考我专栏中的历史文章,这里不再重复说明
环境:
Python3.11 使用Django框架
因本次代码为沙箱环境,未涉及支付宝当面付的申请,如何有需要,可以评论区告诉我,我会单独写一篇文对申请过程进行说明。
内网穿透工具安装请参考:
代码步骤
1、安装支付宝第三方SDK,我这里没有用官方的,因为代码使用起来比较简洁
pip3 install python-aliyun-sdk
2、生成urls.py文件,代码如下
from django.urls import path
from . import viewsurlpatterns = [path('precreate_payment/', views.precreate_payment, name='precreate_payment'),path('payment_notify/', views.payment_notify, name='payment_notify'),
]
方法说明 :
precreate_payment:支付宝二维码扫码生成,请求地址:$host/precreate_payment/
payment_notify:支付宝导步回调,地址$host/payment_notify/
3、编写视图文件 views.py
from django.shortcuts import render, redirect
from django.conf import settings
from alipay import AliPay
from django.views.decorators.csrf import csrf_exempt
from django.urls import reverse
from django.http import HttpResponseRedirect, HttpResponse, JsonResponse
import random
from datetime import datetime
import json#生成支付宝请求地址,debug为是否开启沙箱
def initialize_alipay():alipay = AliPay(appid=settings.ALIPAY_APPID,app_notify_url=None,app_private_key_string=settings.ALIPAY_APP_PRIVATE_KEY,alipay_public_key_string=settings.ALIPAY_PUBLIC_KEY,sign_type="RSA2",debug=True)return alipay#订单ID生成
def generate_out_trade_no():now = datetime.now()out_trade_no = now.strftime('%Y%m%d%H%M%S')out_trade_no += str(random.randint(1000, 9999))return out_trade_nodef precreate_payment(request):alipay = initialize_alipay()out_trade_no = generate_out_trade_no()result = alipay.api_alipay_trade_precreate(out_trade_no=out_trade_no,total_amount=100.00,subject="Test Order",)if result.get("code") == "10000":qr_code_url = result.get("qr_code")return render(request, 'pay/precreate_payment.html', {'qr_code_url': qr_code_url})else:return HttpResponse("Error in pre-creating transaction: " + result.get("sub_msg"), status=400)@csrf_exempt
def payment_notify(request):body_str = request.body.decode('utf-8')params = dict(request.POST.items())sign = params.pop('sign', None)alipay = initialize_alipay()if alipay.verify(params, sign):print("Alipay notify parameters:", json.dumps(params, indent=4))return JsonResponse({'status': 'success'})return JsonResponse({'status': 'failure'}, status=400)
以上代码中引用了一些三方模块,除了支付宝SDK,还有一些模块如果提示不存在,请自行安装
pyment_notify为支付宝异步回调接口,可以根据你真实环境来进行生成。本地业务可以在
print("Alipay notify parameters:", json.dumps(params, indent=4))
这行进行替换,处理业务逻辑。
4、功能测试
1、访问$host/precreate_payment/,显示你的二维码
2、使用支付宝沙箱APP,登陆进行扫码支付
3、通过控制台查看你的支付宝回调接口,检查服务器是否接收到响应
备注说明:
本来简化了一下本地代理的软件, 结果审核没给过, 想用代理工具的自己参考我之前的ftp搭建工具吧。 或者搜一下内网穿透