发起支付
1. 后端接口设计
请求方式: GET /orders/(?P<order_id>\d+)/payment/
请求参数: 路径参数
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
order_id | str | 是 | 订单编号 |
返回数据: JSON
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
alipay_url | str | 是 | 支付宝支付链接 |
2. 后端实现
在payment/views.py中创建视图
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 = 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.api_alipay_trade_page_pay(
out_trade_no=order_id,
total_amount=str(order.total_amount),
subject="美多商城%s" % order_id,
return_url="http://www.meiduo.site:8080/pay_success.html",
)
# 需要跳转到https://openapi.alipay.com/gateway.do? + order_string
# 拼接链接返回前端
alipay_url = settings.ALIPAY_URL + "?" + order_string
return Response({'alipay_url': alipay_url})
在配置文件中编辑支付宝的配置信息
# 支付宝
ALIPAY_APPID = "2016081600258081"
ALIPAY_URL = "https://openapi.alipaydev.com/gateway.do"
ALIPAY_DEBUG = True
3. 前端实现
在order_success.js中编写
// 去支付
next_operate: function(){
if (this.pay_method == 1) {
location.href = '/index.html';
} else {
// 发起支付
axios.get(this.host+'/orders/'+this.order_id+'/payment/', {
headers: {
'Authorization': 'JWT ' + this.token
},
responseType: 'json'
})
.then(response => {
// 跳转到支付宝支付
location.href = response.data.alipay_url;
})
.catch(error => {
console.log(error.response.data);
})
}
}