支付宝开发平台登录
https://open.alipay.com/platform/home.htm
沙箱环境是支付宝提供给开发者的虚拟环境,与真实环境是分开的
支付宝开发者文档
- 文档主页:https://openhome.alipay.com/developmentDocument.htm
- 产品介绍:https://docs.open.alipay.com/270
- 快速接入:https://docs.open.alipay.com/270/105899/
- SDK:https://docs.open.alipay.com/270/106291/
- python对接支付宝SDK:https://github.com/fzlee/alipay/blob/master/README.zh-hans.md
- python对接支付宝SDK安装:
pip install python-alipay-sdk --upgrade
- API列表:https://docs.open.alipay.com/270/105900/
接入步骤
1.创建应用
2.配置秘钥
3. 调用接口
4.搭建开发环境
openssl
OpenSSL> genrsa -out app_private_key.pem 2048 # 私钥RSA2
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 导出公钥
OpenSSL> exit
将生成的公钥添加到支付宝中
在应用中创建alipay_public_key.pem文件用来添加支付宝公钥
并创建app_private_key.pem将私钥添加到app_private_key.pem中
PC网站支付流程
官方文档图片:
1.客户端发起支付请求流程(下单)
1.1首先用户发送请求到商户系统,
1.2 商户系统接收用户请求后向支付宝发请请求获取参数
1.3 支付宝返回参数
1.4 商户拼接好参数之后生成访问支付宝的url返回给用户
class PaymentView(APIView):
permission_classes = [IsAuthenticated]
def get(self,request,order_id):
try:
order = OrderInfo.objects.get(order_id=order_id,
user=request.user,
pay_method=OrderInfo.PAY_METHODS_ENUM['ALIPAY'],
status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'],
)
except OrderInfo.DoesNotExist:
return Response({'message': '订单信息有误'}, status=status.HTTP_400_BAD_REQUEST)
# 向支付宝发送请求,获取需要拼接支付网页的数据
alipay_clie = AliPay(
appid=settings.ALIPAY_APPID,
app_notify_url=None, # 默认回调url
app_private_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"),
alipay_public_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
"keys/alipay_public_key.pem"), # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
sign_type="RSA2", # RSA 或者 RSA2
debug=settings.ALIPAY_DEBUG # 默认False
)
order_string = alipay_clie.api_alipay_trade_page_pay(
out_trade_no = order_id,
total_amount = str(order.total_amount),
return_url = 'http://www.xiaoxin.site:8080/pay_success.html',
notify_url=None,
subject = '商城订单%s' % order_id, # 支付页面的订单标题
)
# 拼接支付宝支付页面网址url
alipay_url = settings.ALIPAY_URL + "?" + order_string
# 返回
return Response({'alipay_url': alipay_url})
2.用户登录,进行支付。(无需考虑)
3.用户付款之后,支付宝分为三种方式告知商户
3.1 支付宝通过get请求returnURL将用户重定向到商户页面
3.2 支付宝通过post请求notifyUrl,主动告知商户
3.3 商户通信息过alipay.trade.query主动查看交易状态,支付宝返回交易
以下通过第三种方法演示:
class PaymentStatusView(APIView):
def put(self,request):
# 获取请求参数
alipay_req_data = request.query_params
if not alipay_req_data:
return Response({'message': "缺少参数"}, status=status.HTTP_400_BAD_REQUEST)
alipay_req_dict = alipay_req_data.dict()
signature = alipay_req_dict.pop('sign')
# 向支付宝发起连接请求
alipay_clie = AliPay(
appid=settings.ALIPAY_APPID,
app_notify_url=None, # 默认回调url
app_private_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"),
alipay_public_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
"keys/alipay_public_key.pem"), # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
sign_type="RSA2", # RSA 或者 RSA2
debug=settings.ALIPAY_DEBUG # 默认False
)
# 校验参数
result = alipay_clie.verify(alipay_req_dict,signature)
# 获取订单编号,支付流水号
if result:
# 订单编号
order_id = alipay_req_dict.get('out_trade_no')
# 支付宝支付流水号
trade_id = alipay_req_dict.get('trade_no')
# 保存支付流水号以及订单编号
Payment.objects.create(
order_id=order_id,
trade_id=trade_id
)
# 修改订单状态
OrderInfo.object.filter(order_id=order_id).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])
return Response({'trade_id': trade_id})
else:
return Response({'message': "请求参数有误"}, status=status.HTTP_400_BAD_REQUEST)
成功页面:
搭建开发环境