
# 支付宝支付 ## 支付宝的沙箱环境 - [密钥生成文档](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