Ejemplo n.º 1
0
class AlipayF2F:
    def __init__(self):
        from service.util.pay.pay_config import get_config
        config = get_config('支付宝当面付')
        self.APPID = config['APPID']
        self.web_url = get_config('web_url')
        self.app_private_key_string = '-----BEGIN RSA PRIVATE KEY-----\n' + config[
            'app_private_key'] + '\n-----END RSA PRIVATE KEY-----'
        self.alipay_public_key_string = '-----BEGIN PUBLIC KEY-----\n' + config[
            'alipay_public_key'] + '\n-----END PUBLIC KEY-----'
        self.alipay = AliPay(
            appid=self.APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_string=self.app_private_key_string,
            alipay_public_key_string=self.alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=False,  # True后为开发环境,所有走dev接口,正式环境用False
            config=AliPayConfig(timeout=15)  # 可选, 请求超时时间
        )

    def create_order(self, name, out_order_id, total_price):
        # 注意加上开头结尾
        ali_order = self.alipay.api_alipay_trade_precreate(
            subject=name,
            out_trade_no=out_order_id,
            total_amount=total_price,
            notify_url=self.web_url + '/notify/alipay')
        if ali_order['code'] == '10000' and ali_order['msg'] == 'Success':
            return ali_order
        return False

    def check(self, out_order_id):  #这里是上一步主动生成的订单,单独调用
        try:
            res = self.alipay.api_alipay_trade_query(out_trade_no=out_order_id)
            # print(res)
            if res.get("trade_status", "") == "TRADE_SUCCESS":
                return True
        except Exception as e:
            print(e)
            return False
        return False

    def verify(self, data):  #异步通知    这里data=request.from
        try:
            signature = data['sign']
            data.pop('sign')
            return self.alipay.verify(data, signature)  # 结果为一个布尔值
        except Exception as e:
            print(e)
            return False

    def cancle(self, out_order_id):
        try:
            self.alipay.api_alipay_trade_cancel(out_trade_no=out_order_id)
            return True
        except:
            return False
Ejemplo n.º 2
0
def order_pay():
    # 实例化Alipay,并加上alipay需要的一些参数
    alipay = AliPay(
        appid="2016090800465324",
        app_notify_url='http://39.106.96.112',
        app_private_key_path=app.config["app_private_key_path"],
        alipay_public_key_path=app.config["alipay_public_key_path"],
        sign_type="RSA2",
        debug=True,
    )

    # 加上订单的参数
    import ssl
    ssl._create_default_https_context = ssl._create_unverified_context
    n = random.randint(0, 1000000)
    # create an order
    print(n)
    result = alipay.api_alipay_trade_precreate(
        subject="水杯",
        out_trade_no=str(n),
        total_amount=100,
        timeout_express="10m"
    )
    import qrcode
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )
    qr.add_data(result["qr_code"])
    qr.make(fit=True)
    img = qr.make_image()
    img.save(str(n)+'.png')
    print(img)
    # check order status
    paid = False
    for i in range(10):
        # check every 3s, and 10 times in all
        print("now sleep 3s")
        time.sleep(5)
        result = alipay.api_alipay_trade_query(out_trade_no=str(n))
        if result.get("trade_status", "") == "TRADE_SUCCESS":
            paid = True
            print("success")
            break
        print("not paid...")

    # order is not paid in 30s , cancel this order
    if paid is False:
        alipay.api_alipay_trade_cancel(out_trade_no=str(n))
Ejemplo n.º 3
0
class AlipayF2F:
    def __init__(self):
        from service.util.pay.pay_config import get_config
        config = get_config('支付宝当面付')
        self.APPID = config['APPID']
        self.app_private_key_string = '-----BEGIN RSA PRIVATE KEY-----\n' + config[
            'app_private_key'] + '\n-----END RSA PRIVATE KEY-----'
        self.alipay_public_key_string = '-----BEGIN PUBLIC KEY-----\n' + config[
            'alipay_public_key'] + '\n-----END PUBLIC KEY-----'
        self.alipay = AliPay(
            appid=self.APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_string=self.app_private_key_string,
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_string=self.alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=False,  # True后为开发环境,所有走dev接口,正式环境用False
            config=AliPayConfig(timeout=15)  # 可选, 请求超时时间
        )

    def create_order(self, name, out_order_id, total_price):
        # 注意加上开头结尾
        ali_order = self.alipay.api_alipay_trade_precreate(
            subject=name,
            out_trade_no=out_order_id,
            total_amount=total_price,
            notify_url=None)
        return ali_order

    def check(self, out_order_id):  #这里是上一步主动生成的订单,单独调用
        try:
            res = self.alipay.api_alipay_trade_query(out_trade_no=out_order_id)
            # print(res)
            if res.get("trade_status", "") == "TRADE_SUCCESS":
                return True
        except:
            return False
        return False

    def cancle(self, out_order_id):
        try:
            self.alipay.api_alipay_trade_cancel(out_trade_no=out_order_id)
            return True
        except:
            return False
Ejemplo n.º 4
0
class AliPayUtil:  # 支付宝工具类
    def __init__(self, app_private_key_string_, alipay_public_key_string_,
                 helpInfo):
        self.alipay = AliPay(
            appid=APP_ID,
            app_notify_url=None,
            app_private_key_string=app_private_key_string_,
            alipay_public_key_string=alipay_public_key_string_,
            sign_type='RSA2',
            debug=True)
        self.helpInfo = helpInfo

    def preCreateOrder(self, subject: 'order_desc', out_trade_no: int,
                       total_amount: (float, 'eg:0.01')):
        '''    创建预付订单    
        :return None:表示预付订单创建失败  [或]  code_url:二维码url
        '''
        result = self.alipay.api_alipay_trade_precreate(
            subject=subject,  # 商品名
            out_trade_no=out_trade_no,  # 交易订单号,不可重复
            total_amount=total_amount)
        print('返回值:', result)
        msg = result.get('msg')
        if msg == 'Business Failed':
            print('预创建订单失败')
            self.helpInfo.clear()
            self.helpInfo.setText("订单创建失败,5s后窗口关闭")
            return PRECREATE_ORDER_FAIL
        elif msg == 'Success':
            code_url = result.get('qr_code')
            self.get_qr_code(code_url)
            return PRECREATE_ORDER_SUCCESS

    def get_qr_code(self, code_url):
        '''
        生成二维码
        :return None
        '''
        qr = qrcode.QRCode(version=1,
                           error_correction=qrcode.constants.ERROR_CORRECT_H,
                           box_size=10,
                           border=4)
        qr.add_data(code_url)  # 二维码所包含信息
        img = qr.make_image()
        img.save('qr_ali.png')
        print('二维码保存成功')

    def query_order(self, out_trade_no_: int, cancel_time: int and 'secs'):
        '''
        :param out_trade_no: 商户订单号
        :return: None
        '''
        print('预付订单已创建,请在%s秒内扫码支付,过期订单将被取消!' % cancel_time)
        # 检查订单状态
        _time = 0
        global exit_flag
        #print("check flag:", exit_check_thread_flag)
        for i in range(int(cancel_time / 2) + 10):
            if exit_flag == 0:  # 按钮退出时结束线程
                exit_flag = 1
                return self.cancel_order(out_trade_no_, btnControl=True)
            # 每2s检查一次,共检查60次
            time.sleep(2)

            result = self.alipay.api_alipay_trade_query(
                out_trade_no=out_trade_no_)
            if result.get('trade_status', '') == "TRADE_SUCCESS":
                print('订单已支付')
                print('订单查询返回值:', result)
                return PERCHASE_COMPLETEED

            _time += 2
            print('accumulate time:', _time)
            if _time >= cancel_time:
                print('取消订单')
                return self.cancel_order(out_trade_no_, cancel_time)

    def cancel_order(self,
                     out_trade_no_: int,
                     cancel_time=None,
                     btnControl=None):  # 2参数对应不同的调用方式
        '''
        撤销订单
        :param cancel_time: 撤销前的等待时间(若未支付),撤销后在商家中心-交易下的交易状态显示为"关闭"
        :return:
        '''
        result = self.alipay.api_alipay_trade_cancel(
            out_trade_no=out_trade_no_)
        print("取消订单result:", result)
        resp_state = result.get('msg')

        if resp_state == 'Success':
            if cancel_time:
                print("%s秒内未支付订单,订单已被取消!" % cancel_time)
                return PERCHASE_CANCELED
            elif btnControl:
                return PERCHASE_CANCELED_BY_BTN
        else:
            return 0
Ejemplo n.º 5
0
class Alipay():
    def __init__(self):
        if alipay_debug is True:
            self._appid = alipay_div_id
            self._gateway = alipay_dev_url
        else:
            self._appid = alipay_id
            self._gateway = alipay_url

        self._alipay = AliPay(
            appid=self._appid,
            app_notify_url=None,  # 默认回调url
            app_private_key_path=app_private_key_path,
            alipay_public_key_path=app_public_key_path,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=alipay_debug  # 默认False
        )

    def getpaycheckurl(self, sessionkey, out_trade_no, subject, total_amount,
                       retcontent):
        returnurl = '%s/%s' % (app_return_url, sessionkey)
        notify_url = '%s/%s' % (app_notify_url, retcontent)
        order_string = self._alipay.api_alipay_trade_page_pay(
            out_trade_no=out_trade_no,
            total_amount=total_amount,
            subject=subject,
            return_url=returnurl,
            notify_url=notify_url  # 可选, 不填则使用默认notify url
        )
        alipay_request = '%s?%s' % (self._gateway, order_string)
        return alipay_request

    def getpaydeepurl(self, out_trade_no, subject, total_amount, userid, code):
        bodyhash = crypto_helper.get_key(str(total_amount), userid, str(code),
                                         out_trade_no)
        returnurl = '%s%s/%s/%s/%s' % (app_return_url, 'deep', userid, code,
                                       bodyhash)
        notify_url = '%s%s/%s/%s/%s' % (app_notify_url, 'deep', userid, code,
                                        bodyhash)
        order_string = self._alipay.api_alipay_trade_page_pay(
            out_trade_no=out_trade_no,
            total_amount=total_amount,
            subject=subject,
            return_url=returnurl,
            notify_url=notify_url  # 可选, 不填则使用默认notify url
        )
        alipay_request = '%s?%s' % (self._gateway, order_string)
        return alipay_request

    def verifyurl(self, data):
        signature = data.pop("sign")
        success = self._alipay.verify(data, signature)
        return success

    def query(self, out_trade_no):
        result = self._alipay.api_alipay_trade_query(out_trade_no=out_trade_no)
        if result.get("trade_status", "") == "TRADE_SUCCESS":
            return True
        return False

    def refund(self, refund_amount, out_trade_no):
        result = self._alipay.api_alipay_trade_refund(
            refund_amount=refund_amount,
            out_trade_no=out_trade_no,
            trade_no=None,
            out_request_no=out_trade_no)
        if result["code"] == "10000":
            return True
        return False

    def refundquery(self, out_trade_no):
        result = self._alipay.api_alipay_trade_fastpay_refund_query(
            out_request_no=out_trade_no, out_trade_no=out_trade_no)
        if result["code"] == "10000" and 'refund_amount' in result:
            return True
        return False

    def refundallquery(self, out_trade_no):
        result = self._alipay.api_alipay_trade_fastpay_refund_query(
            out_request_no=out_trade_no, out_trade_no=out_trade_no)
        if result["code"] == "10000" and 'refund_amount' in result and result[
                "refund_amount"] == result["total_amount"]:
            return True
        return False

    def tradecancel(self, out_trade_no):
        result = self._alipay.api_alipay_trade_cancel(
            out_trade_no=out_trade_no)
        if result["code"] == "10000":
            return True
        return False