阿里app支付
直接上代码:
第一部分:实例化ali实例
from django.shortcuts import HttpResponse
from alipay import AliPay
from django.shortcuts import HttpResponse
from saleor.order.models import Order
from saleor.order import OrderStatus
import time
import json
notify_url = "http://xxx./return" # 支付成功回掉的地址,在支付宝中设置
def ali():
app_private_key_path = "saleor/pay/ali/keys/pri" #生成的私钥
alipay_public_key_path = "saleor/pay/ali/keys/pub" # 设置支付宝公钥
app_private_key_string = open(app_private_key_path).read()
alipay_public_key_string = open(alipay_public_key_path).read()
app_id = "xxxxxx" # 复制来自支付宝生成的id
alipay = AliPay(
appid=app_id,
app_notify_url=notify_url, # 默认回调url
app_private_key_string=app_private_key_string,
alipay_public_key_string=alipay_public_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
sign_type="RSA2", # RSA 或者 RSA2
debug=False # 默认False
)
return alipay
第二部分:生成orderstring返回个前端
alipay = ali_pay.ali()
order_num = order.id
order_string = alipay.api_alipay_trade_app_pay(
out_trade_no=order_num, # 商户订单号
total_amount=0.01,
subject="测试订单", # 商品简单描述
notify_url=ali_pay.notify_url, # 可选, 不填则使用默认notify url
)
return PayMent(
order_string=order_string
)
第三部分:支付宝异步回调通知
def alipay_back_url(request):
alipay = ali()
if request.method == "POST":
# 检测是否支付成功
# 去请求体中获取所有返回的数据:状态/订单号
from urllib.parse import parse_qs
body_str = request.body.decode('utf-8')
post_data = parse_qs(body_str)
post_dict = {}
for k, v in post_data.items():
post_dict[k] = v[0]
sign = post_dict.pop('sign', None)
success = alipay.verify(post_dict, sign)
order_pk = post_dict.get('out_trade_no')
#验证签名信息
if success and post_dict["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):
order = Order.objects.filter(id=order_pk).first()
payment_obj = Payment.objects.filter(order_id=order_pk)
if payment_obj:
return None
Payment.objects.create( #数据库生成订单信息
variant=CustomPaymentChoices.MANUAL,
status=PaymentStatus.CONFIRMED,
fraud_message='',
transaction_id='',
currency=order.total.currency,
total=order.total.gross.amount,
delivery=order.shipping_price.net.amount,
tax=order.total.tax.amount,
description=pgettext_lazy(
'Payment description', '订单%(order)s') % {
'order': order},
billing_email=order.user_email,
token=str(uuid4()),
captured_amount=order.total.gross.amount,
order_id=order_pk
)
else:
params = request.GET.dict()
sign = params.pop('sign', None)
status = alipay.verify(params, sign)
if status:
return HttpResponse('支付成功')
else:
return HttpResponse('支付失败')
浙公网安备 33010602011771号