目录
二、基于Django的支付Demo - 非官方,需pycryptodome模块
2-4 本地回调页面 - 处理支付宝回调信息 API官方文档
注意事项
- 沙箱支付测试,移动端只能使用安卓测试
- 只有将项目部署在公网IP上,才能实现支付宝支付后的回调页面
- 注意源码需要使用Crypto模块,默认文件夹小写存在查询不到错误
- 若在支付宝回调页面时,本地服务器宕机,支付宝会在24小时内一段时间发送一次请求,若超过24小时则无效。
- 支付宝支付成功,支付宝返回get回调和post回调,可以基于她来修改订单状态
一、支付宝沙箱
1-1 官网入口
1-2 官方沙箱基础配置
二、基于Django的支付Demo - 非官方,需pycryptodome模块
2-1 页面A 获取支付数额,发送请求到后台
2-2 页面A 执行视图函数
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请求 return redirect(pay_url)
2-3 私钥和公钥配置
2-4 本地回调页面 - 处理支付宝回调信息 API官方文档
def page2(request): alipay = ali() if request.method == "POST": # 检测是否支付成功 # 去请求体中获取所有返回的数据:状态/订单号 from urllib.parse import parse_qs body_str = request.body.decode('utf-8') print(body_str) post_data = parse_qs(body_str) print('支付宝给我的数据:::---------', post_data) post_dict = {} for k, v in post_data.items(): post_dict[k] = v[0] print('转完之后的字典', post_dict) sign = post_dict.pop('sign', None) status = alipay.verify(post_dict, sign) print('POST验证', status) return HttpResponse('POST返回') else: params = request.GET.dict() sign = params.pop('sign', None) status = alipay.verify(params, sign) print('GET验证', status) return HttpResponse('支付成功')
三、实验流程