全部订单查询

parent 06492812
......@@ -14,8 +14,7 @@ import os
import sys
import yaml
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import sessionmaker, scoped_session
env = sys.argv[-1]
work_dir = os.getcwd()
......@@ -44,8 +43,8 @@ tamp_pay_engine = create_engine(
charset="utf8"),
echo=True
)
tamp_user_session = sessionmaker(bind=tamp_user_engine)()
tamp_pay_session = sessionmaker(bind=tamp_pay_engine)()
tamp_user_session = scoped_session(sessionmaker(bind=tamp_user_engine))()
tamp_pay_session = scoped_session(sessionmaker(bind=tamp_pay_engine))()
# redis = redis.StrictRedis(
# host=config[env]['redis']['host'],
......
......@@ -14,10 +14,14 @@ class Errors:
USER_ALREADY_EXISTS = '9002'
APPLE_VOCHER_INVALID = '9003'
TANGPU_BALANCE_NOT_ENOUGH = '9004'
APPLE_VOCHER_USED = '9005'
INPUT_PARAMS_ERROR = '9006'
MSG = {
TOKEN_INVALID: 'TOKEN失效',
USER_ALREADY_EXISTS: '用户已经存在',
APPLE_VOCHER_INVALID: '苹果证书无效',
TANGPU_BALANCE_NOT_ENOUGH: '探普币余额不足',
APPLE_VOCHER_USED: '该支付凭证已使用',
INPUT_PARAMS_ERROR: '入参错误'
}
......@@ -40,6 +40,7 @@ class TopUpOrder(Resource):
self.parser.add_argument('amount', type=float, required=True, help='订单总额不能为空')
self.parser.add_argument('pay_method', type=int, required=True, help='支付方式不能为空')
self.parser.add_argument('receipt_data', type=str, required=False)
self.parser.add_argument('product_id', type=str, required=False)
args = self.parser.parse_args()
args['user_id'] = request.user_id
args['remote_addr'] = request.remote_addr
......@@ -74,6 +75,8 @@ class ConsumeOrder(Resource):
data = order_service.CurriculumOrderService().get_order(args)
resp = request.return_success
resp['attributes'] = data
resp = make_response(resp)
resp.hearders = {'Content-Type': 'application/json;charset=UTF-8'}
return resp
def post(self):
......@@ -119,7 +122,7 @@ class TopUpOrderNotify(Resource):
if res['success']:
order_service.topUpSuccessAction(res['order_no'])
resp = make_response(res['body'])
resp.hearders['Content-Type'] = res['header']['Content-Type']
resp.hearders = res['header']
return resp
def put(self, id):
......@@ -150,7 +153,7 @@ class ConsumeOrderNotify(Resource):
if res['success']:
order_service.consumeSucessAction(res['order_no'])
resp = make_response(res['body'])
resp.hearders['Content-Type'] = res['header']['Content-Type']
resp.hearders = res['header']
return resp
def put(self, id):
......@@ -187,3 +190,33 @@ class AccountBalance(Resource):
def delete(self, id):
"""."""
pass
class AllOrders(Resource):
""""""
def __init__(self):
"""."""
self.parser = reqparse.RequestParser()
def get(self):
"""."""
self.parser.add_argument('pageNumber', type=int, required=True)
self.parser.add_argument('pageSize', type=int, required=True)
args = self.parser.parse_args()
args['user_id'] = request.user_id
data = order_service.getAllOrders(args)
resp = request.return_success
resp['attributes'] = data
return resp
def post(self):
"""."""
pass
def put(self, id):
"""."""
pass
def delete(self, id):
"""."""
pass
\ No newline at end of file
......@@ -13,18 +13,18 @@ from app.model.base import Base
from app.model.base import BaseModel
import time
class AccountTopupOrder(Base, BaseModel):
"""账户探普币充值表"""
__tablename__ = 'account_topup_order'
id = Column(String(64), primary_key=True)
order_no = Column(String(50), comment='订单号')
transaction_serial_no = Column(String(50), server_default='', comment='交易流水号')
user_id = Column(String(64), comment='用户ID')
amount = Column(BigInteger, comment='订单总额')
order_status = Column(Integer, server_default=text('0'), comment='订单状态:0:未支付,1:已支付,2:已退款')
pay_method = Column(Integer, server_default=text('1'), comment='支付方式:4:探普贝,5:app微信支付,6:支付宝支付,7:苹果支付')
create_time = Column(DateTime(timezone=True), server_default=func.now(), comment='创建时间')
pay_time = Column(DateTime(timezone=True), server_default=func.now(), comment='付款时间')
complete_time = Column(DateTime(timezone=True), server_default=func.now(), comment='完成时间')
del_flag = Column(Integer, server_default=text('0'), comment='是否删除,0:未删除,1:已删除')
# class AccountTopupOrder(Base, BaseModel):
# """账户探普币充值表"""
# __tablename__ = 'account_topup_order'
#
# id = Column(String(64), primary_key=True)
# order_no = Column(String(50), comment='订单号')
# transaction_serial_no = Column(String(50), server_default='', comment='交易流水号')
# user_id = Column(String(64), comment='用户ID')
# amount = Column(BigInteger, comment='订单总额')
# order_status = Column(Integer, server_default=text('0'), comment='订单状态:0:未支付,1:已支付,2:已退款')
# pay_method = Column(Integer, server_default=text('1'), comment='支付方式:4:探普贝,5:app微信支付,6:支付宝支付,7:苹果支付')
# create_time = Column(DateTime(timezone=True), server_default=func.now(), comment='创建时间')
# pay_time = Column(DateTime(timezone=True), server_default=func.now(), comment='付款时间')
# complete_time = Column(DateTime(timezone=True), server_default=func.now(), comment='完成时间')
# del_flag = Column(Integer, server_default=text('0'), comment='是否删除,0:未删除,1:已删除')
......@@ -18,4 +18,5 @@ class BaseModel:
pass
def to_dict(self):
return {c.name: getattr(self, c.name).strftime("%Y-%m-%d %H:%M:%S") if isinstance(getattr(self, c.name), datetime.datetime) else getattr(self, c.name) for c in self.__table__.columns}
return {c.name: int(getattr(self, c.name).timestamp()) if isinstance(getattr(self, c.name), datetime.datetime) else getattr(self, c.name) for c in self.__table__.columns}
......@@ -47,7 +47,7 @@ class OrderFlow(Base, BaseModel):
ab_type = Column(String(3), comment='产品类型')
ab_proid = Column(String(64), comment='产品ID')
ab_pro_siid = Column(String(64), comment='产品规格ID')
ab_si_type = Column(String(3), comment='购买类型 1:栏目 3:直播 4:视频 5 音频')
ab_si_type = Column(String(3), comment='购买类型 1:栏目 3:直播 4:视频 5 音频 6 探普币订单')
ab_si_name = Column(String(32), comment='产品规格规格名称')
ab_si_code = Column(String(16), comment='产品规格规格编码')
ab_si_pattern = Column(String(3), comment='产品规格定价模式')
......@@ -59,6 +59,6 @@ class OrderFlow(Base, BaseModel):
complete_time = Column(DateTime(timezone=True), default=func.now(), comment='完成时间')
updatetime = Column(DateTime, comment='修改时间')
updateby = Column(String(64), comment='修改人')
deletetag = Column(String(3), comment='删除标识')
deletetag = Column(String(3), default="0", comment='删除标识')
unionid = Column(String(64), comment='微信unionid')
transaction_serial_no = Column(String(64), comment='交易流水号')
......@@ -21,4 +21,6 @@ def add_route(api):
api.add_resource(ConsumeOrderNotify, '/tamp_order/micro_shop/consumeOrderNotify')
# 查询探普币余额
api.add_resource(AccountBalance, '/tamp_order/micro_shop/accountBalance')
# 查询全部订单
api.add_resource(AllOrders, '/tamp_order/micro_shop/AllOrders')
......@@ -14,7 +14,7 @@ from app.api.engine import tamp_pay_session, tamp_user_session
from app.config.errors import Errors
from app.controller.errorhandler import CustomFlaskErr
from app.model.account_balance import AccountBalance
from app.model.account_topup_order import AccountTopupOrder
# from app.model.account_topup_order import AccountTopupOrder
from app.model.curriculum_order import OrderFlow
from app.model.tamp_user_models import CurriculumPrice, CurriculumColumn, CurriculumRes
from xml.etree import cElementTree as etree
......@@ -34,10 +34,17 @@ class TopUpOrderService:
pageSize = args['pageSize']
user_id = args['user_id']
offset = (pageNumber - 1)*pageSize
totalSize = len(tamp_pay_session.query(AccountTopupOrder.id).filter(and_(AccountTopupOrder.user_id == user_id, AccountTopupOrder.order_status == 1)).all())
res = tamp_pay_session.query(AccountTopupOrder).filter(and_(AccountTopupOrder.user_id == user_id, AccountTopupOrder.order_status == 1)).order_by(AccountTopupOrder.create_time.desc()).offset(offset).limit(pageSize).all()
totalSize = len(tamp_user_session.query(OrderFlow.id).filter(and_(OrderFlow.createby == user_id, OrderFlow.ab_si_type == '6', OrderFlow.ab_status == 'SUCCESS')).all())
res = tamp_user_session.query(OrderFlow).filter(OrderFlow.createby == user_id).order_by(
OrderFlow.createtime.desc()).offset(offset).limit(pageSize).all()
res = [r.to_dict() for r in res]
allowed = {'id', 'ab_ordernum', 'transaction_serial_no', 'ab_payment', 'ab_pay_mode', 'createtime', 'pay_time', 'complete_time', 'order_status'}
for r in res:
keys = set(r.keys()) - allowed
for key in keys:
del r[key]
return {
'content': [r.to_dict() for r in res],
'content': res,
'pageNum': pageNumber,
'pageSize': pageSize,
'totalSize': totalSize
......@@ -45,12 +52,12 @@ class TopUpOrderService:
def create_order(self, args):
args['order_no'] = time.strftime('%Y%m%d', time.localtime(time.time())) + str(int(time.time() * 100000))
args['id'] = AccountTopupOrder.__tablename__ + str(int(time.time() * 100000))
args['ab_ordernum'] = time.strftime('%Y%m%d', time.localtime(time.time())) + str(int(time.time() * 100000))
args['id'] = OrderFlow.__tablename__ + str(int(time.time() * 100000))
args['amount'] = args['amount'] * 100
args['order_status'] = 0
args['ab_status'] = 'WAIT'
subject = '探普币充值'
out_trade_no = args['order_no']
out_trade_no = args['ab_ordernum']
notify_path = '/tamp_order/micro_shop/topUpOrderNotify'
pay_params = None
if args['pay_method'] == 5:
......@@ -65,10 +72,20 @@ class TopUpOrderService:
pay_params = res
elif args['pay_method'] == 7:
# 苹果支付
# 入参校验
receipt_data = args.get('receipt_data', '')
if not apple_pay(receipt_data):
product_id = args.get('product_id', '')
if not receipt_data:
raise CustomFlaskErr(Errors.INPUT_PARAMS_ERROR)
if not product_id:
raise CustomFlaskErr(Errors.INPUT_PARAMS_ERROR)
apple_pay_res = apple_pay(receipt_data, product_id)
if not apple_pay_res['success']:
raise CustomFlaskErr(Errors.APPLE_VOCHER_INVALID)
args['order_status'] = 1
args['transaction_serial_no'] = apple_pay_res.get('transaction_id', '')
if tamp_user_session.query(OrderFlow).filter(OrderFlow.transaction_serial_no == args['transaction_serial_no']).all():
raise CustomFlaskErr(Errors.APPLE_VOCHER_USED)
args['ab_status'] = 'SUCCESS'
if not tamp_pay_session.query(AccountBalance).filter(AccountBalance.user_id == args['user_id']).all():
tamp_pay_session.add(AccountBalance(id=AccountBalance.__tablename__+str(int(time.time()*100000)), user_id=args['user_id'], apple_balance=args['amount']))
else:
......@@ -78,10 +95,15 @@ class TopUpOrderService:
})
args.pop('remote_addr', '')
args.pop('receipt_data', '')
order_info = AccountTopupOrder(**args)
tamp_pay_session.add(order_info)
args.pop('product_id', '')
args['ab_payment'] = args.pop('amount', '')
args['ab_pay_mode'] = args.pop('pay_method', '')
args['createby'] = args.pop('user_id', '')
args['ab_si_type'] = '6'
order_info = OrderFlow(**args)
tamp_user_session.add(order_info)
tamp_user_session.commit()
tamp_pay_session.commit()
tamp_pay_session.close()
return pay_params
......@@ -96,22 +118,32 @@ class CurriculumOrderService:
pageSize = args['pageSize']
user_id = args['user_id']
offset = (pageNumber - 1) * pageSize
curriculum_column = tamp_user_session.query(CurriculumColumn).all()
curriculum_res = tamp_user_session.query(CurriculumRes).all()
curriculum_column = tamp_user_session.query(CurriculumColumn.id, CurriculumColumn.title, CurriculumColumn.cover, CurriculumColumn.info).all()
curriculum_res = tamp_user_session.query(CurriculumRes.id, CurriculumRes.title, CurriculumRes.cover, CurriculumRes.teacher_name).all()
res = tamp_user_session.query(OrderFlow).filter(OrderFlow.createby == user_id).order_by(OrderFlow.createtime.desc()).all()
curriculum_column = {r.id: r.to_dict() for r in curriculum_column}
curriculum_res = {r.id: r.to_dict() for r in curriculum_res}
curriculum_column = {r[0]: {'title': r[1], 'cover': r[2], 'info': r[3]} for r in curriculum_column}
curriculum_res = {r[0]: {'title': r[1], 'cover': r[2], 'info': r[3]} for r in curriculum_res}
orders = [r.to_dict() for r in res if r.to_dict()['ab_status'] == 'SUCCESS']
temp_orders = []
for order in orders:
prod_type = order.get('ab_si_type', '')
prod_id = order.get('ab_proid', '')
if prod_type == '1':
order['prod_info'] = curriculum_column.get(prod_id, None)
order = {**order, **curriculum_column.get(prod_id, None)}
temp_orders.append(order)
elif prod_type in ['3', '4', '5']:
order['prod_info'] = curriculum_res.get(prod_id, None)
totalSize = len(orders)
order = {**order, **curriculum_res.get(prod_id, None)}
temp_orders.append(order)
totalSize = len(temp_orders)
temp_orders = temp_orders[offset: offset+pageSize]
allowed = {'id', 'title', 'cover', 'info', 'ab_si_type', 'ab_payment', 'ab_pay_mode', 'ab_ordernum', 'transaction_serial_no', 'pay_method', 'createtime', 'pay_time', 'complete_time',
'ab_status'}
for r in temp_orders:
keys = set(r.keys()) - allowed
for key in keys:
del r[key]
return {
'content': orders[offset: offset+pageSize],
'content': temp_orders,
'pageNum': pageNumber,
'pageSize': pageSize,
'totalSize': totalSize
......@@ -171,22 +203,22 @@ class CurriculumOrderService:
args.pop('remote_addr', '')
order_info = OrderFlow(**args)
tamp_user_session.add(order_info)
tamp_user_session.commit()
tamp_pay_session.commit()
tamp_user_session.commit()
return pay_params
def topUpSuccessAction(order_no):
"""."""
topup_order = tamp_pay_session.query(AccountTopupOrder).filter(AccountTopupOrder.order_no == order_no).first()
topup_order = tamp_user_session.query(OrderFlow).filter(OrderFlow.ab_ordernum == order_no).first()
# 幂等校验
if topup_order.order_status == 1:
if topup_order.ab_status == 'SUCCESS':
return False
tamp_pay_session.query(AccountTopupOrder).filter(AccountTopupOrder.order_no == order_no).update({
'order_status': 1
tamp_user_session.query(OrderFlow).filter(OrderFlow.ab_ordernum == order_no).update({
'ab_status': 'SUCCESS'
})
# 账户充值
account_topup_order = tamp_pay_session.query(AccountTopupOrder).filter(AccountTopupOrder.order_no == order_no).first().to_dict()
account_topup_order = tamp_user_session.query(OrderFlow).filter(OrderFlow.ab_ordernum == order_no).first().to_dict()
# 安卓支付宝,微信支付
if not tamp_pay_session.query(AccountBalance).filter(AccountBalance.user_id == account_topup_order.user_id).all():
tamp_pay_session.add(AccountBalance(id=AccountBalance.__tablename__ + str(int(time.time()*10000)), user_id=account_topup_order.user_id, android_balance=account_topup_order.amount))
......@@ -194,20 +226,21 @@ def topUpSuccessAction(order_no):
tamp_pay_session.query(AccountBalance).filter(AccountBalance.user_id == account_topup_order.user_id).update({
'apple_balance': AccountBalance.android_balance + account_topup_order.amount
})
tamp_user_session.commit()
tamp_pay_session.commit()
def consumeSucessAction(order_no):
"""."""
curriculum_order = tamp_pay_session.query(OrderFlow.ab_ordernum == order_no).all()
curriculum_order = tamp_user_session.query(OrderFlow.ab_ordernum == order_no).all()
# 幂等校验
if curriculum_order.ab_status == 'SUCCESS':
return False
tamp_pay_session.query(OrderFlow).filter(OrderFlow.ab_ordernum == order_no).update({
tamp_user_session.query(OrderFlow).filter(OrderFlow.ab_ordernum == order_no).update({
'ab_status': 'SUCCESS'
})
tamp_pay_session.commit()
tamp_user_session.commit()
def getAccountBalance(user_id):
......@@ -260,3 +293,58 @@ def alipayWxPayCheck(res_info):
body = '<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> </xml>'
return {'success': success, 'header': header, 'body': body, 'order_no': res['out_trade_no']}
def getAllOrders(args):
"""."""
pageNumber = args['pageNumber']
pageSize = args['pageSize']
user_id = args['user_id']
offset = (pageNumber - 1) * pageSize
totalSize = len(tamp_user_session.query(OrderFlow.id).filter(
and_(OrderFlow.createby == user_id, OrderFlow.ab_si_type == '6', OrderFlow.ab_status == 'SUCCESS')).all())
res = tamp_user_session.query(OrderFlow).filter(OrderFlow.createby == user_id).order_by(
OrderFlow.createtime.desc()).all()
topup_res = [r.to_dict() for r in res]
allowed = {'id', 'ab_ordernum', 'transaction_serial_no', 'ab_payment', 'ab_pay_mode', 'createtime', 'pay_time',
'complete_time', 'order_status'}
for r in topup_res:
keys = set(r.keys()) - allowed
for key in keys:
del r[key]
curriculum_column = tamp_user_session.query(CurriculumColumn.id, CurriculumColumn.title, CurriculumColumn.cover,
CurriculumColumn.info).all()
curriculum_res = tamp_user_session.query(CurriculumRes.id, CurriculumRes.title, CurriculumRes.cover,
CurriculumRes.teacher_name).all()
res = tamp_user_session.query(OrderFlow).filter(OrderFlow.createby == user_id).order_by(
OrderFlow.createtime.desc()).all()
curriculum_column = {r[0]: {'title': r[1], 'cover': r[2], 'info': r[3]} for r in curriculum_column}
curriculum_res = {r[0]: {'title': r[1], 'cover': r[2], 'info': r[3]} for r in curriculum_res}
orders = [r.to_dict() for r in res if r.to_dict()['ab_status'] == 'SUCCESS']
temp_orders = []
for order in orders:
prod_type = order.get('ab_si_type', '')
prod_id = order.get('ab_proid', '')
if prod_type == '1':
order = {**order, **curriculum_column.get(prod_id, None)}
temp_orders.append(order)
elif prod_type in ['3', '4', '5']:
order = {**order, **curriculum_res.get(prod_id, None)}
temp_orders.append(order)
temp_orders = temp_orders[offset: offset + pageSize]
allowed = {'id', 'title', 'cover', 'info', 'ab_si_type', 'ab_payment', 'ab_pay_mode', 'ab_ordernum',
'transaction_serial_no', 'pay_method', 'createtime', 'pay_time', 'complete_time',
'ab_status'}
for r in temp_orders:
keys = set(r.keys()) - allowed
for key in keys:
del r[key]
orders = [*topup_res, *temp_orders]
totalSize = len(orders)
return {
'content': orders[offset: offset+pageSize],
'pageNum': pageNumber,
'pageSize': pageSize,
'totalSize': totalSize
}
......@@ -17,7 +17,7 @@ import pickle
import json
import urllib
def apple_pay(receipt_data):
def apple_pay(receipt_data, product_id='com.qimeng.tanpuyun_test_3'):
"""苹果支付"""
'''
"receipt-data":receipt_data,
......@@ -25,7 +25,7 @@ def apple_pay(receipt_data):
"password":"a1cdf6f00d3244aa9aa2c1c4a65b7ccf"
'''
if not receipt_data:
return False
{'success': False, 'transaction_id': ''}
receipt_data = urllib.request.unquote(receipt_data)
formdata = {
"receipt-data": receipt_data,
......@@ -40,14 +40,46 @@ def apple_pay(receipt_data):
# 首先先去正式,如果是测试的话,就再去测试
response = requests.post(AppStore_URL[0], data=dumped_json_string)
if response.status_code == 200:
if response.json().get("status") == 21007:
resp_data = response.json()
if resp_data.get("status") == 0:
receipt_info = resp_data.get('latest_receipt_info', '')
if receipt_info:
for rec in receipt_info:
if rec['product_id'] == product_id:
transaction_id = rec['transaction_id']
return {'success': True, 'transaction_id': transaction_id}
receipt_info = resp_data.get('receipt', '').get('in_app', '')
if receipt_info:
for rec in receipt_info:
if rec['product_id'] == product_id:
transaction_id = rec['transaction_id']
return {'success': True, 'transaction_id': transaction_id}
elif resp_data.get("status") == 21007:
# 测试账号
response = requests.post(AppStore_URL[1], data=dumped_json_string)
if response.status_code == 200:
if response.json().get("status") == 0:
return True
return True
return False
resp_data = response.json()
if resp_data.get("status") == 0:
receipt_info = resp_data.get('latest_receipt_info', '')
if receipt_info:
for rec in receipt_info:
if rec['product_id'] == product_id:
transaction_id = rec['transaction_id']
return {'success': True, 'transaction_id': transaction_id}
receipt_info = resp_data.get('receipt', '').get('in_app', '')
if receipt_info:
for rec in receipt_info:
if rec['product_id'] == product_id:
transaction_id = rec['transaction_id']
return {'success': True, 'transaction_id': transaction_id}
return {'success': False, 'transaction_id': ''}
if __name__ == '__main__':
receipt_data = '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'
apple_pay(receipt_data)
\ No newline at end of file
# receipt_data = 'MIIWpAYJKoZIhvcNAQcCoIIWlTCCFpECAQExCzAJBgUrDgMCGgUAMIIGRQYJKoZIhvcNAQcBoIIGNgSCBjIxggYuMAoCAQgCAQEEAhYAMAoCARQCAQEEAgwAMAsCAQECAQEEAwIBADALAgELAgEBBAMCAQAwCwIBDwIBAQQDAgEAMAsCARACAQEEAwIBADALAgEZAgEBBAMCAQMwDAIBAwIBAQQEDAIyNDAMAgEKAgEBBAQWAjQrMAwCAQ4CAQEEBAICAJ4wDQIBDQIBAQQFAgMB%2FowwDQIBEwIBAQQFDAMxLjAwDgIBCQIBAQQGAgRQMjU2MBgCAQQCAQIEEPMMKYjFWXjle2Q0cEGgeTIwGwIBAAIBAQQTDBFQcm9kdWN0aW9uU2FuZGJveDAcAgEFAgEBBBRKs0FreogYBnEqAKCHNCkSSJUiATAdAgECAgEBBBUME2NvbS5xaW1lbmcudGFucHV5dW4wHgIBDAIBAQQWFhQyMDIwLTExLTI2VDEyOjAxOjU2WjAeAgESAgEBBBYWFDIwMTMtMDgtMDFUMDc6MDA6MDBaMEYCAQcCAQEEPncsRTFYWxBF1fdO%2ByJg53frrFV7hSZjJJtEdCWoj54bjeRaIcmvg3kzG9ULxNcsDBN9WdlZzh6BUdinyXcOMFICAQYCAQEESk2oEEJpopN%2FWIOXkkrHwnVPoUGX8NSrNl6n1ygFLlkvv88%2BR0XON2c5g%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%2BxKDVWG%2F6QC15fKOVRtfX%2ByVBidxCxScY5ke4LOibpJ1gjltIhxzz9bRi7GxB24A6lYogQ%2BIXjV27fQjhKNg0xbKmg3k8LyvR7E0qEMSlhSqxLj7d0fmBWQNS3CzBLKjUiB91h4VGvojDE2H0oGDEdU8zeQuLKSiX1fpIVK4cCc4Lqku4KXY%2FQrk8H9Pm%2FKwfU8qY9SGsAlCnYO3v6Z%2Fv%2FCa%2FVbXqxzUUkIVonMQ5DMjoEC0KCXtlyxoWlph5AQaCYmObgdEHOwCl3Fc9DfdjvYLdmIHuPsB8%2FijtDT%2BiZVge%2FiA0kjAgMBAAGjggHXMIIB0zA%2FBggrBgEFBQcBAQQzMDEwLwYIKwYBBQUHMAGGI2h0dHA6Ly9vY3NwLmFwcGxlLmNvbS9vY3NwMDMtd3dkcjA0MB0GA1UdDgQWBBSRpJz8xHa3n6CK9E31jzZd7SsEhTAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFIgnFwmpthhgi%2BzruvZHWcVSVKO3MIIBHgYDVR0gBIIBFTCCAREwggENBgoqhkiG92NkBQYBMIH%2BMIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMDYGCCsGAQUFBwIBFipodHRwOi8vd3d3LmFwcGxlLmNvbS9jZXJ0aWZpY2F0ZWF1dGhvcml0eS8wDgYDVR0PAQH%2FBAQDAgeAMBAGCiqGSIb3Y2QGCwEEAgUAMA0GCSqGSIb3DQEBBQUAA4IBAQANphvTLj3jWysHbkKWbNPojEMwgl%2FgXNGNvr0PvRr8JZLbjIXDgFnf4%2BLXLgUUrA3btrj%2B%2FDUufMutF2uOfx%2Fkd7mxZ5W0E16mGYZ2%2BFogledjjA9z%2FOjtxh%2BumfhlSFyg4Cg6wBA3LbmgBDkfc7nIBf3y3n8aKipuKwH8oCBc2et9J6Yz%2BPWY4L5E27FMZ%2FxuCk%2FJ4gao0pfzp45rUaJahHVl0RYEYuPBX%2FUIqc9o2ZIAycGMs%2FiNAGS6WGDAfK%2BPdcppuVsq1h1obphC9UynNxmbzDscehlD86Ntv0hgBgw2kivs3hi1EdotI9CO%2FKBpnBcbnoB7OUdFMGEvxxOoMIIEIjCCAwqgAwIBAgIIAd68xDltoBAwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTEzMDIwNzIxNDg0N1oXDTIzMDIwNzIxNDg0N1owgZYxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDKOFSmy1aqyCQ5SOmM7uxfuH8mkbw0U3rOfGOAYXdkXqUHI7Y5%2FlAtFVZYcC1%2BxG7BSoU%2BL%2FDehBqhV8mvexj%2FavoVEkkVCBmsqtsqMu2WY2hSFT2Miuy%2FaxiV4AOsAX2XBWfODoWVN2rtCbauZ81RZJ%2FGXNG8V25nNYB2NqSHgW44j9grFU57Jdhav06DwY3Sk9UacbVgnJ0zTlX5ElgMhrgWDcHld0WNUEi6Ky3klIXh6MSdxmilsKP8Z35wugJZS3dCkTm59c3hTO%2FAO0iMpuUhXf1qarunFjVg0uat80YpyejDi%2Bl5wGphZxWy8P3laLxiX27Pmd3vG2P%2BkmWrAgMBAAGjgaYwgaMwHQYDVR0OBBYEFIgnFwmpthhgi%2BzruvZHWcVSVKO3MA8GA1UdEwEB%2FwQFMAMBAf8wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01%2FCF4wLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybC5hcHBsZS5jb20vcm9vdC5jcmwwDgYDVR0PAQH%2FBAQDAgGGMBAGCiqGSIb3Y2QGAgEEAgUAMA0GCSqGSIb3DQEBBQUAA4IBAQBPz%2B9Zviz1smwvj%2B4ThzLoBTWobot9yWkMudkXvHcs1Gfi%2FZptOllc34MBvbKuKmFysa%2FNw0Uwj6ODDc4dR7Txk4qjdJukw5hyhzs%2Br0ULklS5MruQGFNrCk4QttkdUGwhgAqJTleMa1s8Pab93vcNIx0LSiaHP7qRkkykGRIZbVf1eliHe2iK5IaMSuviSRSqpd1VAKmuu0swruGgsbwpgOYJd%2BW%2BNKIByn%2Fc4grmO7i77LpilfMFY0GCzQ87HUyVpNur%2BcmV6U%2FkTecmmYHpvPm0KdIBembhLoz2IYrF%2BHjhga6%2F05Cdqa3zr%2F04GpZnMBxRpVzscYqCtGwPDBUfMIIEuzCCA6OgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwHhcNMDYwNDI1MjE0MDM2WhcNMzUwMjA5MjE0MDM2WjBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkkakJH5HbHkdQ6wXtXnmELes2oldMVeyLGYne%2BUts9QerIjAC6Bg%2B%2BFAJ039BqJj50cpmnCRrEdCju%2BQbKsMflZ56DKRHi1vUFjczy8QPTc4UadHJGXL1XQ7Vf1%2Bb8iUDulWPTV0N8WQ1IxVLFVkds5T39pyez1C6wVhQZ48ItCD3y6wsIG9wtj8BMIy3Q88PnT3zK0koGsj%2BzrW5DtleHNbLPbU6rfQPDgCSC7EhFi501TwN22IWq6NxkkdTVcGvL0Gz%2BPvjcM3mo0xFfh9Ma1CWQYnEdGILEINBhzOKgbEwWOxaBDKMaLOPHd5lc%2F9nXmW8Sdh2nzMUZaF3lMktAgMBAAGjggF6MIIBdjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH%2FBAUwAwEB%2FzAdBgNVHQ4EFgQUK9BpR5R2Cf70a40uQKb3R01%2FCF4wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01%2FCF4wggERBgNVHSAEggEIMIIBBDCCAQAGCSqGSIb3Y2QFATCB8jAqBggrBgEFBQcCARYeaHR0cHM6Ly93d3cuYXBwbGUuY29tL2FwcGxlY2EvMIHDBggrBgEFBQcCAjCBthqBs1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMA0GCSqGSIb3DQEBBQUAA4IBAQBcNplMLXi37Yyb3PN3m%2FJ20ncwT8EfhYOFG5k9RzfyqZtAjizUsZAS2L70c5vu0mQPy3lPNNiiPvl4%2F2vIB%2Bx9OYOLUyDTOMSxv5pPCmv%2FK%2FxZpwUJfBdAVhEedNO3iyM7R6PVbyTi69G3cN8PReEnyvFteO3ntRcXqNx%2BIjXKJdXZD9Zr1KIkIxH3oayPc4FgxhtbCS%2BSsvhESPBgOJ4V9T0mZyCKM2r3DYLP3uujL%2FlTaltkwGMzd%2Fc6ByxW69oPIQ7aunMZT7XZNn%2FBh1XZp5m5MkL72NVxnn6hUrcbvZNCJBIqxw8dtk2cXmPIS4AXUKqK1drk%2FNAJBzewdXUhMYIByzCCAccCAQEwgaMwgZYxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkCCA7rV4fnngmNMAkGBSsOAwIaBQAwDQYJKoZIhvcNAQEBBQAEggEAnm6KCn212cEzoEX%2B7EtFKsd5T9dwd5Z17ikBrWeLWXmSrsgLePc98DUqoDVTfpeyU5lxcoMsmY6JiG2%2B0eXbDAWha%2FQxt%2B2YFPID0JfczxqKWG821q7jyVT6dFjN9si8BfXAQp3aY2oF%2BKz%2FoK1XenjmKgtKiPO7iyphT5Q72B6kc%2BAAsO2q9M7Ff7SjKApM9Fklew%2FLJ9J2K6%2BVQUXxPMgg8HO%2Benbn1MZJ8fBO%2BJH8PTMwx1AIXKYfMtvBmryj76lI3Tiysr927mqRJ8xOwJFf4GbVhequcASz2vQTFAiokUrWxDBwoXMGtg6wzsoq49FIVNs6NvKkjwa6YLytvw%3D%3D'
receipt_data = 'MIIWqQYJKoZIhvcNAQcCoIIWmjCCFpYCAQExCzAJBgUrDgMCGgUAMIIGSgYJKoZIhvcNAQcBoIIGOwSCBjcxggYzMAoCAQgCAQEEAhYAMAoCARQCAQEEAgwAMAsCAQECAQEEAwIBADALAgELAgEBBAMCAQAwCwIBDwIBAQQDAgEAMAsCARACAQEEAwIBADALAgEZAgEBBAMCAQMwDAIBAwIBAQQEDAIyNDAMAgEKAgEBBAQWAjQrMAwCAQ4CAQEEBAICAJ4wDQIBDQIBAQQFAgMB%2FowwDQIBEwIBAQQFDAMxLjAwDgIBCQIBAQQGAgRQMjU2MBgCAQQCAQIEECFoXa2qntAaMHCVnn%2FcS4owGwIBAAIBAQQTDBFQcm9kdWN0aW9uU2FuZGJveDAcAgEFAgEBBBSTmGxo2TKF94LjpBfJ2KteVpGdrzAdAgECAgEBBBUME2NvbS5xaW1lbmcudGFucHV5dW4wHgIBDAIBAQQWFhQyMDIwLTExLTI3VDAzOjAzOjI5WjAeAgESAgEBBBYWFDIwMTMtMDgtMDFUMDc6MDA6MDBaMEUCAQcCAQEEPZW4TyLsU84d4pMWdAnvdQwBURzDdkB2vDmzWCs%2FLrxpz46ux3Y3KOftj1NdSiLmVFpjt2aF82IbBGI531gwWAIBBgIBAQRQkP3oLgCpkODRj1JRO1%2FBtz1DGSmIz9OiV99uKNIplOL0sU7Xq%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%2FpALXl8o5VG19f7JUGJ3ELFJxjmR7gs6JuknWCOW0iHHPP1tGLsbEHbgDqViiBD4heNXbt9COEo2DTFsqaDeTwvK9HsTSoQxKWFKrEuPt3R%2BYFZA1LcLMEsqNSIH3WHhUa%2BiMMTYfSgYMR1TzN5C4spKJfV%2BkhUrhwJzguqS7gpdj9CuTwf0%2Bb8rB9Typj1IawCUKdg7e%2Fpn%2B%2F8Jr9VterHNRSQhWicxDkMyOgQLQoJe2XLGhaWmHkBBoJiY5uB0Qc7AKXcVz0N92O9gt2Yge4%2BwHz%2BKO0NP6JlWB7%2BIDSSMCAwEAAaOCAdcwggHTMD8GCCsGAQUFBwEBBDMwMTAvBggrBgEFBQcwAYYjaHR0cDovL29jc3AuYXBwbGUuY29tL29jc3AwMy13d2RyMDQwHQYDVR0OBBYEFJGknPzEdrefoIr0TfWPNl3tKwSFMAwGA1UdEwEB%2FwQCMAAwHwYDVR0jBBgwFoAUiCcXCam2GGCL7Ou69kdZxVJUo7cwggEeBgNVHSAEggEVMIIBETCCAQ0GCiqGSIb3Y2QFBgEwgf4wgcMGCCsGAQUFBwICMIG2DIGzUmVsaWFuY2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2NlcHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRpZmljYXRpb24gcHJhY3RpY2Ugc3RhdGVtZW50cy4wNgYIKwYBBQUHAgEWKmh0dHA6Ly93d3cuYXBwbGUuY29tL2NlcnRpZmljYXRlYXV0aG9yaXR5LzAOBgNVHQ8BAf8EBAMCB4AwEAYKKoZIhvdjZAYLAQQCBQAwDQYJKoZIhvcNAQEFBQADggEBAA2mG9MuPeNbKwduQpZs0%2BiMQzCCX%2BBc0Y2%2BvQ%2B9GvwlktuMhcOAWd%2Fj4tcuBRSsDdu2uP78NS58y60Xa45%2FH%2BR3ubFnlbQTXqYZhnb4WiCV52OMD3P86O3GH66Z%2BGVIXKDgKDrAEDctuaAEOR9zucgF%2FfLefxoqKm4rAfygIFzZ630npjP49ZjgvkTbsUxn%2FG4KT8niBqjSl%2FOnjmtRolqEdWXRFgRi48Ff9Qipz2jZkgDJwYyz%2BI0AZLpYYMB8r491ymm5WyrWHWhumEL1TKc3GZvMOxx6GUPzo22%2FSGAGDDaSK%2BzeGLUR2i0j0I78oGmcFxuegHs5R0UwYS%2FHE6gwggQiMIIDCqADAgECAggB3rzEOW2gEDANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwHhcNMTMwMjA3MjE0ODQ3WhcNMjMwMjA3MjE0ODQ3WjCBljELMAkGA1UEBhMCVVMxEzARBgNVBAoMCkFwcGxlIEluYy4xLDAqBgNVBAsMI0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zMUQwQgYDVQQDDDtBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9ucyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMo4VKbLVqrIJDlI6Yzu7F%2B4fyaRvDRTes58Y4Bhd2RepQcjtjn%2BUC0VVlhwLX7EbsFKhT4v8N6EGqFXya97GP9q%2BhUSSRUIGayq2yoy7ZZjaFIVPYyK7L9rGJXgA6wBfZcFZ84OhZU3au0Jtq5nzVFkn8Zc0bxXbmc1gHY2pIeBbjiP2CsVTnsl2Fq%2FToPBjdKT1RpxtWCcnTNOVfkSWAyGuBYNweV3RY1QSLorLeSUheHoxJ3GaKWwo%2FxnfnC6AllLd0KRObn1zeFM78A7SIym5SFd%2FWpqu6cWNWDS5q3zRinJ6MOL6XnAamFnFbLw%2FeVovGJfbs%2BZ3e8bY%2F6SZasCAwEAAaOBpjCBozAdBgNVHQ4EFgQUiCcXCam2GGCL7Ou69kdZxVJUo7cwDwYDVR0TAQH%2FBAUwAwEB%2FzAfBgNVHSMEGDAWgBQr0GlHlHYJ%2FvRrjS5ApvdHTX8IXjAuBgNVHR8EJzAlMCOgIaAfhh1odHRwOi8vY3JsLmFwcGxlLmNvbS9yb290LmNybDAOBgNVHQ8BAf8EBAMCAYYwEAYKKoZIhvdjZAYCAQQCBQAwDQYJKoZIhvcNAQEFBQADggEBAE%2FP71m%2BLPWybC%2BP7hOHMugFNahui33JaQy52Re8dyzUZ%2BL9mm06WVzfgwG9sq4qYXKxr83DRTCPo4MNzh1HtPGTiqN0m6TDmHKHOz6vRQuSVLkyu5AYU2sKThC22R1QbCGAColOV4xrWzw9pv3e9w0jHQtKJoc%2FupGSTKQZEhltV%2FV6WId7aIrkhoxK6%2BJJFKql3VUAqa67SzCu4aCxvCmA5gl35b40ogHKf9ziCuY7uLvsumKV8wVjQYLNDzsdTJWk26v5yZXpT%2BRN5yaZgem8%2BbQp0gF6ZuEujPYhisX4eOGBrr%2FTkJ2prfOv%2FTgalmcwHFGlXOxxioK0bA8MFR8wggS7MIIDo6ADAgECAgECMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYTAlVTMRMwEQYDVQQKEwpBcHBsZSBJbmMuMSYwJAYDVQQLEx1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEWMBQGA1UEAxMNQXBwbGUgUm9vdCBDQTAeFw0wNjA0MjUyMTQwMzZaFw0zNTAyMDkyMTQwMzZaMGIxCzAJBgNVBAYTAlVTMRMwEQYDVQQKEwpBcHBsZSBJbmMuMSYwJAYDVQQLEx1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEWMBQGA1UEAxMNQXBwbGUgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOSRqQkfkdseR1DrBe1eeYQt6zaiV0xV7IsZid75S2z1B6siMALoGD74UAnTf0GomPnRymacJGsR0KO75Bsqwx%2BVnnoMpEeLW9QWNzPLxA9NzhRp0ckZcvVdDtV%2FX5vyJQO6VY9NXQ3xZDUjFUsVWR2zlPf2nJ7PULrBWFBnjwi0IPfLrCwgb3C2PwEwjLdDzw%2BdPfMrSSgayP7OtbkO2V4c1ss9tTqt9A8OAJILsSEWLnTVPA3bYharo3GSR1NVwa8vQbP4%2B%2BNwzeajTEV%2BH0xrUJZBicR0YgsQg0GHM4qBsTBY7FoEMoxos48d3mVz%2F2deZbxJ2HafMxRloXeUyS0CAwEAAaOCAXowggF2MA4GA1UdDwEB%2FwQEAwIBBjAPBgNVHRMBAf8EBTADAQH%2FMB0GA1UdDgQWBBQr0GlHlHYJ%2FvRrjS5ApvdHTX8IXjAfBgNVHSMEGDAWgBQr0GlHlHYJ%2FvRrjS5ApvdHTX8IXjCCAREGA1UdIASCAQgwggEEMIIBAAYJKoZIhvdjZAUBMIHyMCoGCCsGAQUFBwIBFh5odHRwczovL3d3dy5hcHBsZS5jb20vYXBwbGVjYS8wgcMGCCsGAQUFBwICMIG2GoGzUmVsaWFuY2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2NlcHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRpZmljYXRpb24gcHJhY3RpY2Ugc3RhdGVtZW50cy4wDQYJKoZIhvcNAQEFBQADggEBAFw2mUwteLftjJvc83eb8nbSdzBPwR%2BFg4UbmT1HN%2FKpm0COLNSxkBLYvvRzm%2B7SZA%2FLeU802KI%2B%2BXj%2Fa8gH7H05g4tTINM4xLG%2Fmk8Ka%2F8r%2FFmnBQl8F0BWER5007eLIztHo9VvJOLr0bdw3w9F4SfK8W147ee1Fxeo3H4iNcol1dkP1mvUoiQjEfehrI9zgWDGG1sJL5Ky%2BERI8GA4nhX1PSZnIIozavcNgs%2Fe66Mv%2BVNqW2TAYzN39zoHLFbr2g8hDtq6cxlPtdk2f8GHVdmnmbkyQvvY1XGefqFStxu9k0IkEirHDx22TZxeY8hLgBdQqorV2uT80AkHN7B1dSExggHLMIIBxwIBATCBozCBljELMAkGA1UEBhMCVVMxEzARBgNVBAoMCkFwcGxlIEluYy4xLDAqBgNVBAsMI0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zMUQwQgYDVQQDDDtBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9ucyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQIIDutXh%2BeeCY0wCQYFKw4DAhoFADANBgkqhkiG9w0BAQEFAASCAQCBIxiQnH53BQ%2BPBjUe0P%2Fzt292qiyKYodbyHBrlSzvhxpxywHPV0iohT%2Fw0yKeJMBrkMMnlSMYS4DKAW%2B14I0Aw55oEdB10TI%2BpwgYyBvmw7wBK5VsqSArxLM8PgFxAGWSUCcEvfAJR%2BDFr6AE3hGoyhaWl5nE9E4AgYV0lo1SXb1oezvurCbOXvFzpQ%2BSsqoGUQGMKBT2JDyWP0EsBLeO0DZC5L6sb1rHpGgy37JiPvaHzyQTXHmmp%2BtzdHFWj038vDH75c6Y5BstubyV0fP7JF%2BSZOkEw2%2FiGiwLTb4fDh6ezYXW8W95jGQYhNlFwYB4htLpNUiqIf9zXO5bYt8g'
receipt_data = 'MIIWpwYJKoZIhvcNAQcCoIIWmDCCFpQCAQExCzAJBgUrDgMCGgUAMIIGSAYJKoZIhvcNAQcBoIIGOQSCBjUxggYxMAoCAQgCAQEEAhYAMAoCARQCAQEEAgwAMAsCAQECAQEEAwIBADALAgELAgEBBAMCAQAwCwIBDwIBAQQDAgEAMAsCARACAQEEAwIBADALAgEZAgEBBAMCAQMwDAIBAwIBAQQEDAIyNDAMAgEKAgEBBAQWAjQrMAwCAQ4CAQEEBAICAJ4wDQIBDQIBAQQFAgMB%2FowwDQIBEwIBAQQFDAMxLjAwDgIBCQIBAQQGAgRQMjU2MBgCAQQCAQIEEOWzvfojBKpi4XyjCVgzeXwwGwIBAAIBAQQTDBFQcm9kdWN0aW9uU2FuZGJveDAcAgEFAgEBBBS8mpyetKOpFhfXIFm3IkN5rIneAjAdAgECAgEBBBUME2NvbS5xaW1lbmcudGFucHV5dW4wHgIBDAIBAQQWFhQyMDIwLTExLTI3VDA2OjMwOjUxWjAeAgESAgEBBBYWFDIwMTMtMDgtMDFUMDc6MDA6MDBaMEECAQcCAQEEOao8m8wfYq2cA%2Bh8iHoZ3KvM4vt3yQ3ajlrYaOQUb8k%2F8OpA39ISfxYJrFZ%2F5YkGxgFUUHCsZMsOujBZAgEGAgEBBFGXJsFGOz1Sozqxkh%2BDiwFG%2Bbt5f%2F%2FWY33XaWFUaVPMTBL7hBrEzVWUJWXIxSSaNVcnf1ZnaV9MYshaJYkrplVavvVB8hsNT%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%2BxKDVWG%2F6QC15fKOVRtfX%2ByVBidxCxScY5ke4LOibpJ1gjltIhxzz9bRi7GxB24A6lYogQ%2BIXjV27fQjhKNg0xbKmg3k8LyvR7E0qEMSlhSqxLj7d0fmBWQNS3CzBLKjUiB91h4VGvojDE2H0oGDEdU8zeQuLKSiX1fpIVK4cCc4Lqku4KXY%2FQrk8H9Pm%2FKwfU8qY9SGsAlCnYO3v6Z%2Fv%2FCa%2FVbXqxzUUkIVonMQ5DMjoEC0KCXtlyxoWlph5AQaCYmObgdEHOwCl3Fc9DfdjvYLdmIHuPsB8%2FijtDT%2BiZVge%2FiA0kjAgMBAAGjggHXMIIB0zA%2FBggrBgEFBQcBAQQzMDEwLwYIKwYBBQUHMAGGI2h0dHA6Ly9vY3NwLmFwcGxlLmNvbS9vY3NwMDMtd3dkcjA0MB0GA1UdDgQWBBSRpJz8xHa3n6CK9E31jzZd7SsEhTAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFIgnFwmpthhgi%2BzruvZHWcVSVKO3MIIBHgYDVR0gBIIBFTCCAREwggENBgoqhkiG92NkBQYBMIH%2BMIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMDYGCCsGAQUFBwIBFipodHRwOi8vd3d3LmFwcGxlLmNvbS9jZXJ0aWZpY2F0ZWF1dGhvcml0eS8wDgYDVR0PAQH%2FBAQDAgeAMBAGCiqGSIb3Y2QGCwEEAgUAMA0GCSqGSIb3DQEBBQUAA4IBAQANphvTLj3jWysHbkKWbNPojEMwgl%2FgXNGNvr0PvRr8JZLbjIXDgFnf4%2BLXLgUUrA3btrj%2B%2FDUufMutF2uOfx%2Fkd7mxZ5W0E16mGYZ2%2BFogledjjA9z%2FOjtxh%2BumfhlSFyg4Cg6wBA3LbmgBDkfc7nIBf3y3n8aKipuKwH8oCBc2et9J6Yz%2BPWY4L5E27FMZ%2FxuCk%2FJ4gao0pfzp45rUaJahHVl0RYEYuPBX%2FUIqc9o2ZIAycGMs%2FiNAGS6WGDAfK%2BPdcppuVsq1h1obphC9UynNxmbzDscehlD86Ntv0hgBgw2kivs3hi1EdotI9CO%2FKBpnBcbnoB7OUdFMGEvxxOoMIIEIjCCAwqgAwIBAgIIAd68xDltoBAwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTEzMDIwNzIxNDg0N1oXDTIzMDIwNzIxNDg0N1owgZYxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDKOFSmy1aqyCQ5SOmM7uxfuH8mkbw0U3rOfGOAYXdkXqUHI7Y5%2FlAtFVZYcC1%2BxG7BSoU%2BL%2FDehBqhV8mvexj%2FavoVEkkVCBmsqtsqMu2WY2hSFT2Miuy%2FaxiV4AOsAX2XBWfODoWVN2rtCbauZ81RZJ%2FGXNG8V25nNYB2NqSHgW44j9grFU57Jdhav06DwY3Sk9UacbVgnJ0zTlX5ElgMhrgWDcHld0WNUEi6Ky3klIXh6MSdxmilsKP8Z35wugJZS3dCkTm59c3hTO%2FAO0iMpuUhXf1qarunFjVg0uat80YpyejDi%2Bl5wGphZxWy8P3laLxiX27Pmd3vG2P%2BkmWrAgMBAAGjgaYwgaMwHQYDVR0OBBYEFIgnFwmpthhgi%2BzruvZHWcVSVKO3MA8GA1UdEwEB%2FwQFMAMBAf8wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01%2FCF4wLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybC5hcHBsZS5jb20vcm9vdC5jcmwwDgYDVR0PAQH%2FBAQDAgGGMBAGCiqGSIb3Y2QGAgEEAgUAMA0GCSqGSIb3DQEBBQUAA4IBAQBPz%2B9Zviz1smwvj%2B4ThzLoBTWobot9yWkMudkXvHcs1Gfi%2FZptOllc34MBvbKuKmFysa%2FNw0Uwj6ODDc4dR7Txk4qjdJukw5hyhzs%2Br0ULklS5MruQGFNrCk4QttkdUGwhgAqJTleMa1s8Pab93vcNIx0LSiaHP7qRkkykGRIZbVf1eliHe2iK5IaMSuviSRSqpd1VAKmuu0swruGgsbwpgOYJd%2BW%2BNKIByn%2Fc4grmO7i77LpilfMFY0GCzQ87HUyVpNur%2BcmV6U%2FkTecmmYHpvPm0KdIBembhLoz2IYrF%2BHjhga6%2F05Cdqa3zr%2F04GpZnMBxRpVzscYqCtGwPDBUfMIIEuzCCA6OgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwHhcNMDYwNDI1MjE0MDM2WhcNMzUwMjA5MjE0MDM2WjBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkkakJH5HbHkdQ6wXtXnmELes2oldMVeyLGYne%2BUts9QerIjAC6Bg%2B%2BFAJ039BqJj50cpmnCRrEdCju%2BQbKsMflZ56DKRHi1vUFjczy8QPTc4UadHJGXL1XQ7Vf1%2Bb8iUDulWPTV0N8WQ1IxVLFVkds5T39pyez1C6wVhQZ48ItCD3y6wsIG9wtj8BMIy3Q88PnT3zK0koGsj%2BzrW5DtleHNbLPbU6rfQPDgCSC7EhFi501TwN22IWq6NxkkdTVcGvL0Gz%2BPvjcM3mo0xFfh9Ma1CWQYnEdGILEINBhzOKgbEwWOxaBDKMaLOPHd5lc%2F9nXmW8Sdh2nzMUZaF3lMktAgMBAAGjggF6MIIBdjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH%2FBAUwAwEB%2FzAdBgNVHQ4EFgQUK9BpR5R2Cf70a40uQKb3R01%2FCF4wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01%2FCF4wggERBgNVHSAEggEIMIIBBDCCAQAGCSqGSIb3Y2QFATCB8jAqBggrBgEFBQcCARYeaHR0cHM6Ly93d3cuYXBwbGUuY29tL2FwcGxlY2EvMIHDBggrBgEFBQcCAjCBthqBs1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMA0GCSqGSIb3DQEBBQUAA4IBAQBcNplMLXi37Yyb3PN3m%2FJ20ncwT8EfhYOFG5k9RzfyqZtAjizUsZAS2L70c5vu0mQPy3lPNNiiPvl4%2F2vIB%2Bx9OYOLUyDTOMSxv5pPCmv%2FK%2FxZpwUJfBdAVhEedNO3iyM7R6PVbyTi69G3cN8PReEnyvFteO3ntRcXqNx%2BIjXKJdXZD9Zr1KIkIxH3oayPc4FgxhtbCS%2BSsvhESPBgOJ4V9T0mZyCKM2r3DYLP3uujL%2FlTaltkwGMzd%2Fc6ByxW69oPIQ7aunMZT7XZNn%2FBh1XZp5m5MkL72NVxnn6hUrcbvZNCJBIqxw8dtk2cXmPIS4AXUKqK1drk%2FNAJBzewdXUhMYIByzCCAccCAQEwgaMwgZYxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkCCA7rV4fnngmNMAkGBSsOAwIaBQAwDQYJKoZIhvcNAQEBBQAEggEACPhAH%2BwPTgurg%2BVE0T0VDNIgGL95UNMRozLBS9WKxffCoLaARq6m36HMnlJJT%2FWe2O6ZwBwFDNGhDbNMDc8EIs2jcZ%2FPqjOQOTnfJVoMiJr9Bu3Ss8Ka4NfzuKsYkOU7SxrencFHURawREY%2BglgcJ%2FQYYKA4hYXC6SwCtMAO7KEA6OMFvHZiHsXT7fIgGWjXq3FcoulfmPC1b98WaHsiHdVJx%2BC%2BM0eRiZmGkySpGsNKZF0vuz4mly6JV7HWHL8MAEdEEDIL03ClYlwLH8YGdgyh6DeaZIXp4DVQq0kMXLV4CtBm0wY8Jl11nhes%2BlXG9rV6Ad3e2sm1pAkG0mJTTg%3D%3D'
receipt_data = 'MIIWpQYJKoZIhvcNAQcCoIIWljCCFpICAQExCzAJBgUrDgMCGgUAMIIGRgYJKoZIhvcNAQcBoIIGNwSCBjMxggYvMAoCAQgCAQEEAhYAMAoCARQCAQEEAgwAMAsCAQECAQEEAwIBADALAgELAgEBBAMCAQAwCwIBDwIBAQQDAgEAMAsCARACAQEEAwIBADALAgEZAgEBBAMCAQMwDAIBAwIBAQQEDAIyNDAMAgEKAgEBBAQWAjQrMAwCAQ4CAQEEBAICAJ4wDQIBDQIBAQQFAgMB%2FowwDQIBEwIBAQQFDAMxLjAwDgIBCQIBAQQGAgRQMjU2MBgCAQQCAQIEEGLQjvbwia8LdbHEKphBbw0wGwIBAAIBAQQTDBFQcm9kdWN0aW9uU2FuZGJveDAcAgEFAgEBBBTiJWtzi5LILMppYNeP65hAms%2BfIzAdAgECAgEBBBUME2NvbS5xaW1lbmcudGFucHV5dW4wHgIBDAIBAQQWFhQyMDIwLTExLTI3VDA3OjA0OjMxWjAeAgESAgEBBBYWFDIwMTMtMDgtMDFUMDc6MDA6MDBaMEcCAQcCAQEEP%2FwSCUfw%2B5%2F67ApEF4mbICns7jzFPg7PbiXQlM37HSzqBtfeBTQiCudNHMRI2G5o9QzjnFhWfE577l0AZZ31VzBRAgEGAgEBBEmEv7Lmya12iyWVsEKdQvTktPTnywWn%2F97fILd2lX9%2BMW6Ui4KkBYlsTcj%2BDkubBHB5yTsGeoDXOdrlQSf4NaUrESwko0tzlbfgMIIBXwIBEQIBAQSCAVUxggFRMAsCAgasAgEBBAIWADALAgIGrQIBAQQCDAAwCwICBrACAQEEAhYAMAsCAgayAgEBBAIMADALAgIGswIBAQQCDAAwCwICBrQCAQEEAgwAMAsCAga1AgEBBAIMADALAgIGtgIBAQQCDAAwDAICBqUCAQEEAwIBATAMAgIGqwIBAQQDAgEAMAwCAgauAgEBBAMCAQAwDAICBq8CAQEEAwIBADAMAgIGsQIBAQQDAgEAMBsCAganAgEBBBIMEDEwMDAwMDA3NDI2NjYwMjMwGwICBqkCAQEEEgwQMTAwMDAwMDc0MjY2NjAyMzAfAgIGqAIBAQQWFhQyMDIwLTExLTE3VDA1OjU3OjMyWjAfAgIGqgIBAQQWFhQyMDIwLTExLTE3VDA1OjU3OjMyWjAlAgIGpgIBAQQcDBpjb20ucWltZW5nLnRhbnB1eXVuX3Rlc3RfMTCCAV8CARECAQEEggFVMYIBUTALAgIGrAIBAQQCFgAwCwICBq0CAQEEAgwAMAsCAgawAgEBBAIWADALAgIGsgIBAQQCDAAwCwICBrMCAQEEAgwAMAsCAga0AgEBBAIMADALAgIGtQIBAQQCDAAwCwICBrYCAQEEAgwAMAwCAgalAgEBBAMCAQEwDAICBqsCAQEEAwIBADAMAgIGrgIBAQQDAgEAMAwCAgavAgEBBAMCAQAwDAICBrECAQEEAwIBADAbAgIGpwIBAQQSDBAxMDAwMDAwNzQyODg1MzM4MBsCAgapAgEBBBIMEDEwMDAwMDA3NDI4ODUzMzgwHwICBqgCAQEEFhYUMjAyMC0xMS0xN1QxMjoyNDo1MFowHwICBqoCAQEEFhYUMjAyMC0xMS0xN1QxMjoyNDo1MFowJQICBqYCAQEEHAwaY29tLnFpbWVuZy50YW5wdXl1bl90ZXN0XzMwggFkAgERAgEBBIIBWjGCAVYwCwICBqwCAQEEAhYAMAsCAgatAgEBBAIMADALAgIGsAIBAQQCFgAwCwICBrICAQEEAgwAMAsCAgazAgEBBAIMADALAgIGtAIBAQQCDAAwCwICBrUCAQEEAgwAMAsCAga2AgEBBAIMADAMAgIGpQIBAQQDAgEBMAwCAgarAgEBBAMCAQEwDAICBq4CAQEEAwIBADAMAgIGrwIBAQQDAgEAMAwCAgaxAgEBBAMCAQAwGwICBqcCAQEEEgwQMTAwMDAwMDc0NzE0MjA5MzAbAgIGqQIBAQQSDBAxMDAwMDAwNzQ3MTQyMDkzMB8CAgaoAgEBBBYWFDIwMjAtMTEtMjdUMDc6MDQ6MzFaMB8CAgaqAgEBBBYWFDIwMjAtMTEtMjdUMDc6MDQ6MzFaMCoCAgamAgEBBCEMH2NvbS5xaW1lbmcudGFucHV5dW5fdGFucHViZWkzODiggg5lMIIFfDCCBGSgAwIBAgIIDutXh%2BeeCY0wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTUxMTEzMDIxNTA5WhcNMjMwMjA3MjE0ODQ3WjCBiTE3MDUGA1UEAwwuTWFjIEFwcCBTdG9yZSBhbmQgaVR1bmVzIFN0b3JlIFJlY2VpcHQgU2lnbmluZzEsMCoGA1UECwwjQXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMxEzARBgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApc%2BB%2FSWigVvWh%2B0j2jMcjuIjwKXEJss9xp%2FsSg1Vhv%2BkAteXyjlUbX1%2FslQYncQsUnGOZHuCzom6SdYI5bSIcc8%2FW0YuxsQduAOpWKIEPiF41du30I4SjYNMWypoN5PC8r0exNKhDEpYUqsS4%2B3dH5gVkDUtwswSyo1IgfdYeFRr6IwxNh9KBgxHVPM3kLiykol9X6SFSuHAnOC6pLuCl2P0K5PB%2FT5vysH1PKmPUhrAJQp2Dt7%2Bmf7%2Fwmv1W16sc1FJCFaJzEOQzI6BAtCgl7ZcsaFpaYeQEGgmJjm4HRBzsApdxXPQ33Y72C3ZiB7j7AfP4o7Q0%2FomVYHv4gNJIwIDAQABo4IB1zCCAdMwPwYIKwYBBQUHAQEEMzAxMC8GCCsGAQUFBzABhiNodHRwOi8vb2NzcC5hcHBsZS5jb20vb2NzcDAzLXd3ZHIwNDAdBgNVHQ4EFgQUkaSc%2FMR2t5%2BgivRN9Y82Xe0rBIUwDAYDVR0TAQH%2FBAIwADAfBgNVHSMEGDAWgBSIJxcJqbYYYIvs67r2R1nFUlSjtzCCAR4GA1UdIASCARUwggERMIIBDQYKKoZIhvdjZAUGATCB%2FjCBwwYIKwYBBQUHAgIwgbYMgbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjA2BggrBgEFBQcCARYqaHR0cDovL3d3dy5hcHBsZS5jb20vY2VydGlmaWNhdGVhdXRob3JpdHkvMA4GA1UdDwEB%2FwQEAwIHgDAQBgoqhkiG92NkBgsBBAIFADANBgkqhkiG9w0BAQUFAAOCAQEADaYb0y4941srB25ClmzT6IxDMIJf4FzRjb69D70a%2FCWS24yFw4BZ3%2BPi1y4FFKwN27a4%2Fvw1LnzLrRdrjn8f5He5sWeVtBNephmGdvhaIJXnY4wPc%2Fzo7cYfrpn4ZUhcoOAoOsAQNy25oAQ5H3O5yAX98t5%2FGioqbisB%2FKAgXNnrfSemM%2Fj1mOC%2BRNuxTGf8bgpPyeIGqNKX86eOa1GiWoR1ZdEWBGLjwV%2F1CKnPaNmSAMnBjLP4jQBkulhgwHyvj3XKablbKtYdaG6YQvVMpzcZm8w7HHoZQ%2FOjbb9IYAYMNpIr7N4YtRHaLSPQjvygaZwXG56AezlHRTBhL8cTqDCCBCIwggMKoAMCAQICCAHevMQ5baAQMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYTAlVTMRMwEQYDVQQKEwpBcHBsZSBJbmMuMSYwJAYDVQQLEx1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEWMBQGA1UEAxMNQXBwbGUgUm9vdCBDQTAeFw0xMzAyMDcyMTQ4NDdaFw0yMzAyMDcyMTQ4NDdaMIGWMQswCQYDVQQGEwJVUzETMBEGA1UECgwKQXBwbGUgSW5jLjEsMCoGA1UECwwjQXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMxRDBCBgNVBAMMO0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyjhUpstWqsgkOUjpjO7sX7h%2FJpG8NFN6znxjgGF3ZF6lByO2Of5QLRVWWHAtfsRuwUqFPi%2Fw3oQaoVfJr3sY%2F2r6FRJJFQgZrKrbKjLtlmNoUhU9jIrsv2sYleADrAF9lwVnzg6FlTdq7Qm2rmfNUWSfxlzRvFduZzWAdjakh4FuOI%2FYKxVOeyXYWr9Og8GN0pPVGnG1YJydM05V%2BRJYDIa4Fg3B5XdFjVBIuist5JSF4ejEncZopbCj%2FGd%2BcLoCWUt3QpE5ufXN4UzvwDtIjKblIV39amq7pxY1YNLmrfNGKcnow4vpecBqYWcVsvD95Wi8Yl9uz5nd7xtj%2FpJlqwIDAQABo4GmMIGjMB0GA1UdDgQWBBSIJxcJqbYYYIvs67r2R1nFUlSjtzAPBgNVHRMBAf8EBTADAQH%2FMB8GA1UdIwQYMBaAFCvQaUeUdgn%2B9GuNLkCm90dNfwheMC4GA1UdHwQnMCUwI6AhoB%2BGHWh0dHA6Ly9jcmwuYXBwbGUuY29tL3Jvb3QuY3JsMA4GA1UdDwEB%2FwQEAwIBhjAQBgoqhkiG92NkBgIBBAIFADANBgkqhkiG9w0BAQUFAAOCAQEAT8%2FvWb4s9bJsL4%2FuE4cy6AU1qG6LfclpDLnZF7x3LNRn4v2abTpZXN%2BDAb2yriphcrGvzcNFMI%2Bjgw3OHUe08ZOKo3SbpMOYcoc7Pq9FC5JUuTK7kBhTawpOELbZHVBsIYAKiU5XjGtbPD2m%2Fd73DSMdC0omhz%2B6kZJMpBkSGW1X9XpYh3toiuSGjErr4kkUqqXdVQCprrtLMK7hoLG8KYDmCXflvjSiAcp%2F3OIK5ju4u%2By6YpXzBWNBgs0POx1MlaTbq%2FnJlelP5E3nJpmB6bz5tCnSAXpm4S6M9iGKxfh44YGuv9OQnamt86%2F9OBqWZzAcUaVc7HGKgrRsDwwVHzCCBLswggOjoAMCAQICAQIwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTA2MDQyNTIxNDAzNloXDTM1MDIwOTIxNDAzNlowYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5JGpCR%2BR2x5HUOsF7V55hC3rNqJXTFXsixmJ3vlLbPUHqyIwAugYPvhQCdN%2FQaiY%2BdHKZpwkaxHQo7vkGyrDH5WeegykR4tb1BY3M8vED03OFGnRyRly9V0O1X9fm%2FIlA7pVj01dDfFkNSMVSxVZHbOU9%2Facns9QusFYUGePCLQg98usLCBvcLY%2FATCMt0PPD5098ytJKBrI%2Fs61uQ7ZXhzWyz21Oq30Dw4AkguxIRYudNU8DdtiFqujcZJHU1XBry9Bs%2Fj743DN5qNMRX4fTGtQlkGJxHRiCxCDQYczioGxMFjsWgQyjGizjx3eZXP%2FZ15lvEnYdp8zFGWhd5TJLQIDAQABo4IBejCCAXYwDgYDVR0PAQH%2FBAQDAgEGMA8GA1UdEwEB%2FwQFMAMBAf8wHQYDVR0OBBYEFCvQaUeUdgn%2B9GuNLkCm90dNfwheMB8GA1UdIwQYMBaAFCvQaUeUdgn%2B9GuNLkCm90dNfwheMIIBEQYDVR0gBIIBCDCCAQQwggEABgkqhkiG92NkBQEwgfIwKgYIKwYBBQUHAgEWHmh0dHBzOi8vd3d3LmFwcGxlLmNvbS9hcHBsZWNhLzCBwwYIKwYBBQUHAgIwgbYagbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjANBgkqhkiG9w0BAQUFAAOCAQEAXDaZTC14t%2B2Mm9zzd5vydtJ3ME%2FBH4WDhRuZPUc38qmbQI4s1LGQEti%2B9HOb7tJkD8t5TzTYoj75eP9ryAfsfTmDi1Mg0zjEsb%2BaTwpr%2Fyv8WacFCXwXQFYRHnTTt4sjO0ej1W8k4uvRt3DfD0XhJ8rxbXjt57UXF6jcfiI1yiXV2Q%2FWa9SiJCMR96Gsj3OBYMYbWwkvkrL4REjwYDieFfU9JmcgijNq9w2Cz97roy%2F5U2pbZMBjM3f3OgcsVuvaDyEO2rpzGU%2B12TZ%2FwYdV2aeZuTJC%2B9jVcZ5%2BoVK3G72TQiQSKscPHbZNnF5jyEuAF1CqitXa5PzQCQc3sHV1ITGCAcswggHHAgEBMIGjMIGWMQswCQYDVQQGEwJVUzETMBEGA1UECgwKQXBwbGUgSW5jLjEsMCoGA1UECwwjQXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMxRDBCBgNVBAMMO0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENlcnRpZmljYXRpb24gQXV0aG9yaXR5AggO61eH554JjTAJBgUrDgMCGgUAMA0GCSqGSIb3DQEBAQUABIIBADTZOLZ%2BK7WCPIH05HL71QXr%2FxfArUIiDDW0F2r2yRaFUSU%2B%2FYVE2TAVdLM3w6rXKNZyB652rsEP4t%2BnrjAOiTlAgDY35ssBxQy3ds00DMAxC2afdNApiUJRAKIksXT%2BweNQSivN6RzqYOszB7dK1CKdpcfOgZ%2BVJQ3mYgeE00vsmRg%2BhNmdDui8EmkVtPq5uNDXc2WM%2FSIyBVtf2qOFtWX7kYgvEmfzXAxgrnKmBb6A0Ty4rKCrJ%2BANgOo%2B0jfK6AfgeR4hGl0IhqzRdiVuuKq6einG0YmcxV4X0GqxD75HBGZwjTEYw9ScAT6Au7m81dVeLR76o0XPFXUUNmjJ7LA%3D'
product_id = 'com.qimeng.tanpuyun_tanpubei388'
res = apple_pay(receipt_data, product_id)
print(res)
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment