# 支付宝支付 ## 支付宝的沙箱环境 - [密钥生成文档](https://opendocs.alipay.com/open/291/105971): 公钥(给别人,方便其他人验证某个信息是否为自己发送) 和私钥(需要自己保存,对信息加密,不能泄露) - 根据文档,生成一对密钥: 公钥和私钥,将 公钥 添加到 支付宝的 [沙箱应用](https://openhome.alipay.com/platform/appDaily.htm)中
- 根据自己的APP公钥,生成的 支付宝公钥,需要 保存本地 > 支付宝接口: 不再自己写接口,而是 使用 `python-alipay-sdk`工具去请求支付宝接口 > > `pip install pyhton-alipay-sdk` ## 支付接口 ### django > 需要将 生成的 私钥 和 根据自己的公钥生成的 支付宝公钥,保存到文件,放到项目中 支付宝公钥(`aliapy_pbulic_key.pem`) ```python -----BEGIN PUBLIC KEY----- xxxx -----END PUBLIC KEY----- ``` 自己的APP私钥 (`app_private_key.pem`) ```python -----BEGIN RSA2 PRIVATE KEY----- xxxx -----END RSA2 PRIVATE KEY----- ``` #### 支付宝的相关方法 > 不需要记。以后参考文档 ```python import os from alipay import AliPay # 配置地址, 为了确定 公钥和私钥的 位置 private_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "key/app_private_key.pem") public_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "key/alipay_public_key.pem") # 获取公私钥字符串 app_private_key_string = open(private_path).read() alipay_public_key_string = open(public_path).read() def get_alipay(): """生成支付宝的客户端""" alipay = AliPay( appid="2016092400585976", # 收款的商家支付宝的 appid app_notify_url=None, # 默认回调url app_private_key_string=app_private_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥 alipay_public_key_string=alipay_public_key_string, sign_type="RSA2", # 加密方式 debug=True, # 上线则改为False , 沙箱True ) return alipay def get_alipay_url(order_id, order_amount, subject, return_url): """ 根据订单信息,生成支付地址 """ # 进行alipay初始化 alipay = get_alipay() # 调用支付接口 # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, # 订单id,需要支付的订单id total_amount=str(order_amount), # 订单总金额 subject=subject, # 付款标题信息 return_url=return_url, # 付款成功回调地址(可以为空, 当前项目,应该回调到Vue页面) notify_url=None # 付款成功后异步通知地址(可以为空) ) pay_url = "https://openapi.alipaydev.com/gateway.do?" + order_string return pay_url # 将这个url复制到浏览器,就会打开支付宝支付页面 ``` #### 视图 - 获取前端发送的订单id - 查询订单id对应的订单信息 - 利用第三方包生成一个支付宝客户端 - 传入订单号、支付金额、回调参数、主题,生成一个支付接口 - 将生成的支付接口返回给Vue ```python class PaymentAPIView(APIView): authentication_classes = [JSONWebTokenAuthentication] permission_classes = [IsAuthenticated] def get(self, request, order_id): # 查询要支付的订单 user = request.user try: order = Order.objects.get(id=order_id, user=user) except Exception as e: return Response({‘msg‘: ‘订单信息错误‘}, status=404) alipay_url = get_alipay_url( order_id=order_id, order_amount=order.amount, subject="美多商城%s" % order_id, # 支付成功,跳转到Vue的支付成功页面 return_url=‘http://127.0.0.1:8080/#/pay_success/‘ ) return Response({‘alipay_url‘: alipay_url}) ``` Vue - 对 支付 按钮,绑定方法 - 在方法中,发送请求,接收响应地址, 也就是支付宝的支付地址 - 跳转到支付宝支付页面 - 等待用户支付成功 ```vue ```
原文:https://www.cnblogs.com/gaogang/p/14680426.html