import json import requests, os from flask import Flask from flask import render_template, request, Response from alifacepay import AliFacePay from gevent import pywsgi ''' 异步方式使用当面付接口 ''' app = Flask(__name__) print("alipay_server.py is running") def get_key_info(key_file_name): # 获取脚本所在的路径 script_dir = os.path.dirname(os.path.realpath(__file__)) # 构建文件路径 file_path = os.path.join(script_dir, key_file_name) # 检查文件是否存在 if os.path.exists(file_path): return open(file_path).read() else: return open(key_file_name).read() # 基础信息配置 # 只需要三个关键信息 app_id,alipay_public_key,app_private_key sandbox = False if sandbox: app_id = '2016092900626816' alipay_public_key_string = get_key_info("alipay_public_key.txt") else: app_id = '2021004128647975' alipay_public_key_string = get_key_info("alipay_public_key.txt") app_private_key_string = get_key_info("./app_private_key.pem") ali_face_pay = AliFacePay(app_id, app_private_key_string, alipay_public_key_string, None, sandbox) @app.route('/alipay/getcode', methods=['POST']) def pay(): machine_id = request.args.get('mc') out_trade_no = AliFacePay.gen_trade_no(machine_id) goods_name = "GMS测试助手" goods_price = 199 # 生成付款二维码,可以去这里生成qr_code的二维码图片 http://www.liantu.com/ qr_code = ali_face_pay.precreate(out_trade_no, goods_price, goods_name) return {'out_trade_no': out_trade_no, 'qr_code': qr_code} def query_response(): return { "code": "", "trade_status": "" } @app.route('/alipay/query', methods=['POST']) def order_query(): out_trade_no = request.args.get('out_trade_no') machine_id = request.args.get('mc') try: data = ali_face_pay.query(out_trade_no) response = query_response() trade_status = data['trade_status'] response['trade_status'] = trade_status if trade_status == 'TRADE_SUCCESS': response['code'] = '200' result = "" try: results = requests.post("http://127.0.0.1:5001/order?order_no=%s" % out_trade_no).json() result = results['result'] except Exception as e: result = "error" print(e) if result == "failed": print("--->订单号更新") requests.post("http://127.0.0.1:5001/update?order_no=%s&machineID=%s" % (out_trade_no, machine_id)) elif trade_status == 'WAIT_BUYER_PAY': response['code'] = '201' else: response['code'] = '202' except Exception as e: response = query_response() response['trade_status'] = "ERROR" response['code'] = '500' print(e) return Response( json.dumps(response), mimetype='application/json' ) @app.route('/alipay_nofity', methods=['POST']) def alipay_nofity(): data = request.form.to_dict() print(data) if ali_face_pay.verify_params_sign(data): # 通知参数说明 https://docs.open.alipay.com/194/103296#s5 notify_time = data['notify_time'] # 通知发出的时间 notify_type = data['notify_type'] # 通知类型 trade_status = data['trade_status'] # 订单状态 out_trade_no = data['out_trade_no'] # 订单号 buyer_logon_id = data['buyer_logon_id'] # 买家支付宝账号 total_amount = data['total_amount'] # 订单金额 subject = data['subject'] # 订单标题 # 异步通知默认只会收到TRADE_SUCCESS或者TRADE_FINISHED # 沙盒下测试居然收到了WAIT_BUYER_PAY,不过实际环境收不到 if notify_type == 'trade_status_sync': print(trade_status) pay_success = False if trade_status == 'TRADE_SUCCESS' or trade_status == 'TRADE_FINISHED': pay_success = True return Response('success') print('验证签名失败') return '404' server = pywsgi.WSGIServer(('0.0.0.0', 6788), app) server.serve_forever()