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
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