Ejemplo n.º 1
0
class Pay:
    def __init__(self):
        if not settings.USE_ALIPAY:
            return
        # NOTE 暂时只支持支付宝
        self.alipay = AliPay(
            app_notify_url="",
            appid=settings.ALIPAY_APP_ID,
            app_private_key_string=settings.ALIPAY_APP_PRIVATE_KEY_STRING,
            alipay_public_key_string=settings.ALIPAY_PUBLIC_KEY_STRING,
        )

    def trade_precreate(self, out_trade_no, total_amount, subject,
                        timeout_express, notify_url):
        return self.alipay.api_alipay_trade_precreate(
            out_trade_no=out_trade_no,
            total_amount=total_amount,
            subject=subject,
            timeout_express=timeout_express,
            notify_url=notify_url,
        )

    def trade_query(self, out_trade_no):
        return self.alipay.api_alipay_trade_query(out_trade_no=out_trade_no)

    def verify(self, data, signature):
        return self.alipay.verify(data=data, signature=signature)
Ejemplo n.º 2
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.º 3
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.º 4
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.º 5
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.º 6
0
# -- coding UTF-8 --
from alipay import AliPay
import qrcode  # 导入模块   
alipay = AliPay(
    appid=2017051207221985,
    app_notify_url=https91vps.club20170526freenom,
    app_private_key_path=app_private_key_path.txt,
    alipay_public_key_path=alipay_public_key_path.txt  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
)
# create an order
result = alipay.api_alipay_trade_precreate(
    subject=test subject,
    out_trade_no=out_trade_no,
    total_amount=10
)
img = qrcode.make(result['qr_code']) # QRCode信息  
img.save(test.png) # 保存图片  
Ejemplo n.º 7
0
    for i in range(600):
        time.sleep(1)
        result = alipayClient.api_alipay_trade_query(out_trade_no=out_trade_no)
        print('订单查询返回值:', result)
        if result.get("trade_status", "") == "TRADE_SUCCESS":
            print('订单已支付!')
            print('订单查询返回值:', result)
            return True
        _time += 2
    return False


if __name__ == '__main__':
    out_trade_no = "562"  # 555 开始
    total_amount = 1.00
    subject = "relive"
    timeout_express = '1m'
    try:
        dict = alipayClient.api_alipay_trade_precreate(
            out_trade_no=out_trade_no,
            total_amount=total_amount,
            subject=subject,
            timeout_express=timeout_express)
    except urllib.error.URLError:
        print('网络已断开')
        exit()
    print(dict)
    print('test')
    get_qr_code(dict['qr_code'])
    query_order(out_trade_no)