阿里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('支付失败')    

  

 

posted @ 2018-11-27 15:14  临丶  阅读(399)  评论(1)    收藏  举报