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)
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
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))
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
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
# -- 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) # 保存图片
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)