Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in
Toggle navigation
T
tamp_course_order
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
彭熊
tamp_course_order
Commits
f03624e7
Commit
f03624e7
authored
Nov 27, 2020
by
pengxiong@wealthgrow.cn
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
全部订单查询
parent
06492812
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
9434 additions
and
63 deletions
+9434
-63
engine.py
app/api/engine.py
+3
-4
errors.py
app/config/errors.py
+4
-0
order.py
app/controller/order.py
+35
-2
account_topup_order.py
app/model/account_topup_order.py
+15
-15
base.py
app/model/base.py
+2
-1
curriculum_order.py
app/model/curriculum_order.py
+2
-2
version1.py
app/router/version1.py
+2
-0
order_service.py
app/service/order_service.py
+118
-30
apple_pay.py
app/utils/apple_pay.py
+41
-9
tamp_course_order.log
logs/tamp_course_order.log
+9212
-0
No files found.
app/api/engine.py
View file @
f03624e7
...
@@ -14,8 +14,7 @@ import os
...
@@ -14,8 +14,7 @@ import os
import
sys
import
sys
import
yaml
import
yaml
from
sqlalchemy
import
create_engine
from
sqlalchemy
import
create_engine
from
sqlalchemy.orm
import
sessionmaker
from
sqlalchemy.orm
import
sessionmaker
,
scoped_session
env
=
sys
.
argv
[
-
1
]
env
=
sys
.
argv
[
-
1
]
work_dir
=
os
.
getcwd
()
work_dir
=
os
.
getcwd
()
...
@@ -44,8 +43,8 @@ tamp_pay_engine = create_engine(
...
@@ -44,8 +43,8 @@ tamp_pay_engine = create_engine(
charset
=
"utf8"
),
charset
=
"utf8"
),
echo
=
True
echo
=
True
)
)
tamp_user_session
=
s
essionmaker
(
bind
=
tamp_user_engine
)()
tamp_user_session
=
s
coped_session
(
sessionmaker
(
bind
=
tamp_user_engine
)
)()
tamp_pay_session
=
s
essionmaker
(
bind
=
tamp_pay_engine
)()
tamp_pay_session
=
s
coped_session
(
sessionmaker
(
bind
=
tamp_pay_engine
)
)()
# redis = redis.StrictRedis(
# redis = redis.StrictRedis(
# host=config[env]['redis']['host'],
# host=config[env]['redis']['host'],
...
...
app/config/errors.py
View file @
f03624e7
...
@@ -14,10 +14,14 @@ class Errors:
...
@@ -14,10 +14,14 @@ class Errors:
USER_ALREADY_EXISTS
=
'9002'
USER_ALREADY_EXISTS
=
'9002'
APPLE_VOCHER_INVALID
=
'9003'
APPLE_VOCHER_INVALID
=
'9003'
TANGPU_BALANCE_NOT_ENOUGH
=
'9004'
TANGPU_BALANCE_NOT_ENOUGH
=
'9004'
APPLE_VOCHER_USED
=
'9005'
INPUT_PARAMS_ERROR
=
'9006'
MSG
=
{
MSG
=
{
TOKEN_INVALID
:
'TOKEN失效'
,
TOKEN_INVALID
:
'TOKEN失效'
,
USER_ALREADY_EXISTS
:
'用户已经存在'
,
USER_ALREADY_EXISTS
:
'用户已经存在'
,
APPLE_VOCHER_INVALID
:
'苹果证书无效'
,
APPLE_VOCHER_INVALID
:
'苹果证书无效'
,
TANGPU_BALANCE_NOT_ENOUGH
:
'探普币余额不足'
,
TANGPU_BALANCE_NOT_ENOUGH
:
'探普币余额不足'
,
APPLE_VOCHER_USED
:
'该支付凭证已使用'
,
INPUT_PARAMS_ERROR
:
'入参错误'
}
}
app/controller/order.py
View file @
f03624e7
...
@@ -40,6 +40,7 @@ class TopUpOrder(Resource):
...
@@ -40,6 +40,7 @@ class TopUpOrder(Resource):
self
.
parser
.
add_argument
(
'amount'
,
type
=
float
,
required
=
True
,
help
=
'订单总额不能为空'
)
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
(
'pay_method'
,
type
=
int
,
required
=
True
,
help
=
'支付方式不能为空'
)
self
.
parser
.
add_argument
(
'receipt_data'
,
type
=
str
,
required
=
False
)
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
=
self
.
parser
.
parse_args
()
args
[
'user_id'
]
=
request
.
user_id
args
[
'user_id'
]
=
request
.
user_id
args
[
'remote_addr'
]
=
request
.
remote_addr
args
[
'remote_addr'
]
=
request
.
remote_addr
...
@@ -74,6 +75,8 @@ class ConsumeOrder(Resource):
...
@@ -74,6 +75,8 @@ class ConsumeOrder(Resource):
data
=
order_service
.
CurriculumOrderService
()
.
get_order
(
args
)
data
=
order_service
.
CurriculumOrderService
()
.
get_order
(
args
)
resp
=
request
.
return_success
resp
=
request
.
return_success
resp
[
'attributes'
]
=
data
resp
[
'attributes'
]
=
data
resp
=
make_response
(
resp
)
resp
.
hearders
=
{
'Content-Type'
:
'application/json;charset=UTF-8'
}
return
resp
return
resp
def
post
(
self
):
def
post
(
self
):
...
@@ -119,7 +122,7 @@ class TopUpOrderNotify(Resource):
...
@@ -119,7 +122,7 @@ class TopUpOrderNotify(Resource):
if
res
[
'success'
]:
if
res
[
'success'
]:
order_service
.
topUpSuccessAction
(
res
[
'order_no'
])
order_service
.
topUpSuccessAction
(
res
[
'order_no'
])
resp
=
make_response
(
res
[
'body'
])
resp
=
make_response
(
res
[
'body'
])
resp
.
hearders
[
'Content-Type'
]
=
res
[
'header'
][
'Content-Type
'
]
resp
.
hearders
=
res
[
'header
'
]
return
resp
return
resp
def
put
(
self
,
id
):
def
put
(
self
,
id
):
...
@@ -150,7 +153,7 @@ class ConsumeOrderNotify(Resource):
...
@@ -150,7 +153,7 @@ class ConsumeOrderNotify(Resource):
if
res
[
'success'
]:
if
res
[
'success'
]:
order_service
.
consumeSucessAction
(
res
[
'order_no'
])
order_service
.
consumeSucessAction
(
res
[
'order_no'
])
resp
=
make_response
(
res
[
'body'
])
resp
=
make_response
(
res
[
'body'
])
resp
.
hearders
[
'Content-Type'
]
=
res
[
'header'
][
'Content-Type
'
]
resp
.
hearders
=
res
[
'header
'
]
return
resp
return
resp
def
put
(
self
,
id
):
def
put
(
self
,
id
):
...
@@ -184,6 +187,36 @@ class AccountBalance(Resource):
...
@@ -184,6 +187,36 @@ class AccountBalance(Resource):
"""."""
"""."""
pass
pass
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
):
def
delete
(
self
,
id
):
"""."""
"""."""
pass
pass
\ No newline at end of file
app/model/account_topup_order.py
View file @
f03624e7
...
@@ -13,18 +13,18 @@ from app.model.base import Base
...
@@ -13,18 +13,18 @@ from app.model.base import Base
from
app.model.base
import
BaseModel
from
app.model.base
import
BaseModel
import
time
import
time
class
AccountTopupOrder
(
Base
,
BaseModel
):
#
class AccountTopupOrder(Base, BaseModel):
"""账户探普币充值表"""
#
"""账户探普币充值表"""
__tablename__
=
'account_topup_order'
#
__tablename__ = 'account_topup_order'
#
id
=
Column
(
String
(
64
),
primary_key
=
True
)
#
id = Column(String(64), primary_key=True)
order_no
=
Column
(
String
(
50
),
comment
=
'订单号'
)
#
order_no = Column(String(50), comment='订单号')
transaction_serial_no
=
Column
(
String
(
50
),
server_default
=
''
,
comment
=
'交易流水号'
)
#
transaction_serial_no = Column(String(50), server_default='', comment='交易流水号')
user_id
=
Column
(
String
(
64
),
comment
=
'用户ID'
)
#
user_id = Column(String(64), comment='用户ID')
amount
=
Column
(
BigInteger
,
comment
=
'订单总额'
)
#
amount = Column(BigInteger, comment='订单总额')
order_status
=
Column
(
Integer
,
server_default
=
text
(
'0'
),
comment
=
'订单状态:0:未支付,1:已支付,2:已退款'
)
#
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:苹果支付'
)
#
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
=
'创建时间'
)
#
create_time = Column(DateTime(timezone=True), server_default=func.now(), comment='创建时间')
pay_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
=
'完成时间'
)
#
complete_time = Column(DateTime(timezone=True), server_default=func.now(), comment='完成时间')
del_flag
=
Column
(
Integer
,
server_default
=
text
(
'0'
),
comment
=
'是否删除,0:未删除,1:已删除'
)
#
del_flag = Column(Integer, server_default=text('0'), comment='是否删除,0:未删除,1:已删除')
app/model/base.py
View file @
f03624e7
...
@@ -18,4 +18,5 @@ class BaseModel:
...
@@ -18,4 +18,5 @@ class BaseModel:
pass
pass
def
to_dict
(
self
):
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
}
app/model/curriculum_order.py
View file @
f03624e7
...
@@ -47,7 +47,7 @@ class OrderFlow(Base, BaseModel):
...
@@ -47,7 +47,7 @@ class OrderFlow(Base, BaseModel):
ab_type
=
Column
(
String
(
3
),
comment
=
'产品类型'
)
ab_type
=
Column
(
String
(
3
),
comment
=
'产品类型'
)
ab_proid
=
Column
(
String
(
64
),
comment
=
'产品ID'
)
ab_proid
=
Column
(
String
(
64
),
comment
=
'产品ID'
)
ab_pro_siid
=
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_name
=
Column
(
String
(
32
),
comment
=
'产品规格规格名称'
)
ab_si_code
=
Column
(
String
(
16
),
comment
=
'产品规格规格编码'
)
ab_si_code
=
Column
(
String
(
16
),
comment
=
'产品规格规格编码'
)
ab_si_pattern
=
Column
(
String
(
3
),
comment
=
'产品规格定价模式'
)
ab_si_pattern
=
Column
(
String
(
3
),
comment
=
'产品规格定价模式'
)
...
@@ -59,6 +59,6 @@ class OrderFlow(Base, BaseModel):
...
@@ -59,6 +59,6 @@ class OrderFlow(Base, BaseModel):
complete_time
=
Column
(
DateTime
(
timezone
=
True
),
default
=
func
.
now
(),
comment
=
'完成时间'
)
complete_time
=
Column
(
DateTime
(
timezone
=
True
),
default
=
func
.
now
(),
comment
=
'完成时间'
)
updatetime
=
Column
(
DateTime
,
comment
=
'修改时间'
)
updatetime
=
Column
(
DateTime
,
comment
=
'修改时间'
)
updateby
=
Column
(
String
(
64
),
comment
=
'修改人'
)
updateby
=
Column
(
String
(
64
),
comment
=
'修改人'
)
deletetag
=
Column
(
String
(
3
),
comment
=
'删除标识'
)
deletetag
=
Column
(
String
(
3
),
default
=
"0"
,
comment
=
'删除标识'
)
unionid
=
Column
(
String
(
64
),
comment
=
'微信unionid'
)
unionid
=
Column
(
String
(
64
),
comment
=
'微信unionid'
)
transaction_serial_no
=
Column
(
String
(
64
),
comment
=
'交易流水号'
)
transaction_serial_no
=
Column
(
String
(
64
),
comment
=
'交易流水号'
)
app/router/version1.py
View file @
f03624e7
...
@@ -21,4 +21,6 @@ def add_route(api):
...
@@ -21,4 +21,6 @@ def add_route(api):
api
.
add_resource
(
ConsumeOrderNotify
,
'/tamp_order/micro_shop/consumeOrderNotify'
)
api
.
add_resource
(
ConsumeOrderNotify
,
'/tamp_order/micro_shop/consumeOrderNotify'
)
# 查询探普币余额
# 查询探普币余额
api
.
add_resource
(
AccountBalance
,
'/tamp_order/micro_shop/accountBalance'
)
api
.
add_resource
(
AccountBalance
,
'/tamp_order/micro_shop/accountBalance'
)
# 查询全部订单
api
.
add_resource
(
AllOrders
,
'/tamp_order/micro_shop/AllOrders'
)
app/service/order_service.py
View file @
f03624e7
...
@@ -14,7 +14,7 @@ from app.api.engine import tamp_pay_session, tamp_user_session
...
@@ -14,7 +14,7 @@ from app.api.engine import tamp_pay_session, tamp_user_session
from
app.config.errors
import
Errors
from
app.config.errors
import
Errors
from
app.controller.errorhandler
import
CustomFlaskErr
from
app.controller.errorhandler
import
CustomFlaskErr
from
app.model.account_balance
import
AccountBalance
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.curriculum_order
import
OrderFlow
from
app.model.tamp_user_models
import
CurriculumPrice
,
CurriculumColumn
,
CurriculumRes
from
app.model.tamp_user_models
import
CurriculumPrice
,
CurriculumColumn
,
CurriculumRes
from
xml.etree
import
cElementTree
as
etree
from
xml.etree
import
cElementTree
as
etree
...
@@ -34,10 +34,17 @@ class TopUpOrderService:
...
@@ -34,10 +34,17 @@ class TopUpOrderService:
pageSize
=
args
[
'pageSize'
]
pageSize
=
args
[
'pageSize'
]
user_id
=
args
[
'user_id'
]
user_id
=
args
[
'user_id'
]
offset
=
(
pageNumber
-
1
)
*
pageSize
offset
=
(
pageNumber
-
1
)
*
pageSize
totalSize
=
len
(
tamp_pay_session
.
query
(
AccountTopupOrder
.
id
)
.
filter
(
and_
(
AccountTopupOrder
.
user_id
==
user_id
,
AccountTopupOrder
.
order_status
==
1
))
.
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_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
()
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
{
return
{
'content'
:
[
r
.
to_dict
()
for
r
in
res
]
,
'content'
:
res
,
'pageNum'
:
pageNumber
,
'pageNum'
:
pageNumber
,
'pageSize'
:
pageSize
,
'pageSize'
:
pageSize
,
'totalSize'
:
totalSize
'totalSize'
:
totalSize
...
@@ -45,12 +52,12 @@ class TopUpOrderService:
...
@@ -45,12 +52,12 @@ class TopUpOrderService:
def
create_order
(
self
,
args
):
def
create_order
(
self
,
args
):
args
[
'
order_no
'
]
=
time
.
strftime
(
'
%
Y
%
m
%
d'
,
time
.
localtime
(
time
.
time
()))
+
str
(
int
(
time
.
time
()
*
100000
))
args
[
'
ab_ordernum
'
]
=
time
.
strftime
(
'
%
Y
%
m
%
d'
,
time
.
localtime
(
time
.
time
()))
+
str
(
int
(
time
.
time
()
*
100000
))
args
[
'id'
]
=
AccountTopupOrder
.
__tablename__
+
str
(
int
(
time
.
time
()
*
100000
))
args
[
'id'
]
=
OrderFlow
.
__tablename__
+
str
(
int
(
time
.
time
()
*
100000
))
args
[
'amount'
]
=
args
[
'amount'
]
*
100
args
[
'amount'
]
=
args
[
'amount'
]
*
100
args
[
'
order_status'
]
=
0
args
[
'
ab_status'
]
=
'WAIT'
subject
=
'探普币充值'
subject
=
'探普币充值'
out_trade_no
=
args
[
'
order_no
'
]
out_trade_no
=
args
[
'
ab_ordernum
'
]
notify_path
=
'/tamp_order/micro_shop/topUpOrderNotify'
notify_path
=
'/tamp_order/micro_shop/topUpOrderNotify'
pay_params
=
None
pay_params
=
None
if
args
[
'pay_method'
]
==
5
:
if
args
[
'pay_method'
]
==
5
:
...
@@ -65,10 +72,20 @@ class TopUpOrderService:
...
@@ -65,10 +72,20 @@ class TopUpOrderService:
pay_params
=
res
pay_params
=
res
elif
args
[
'pay_method'
]
==
7
:
elif
args
[
'pay_method'
]
==
7
:
# 苹果支付
# 苹果支付
# 入参校验
receipt_data
=
args
.
get
(
'receipt_data'
,
''
)
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
)
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
():
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'
]))
tamp_pay_session
.
add
(
AccountBalance
(
id
=
AccountBalance
.
__tablename__
+
str
(
int
(
time
.
time
()
*
100000
)),
user_id
=
args
[
'user_id'
],
apple_balance
=
args
[
'amount'
]))
else
:
else
:
...
@@ -78,10 +95,15 @@ class TopUpOrderService:
...
@@ -78,10 +95,15 @@ class TopUpOrderService:
})
})
args
.
pop
(
'remote_addr'
,
''
)
args
.
pop
(
'remote_addr'
,
''
)
args
.
pop
(
'receipt_data'
,
''
)
args
.
pop
(
'receipt_data'
,
''
)
order_info
=
AccountTopupOrder
(
**
args
)
args
.
pop
(
'product_id'
,
''
)
tamp_pay_session
.
add
(
order_info
)
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
.
commit
()
tamp_pay_session
.
close
()
return
pay_params
return
pay_params
...
@@ -96,22 +118,32 @@ class CurriculumOrderService:
...
@@ -96,22 +118,32 @@ class CurriculumOrderService:
pageSize
=
args
[
'pageSize'
]
pageSize
=
args
[
'pageSize'
]
user_id
=
args
[
'user_id'
]
user_id
=
args
[
'user_id'
]
offset
=
(
pageNumber
-
1
)
*
pageSize
offset
=
(
pageNumber
-
1
)
*
pageSize
curriculum_column
=
tamp_user_session
.
query
(
CurriculumColumn
)
.
all
()
curriculum_column
=
tamp_user_session
.
query
(
CurriculumColumn
.
id
,
CurriculumColumn
.
title
,
CurriculumColumn
.
cover
,
CurriculumColumn
.
info
)
.
all
()
curriculum_res
=
tamp_user_session
.
query
(
CurriculumRes
)
.
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
()
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_column
=
{
r
[
0
]:
{
'title'
:
r
[
1
],
'cover'
:
r
[
2
],
'info'
:
r
[
3
]}
for
r
in
curriculum_column
}
curriculum_res
=
{
r
.
id
:
r
.
to_dict
()
for
r
in
curriculum_res
}
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'
]
orders
=
[
r
.
to_dict
()
for
r
in
res
if
r
.
to_dict
()[
'ab_status'
]
==
'SUCCESS'
]
temp_orders
=
[]
for
order
in
orders
:
for
order
in
orders
:
prod_type
=
order
.
get
(
'ab_si_type'
,
''
)
prod_type
=
order
.
get
(
'ab_si_type'
,
''
)
prod_id
=
order
.
get
(
'ab_proid'
,
''
)
prod_id
=
order
.
get
(
'ab_proid'
,
''
)
if
prod_type
==
'1'
:
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'
]:
elif
prod_type
in
[
'3'
,
'4'
,
'5'
]:
order
[
'prod_info'
]
=
curriculum_res
.
get
(
prod_id
,
None
)
order
=
{
**
order
,
**
curriculum_res
.
get
(
prod_id
,
None
)}
totalSize
=
len
(
orders
)
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
{
return
{
'content'
:
orders
[
offset
:
offset
+
pageSize
]
,
'content'
:
temp_orders
,
'pageNum'
:
pageNumber
,
'pageNum'
:
pageNumber
,
'pageSize'
:
pageSize
,
'pageSize'
:
pageSize
,
'totalSize'
:
totalSize
'totalSize'
:
totalSize
...
@@ -171,22 +203,22 @@ class CurriculumOrderService:
...
@@ -171,22 +203,22 @@ class CurriculumOrderService:
args
.
pop
(
'remote_addr'
,
''
)
args
.
pop
(
'remote_addr'
,
''
)
order_info
=
OrderFlow
(
**
args
)
order_info
=
OrderFlow
(
**
args
)
tamp_user_session
.
add
(
order_info
)
tamp_user_session
.
add
(
order_info
)
tamp_user_session
.
commit
()
tamp_pay_session
.
commit
()
tamp_pay_session
.
commit
()
tamp_user_session
.
commit
()
return
pay_params
return
pay_params
def
topUpSuccessAction
(
order_no
):
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
return
False
tamp_
pay_session
.
query
(
AccountTopupOrder
)
.
filter
(
AccountTopupOrder
.
order_no
==
order_no
)
.
update
({
tamp_
user_session
.
query
(
OrderFlow
)
.
filter
(
OrderFlow
.
ab_ordernum
==
order_no
)
.
update
({
'
order_status'
:
1
'
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
():
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
))
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):
...
@@ -194,20 +226,21 @@ def topUpSuccessAction(order_no):
tamp_pay_session
.
query
(
AccountBalance
)
.
filter
(
AccountBalance
.
user_id
==
account_topup_order
.
user_id
)
.
update
({
tamp_pay_session
.
query
(
AccountBalance
)
.
filter
(
AccountBalance
.
user_id
==
account_topup_order
.
user_id
)
.
update
({
'apple_balance'
:
AccountBalance
.
android_balance
+
account_topup_order
.
amount
'apple_balance'
:
AccountBalance
.
android_balance
+
account_topup_order
.
amount
})
})
tamp_user_session
.
commit
()
tamp_pay_session
.
commit
()
tamp_pay_session
.
commit
()
def
consumeSucessAction
(
order_no
):
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'
:
if
curriculum_order
.
ab_status
==
'SUCCESS'
:
return
False
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'
'ab_status'
:
'SUCCESS'
})
})
tamp_
pay
_session
.
commit
()
tamp_
user
_session
.
commit
()
def
getAccountBalance
(
user_id
):
def
getAccountBalance
(
user_id
):
...
@@ -260,3 +293,58 @@ def alipayWxPayCheck(res_info):
...
@@ -260,3 +293,58 @@ def alipayWxPayCheck(res_info):
body
=
'<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> </xml>'
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'
]}
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
}
app/utils/apple_pay.py
View file @
f03624e7
...
@@ -17,7 +17,7 @@ import pickle
...
@@ -17,7 +17,7 @@ import pickle
import
json
import
json
import
urllib
import
urllib
def
apple_pay
(
receipt_data
):
def
apple_pay
(
receipt_data
,
product_id
=
'com.qimeng.tanpuyun_test_3'
):
"""苹果支付"""
"""苹果支付"""
'''
'''
"receipt-data":receipt_data,
"receipt-data":receipt_data,
...
@@ -25,7 +25,7 @@ def apple_pay(receipt_data):
...
@@ -25,7 +25,7 @@ def apple_pay(receipt_data):
"password":"a1cdf6f00d3244aa9aa2c1c4a65b7ccf"
"password":"a1cdf6f00d3244aa9aa2c1c4a65b7ccf"
'''
'''
if
not
receipt_data
:
if
not
receipt_data
:
return
False
{
'success'
:
False
,
'transaction_id'
:
''
}
receipt_data
=
urllib
.
request
.
unquote
(
receipt_data
)
receipt_data
=
urllib
.
request
.
unquote
(
receipt_data
)
formdata
=
{
formdata
=
{
"receipt-data"
:
receipt_data
,
"receipt-data"
:
receipt_data
,
...
@@ -40,14 +40,46 @@ def apple_pay(receipt_data):
...
@@ -40,14 +40,46 @@ def apple_pay(receipt_data):
# 首先先去正式,如果是测试的话,就再去测试
# 首先先去正式,如果是测试的话,就再去测试
response
=
requests
.
post
(
AppStore_URL
[
0
],
data
=
dumped_json_string
)
response
=
requests
.
post
(
AppStore_URL
[
0
],
data
=
dumped_json_string
)
if
response
.
status_code
==
200
:
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
)
response
=
requests
.
post
(
AppStore_URL
[
1
],
data
=
dumped_json_string
)
if
response
.
status_code
==
200
:
if
response
.
status_code
==
200
:
if
response
.
json
()
.
get
(
"status"
)
==
0
:
resp_data
=
response
.
json
()
return
True
if
resp_data
.
get
(
"status"
)
==
0
:
return
True
receipt_info
=
resp_data
.
get
(
'latest_receipt_info'
,
''
)
return
False
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__'
:
if
__name__
==
'__main__'
:
receipt_data
=
'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'
# 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'
apple_pay
(
receipt_data
)
receipt_data
=
'MIIWqQYJKoZIhvcNAQcCoIIWmjCCFpYCAQExCzAJBgUrDgMCGgUAMIIGSgYJKoZIhvcNAQcBoIIGOwSCBjcxggYzMAoCAQgCAQEEAhYAMAoCARQCAQEEAgwAMAsCAQECAQEEAwIBADALAgELAgEBBAMCAQAwCwIBDwIBAQQDAgEAMAsCARACAQEEAwIBADALAgEZAgEBBAMCAQMwDAIBAwIBAQQEDAIyNDAMAgEKAgEBBAQWAjQrMAwCAQ4CAQEEBAICAJ4wDQIBDQIBAQQFAgMB
%2
FowwDQIBEwIBAQQFDAMxLjAwDgIBCQIBAQQGAgRQMjU2MBgCAQQCAQIEECFoXa2qntAaMHCVnn
%2
FcS4owGwIBAAIBAQQTDBFQcm9kdWN0aW9uU2FuZGJveDAcAgEFAgEBBBSTmGxo2TKF94LjpBfJ2KteVpGdrzAdAgECAgEBBBUME2NvbS5xaW1lbmcudGFucHV5dW4wHgIBDAIBAQQWFhQyMDIwLTExLTI3VDAzOjAzOjI5WjAeAgESAgEBBBYWFDIwMTMtMDgtMDFUMDc6MDA6MDBaMEUCAQcCAQEEPZW4TyLsU84d4pMWdAnvdQwBURzDdkB2vDmzWCs
%2
FLrxpz46ux3Y3KOftj1NdSiLmVFpjt2aF82IbBGI531gwWAIBBgIBAQRQkP3oLgCpkODRj1JRO1
%2
FBtz1DGSmIz9OiV99uKNIplOL0sU7Xq
%2
FO9Qe4eyugroMw2Vv1JGdezbSAEMgHTNeIpPPCTgzBhzRHG7RQkPVrKko0wggFfAgERAgEBBIIBVTGCAVEwCwICBqwCAQEEAhYAMAsCAgatAgEBBAIMADALAgIGsAIBAQQCFgAwCwICBrICAQEEAgwAMAsCAgazAgEBBAIMADALAgIGtAIBAQQCDAAwCwICBrUCAQEEAgwAMAsCAga2AgEBBAIMADAMAgIGpQIBAQQDAgEBMAwCAgarAgEBBAMCAQAwDAICBq4CAQEEAwIBADAMAgIGrwIBAQQDAgEAMAwCAgaxAgEBBAMCAQAwGwICBqcCAQEEEgwQMTAwMDAwMDc0MjY2NjAyMzAbAgIGqQIBAQQSDBAxMDAwMDAwNzQyNjY2MDIzMB8CAgaoAgEBBBYWFDIwMjAtMTEtMTdUMDU6NTc6MzJaMB8CAgaqAgEBBBYWFDIwMjAtMTEtMTdUMDU6NTc6MzJaMCUCAgamAgEBBBwMGmNvbS5xaW1lbmcudGFucHV5dW5fdGVzdF8xMIIBXwIBEQIBAQSCAVUxggFRMAsCAgasAgEBBAIWADALAgIGrQIBAQQCDAAwCwICBrACAQEEAhYAMAsCAgayAgEBBAIMADALAgIGswIBAQQCDAAwCwICBrQCAQEEAgwAMAsCAga1AgEBBAIMADALAgIGtgIBAQQCDAAwDAICBqUCAQEEAwIBATAMAgIGqwIBAQQDAgEAMAwCAgauAgEBBAMCAQAwDAICBq8CAQEEAwIBADAMAgIGsQIBAQQDAgEAMBsCAganAgEBBBIMEDEwMDAwMDA3NDI4ODUzMzgwGwICBqkCAQEEEgwQMTAwMDAwMDc0Mjg4NTMzODAfAgIGqAIBAQQWFhQyMDIwLTExLTE3VDEyOjI0OjUwWjAfAgIGqgIBAQQWFhQyMDIwLTExLTE3VDEyOjI0OjUwWjAlAgIGpgIBAQQcDBpjb20ucWltZW5nLnRhbnB1eXVuX3Rlc3RfMzCCAWMCARECAQEEggFZMYIBVTALAgIGrAIBAQQCFgAwCwICBq0CAQEEAgwAMAsCAgawAgEBBAIWADALAgIGsgIBAQQCDAAwCwICBrMCAQEEAgwAMAsCAga0AgEBBAIMADALAgIGtQIBAQQCDAAwCwICBrYCAQEEAgwAMAwCAgalAgEBBAMCAQEwDAICBqsCAQEEAwIBATAMAgIGrgIBAQQDAgEAMAwCAgavAgEBBAMCAQAwDAICBrECAQEEAwIBADAbAgIGpwIBAQQSDBAxMDAwMDAwNzQ3MDY4OTE0MBsCAgapAgEBBBIMEDEwMDAwMDA3NDcwNjg5MTQwHwICBqgCAQEEFhYUMjAyMC0xMS0yN1QwMzowMzoyOVowHwICBqoCAQEEFhYUMjAyMC0xMS0yN1QwMzowMzoyOVowKQICBqYCAQEEIAweY29tLnFpbWVuZy50YW5wdXl1bl90YW5wdWJlaTg4oIIOZTCCBXwwggRkoAMCAQICCA7rV4fnngmNMA0GCSqGSIb3DQEBBQUAMIGWMQswCQYDVQQGEwJVUzETMBEGA1UECgwKQXBwbGUgSW5jLjEsMCoGA1UECwwjQXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMxRDBCBgNVBAMMO0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE1MTExMzAyMTUwOVoXDTIzMDIwNzIxNDg0N1owgYkxNzA1BgNVBAMMLk1hYyBBcHAgU3RvcmUgYW5kIGlUdW5lcyBTdG9yZSBSZWNlaXB0IFNpZ25pbmcxLDAqBgNVBAsMI0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zMRMwEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKXPgf0looFb1oftI9ozHI7iI8ClxCbLPcaf7EoNVYb
%2
FpALXl8o5VG19f7JUGJ3ELFJxjmR7gs6JuknWCOW0iHHPP1tGLsbEHbgDqViiBD4heNXbt9COEo2DTFsqaDeTwvK9HsTSoQxKWFKrEuPt3R
%2
BYFZA1LcLMEsqNSIH3WHhUa
%2
BiMMTYfSgYMR1TzN5C4spKJfV
%2
BkhUrhwJzguqS7gpdj9CuTwf0
%2
Bb8rB9Typj1IawCUKdg7e
%2
Fpn
%2
B
%2
F8Jr9VterHNRSQhWicxDkMyOgQLQoJe2XLGhaWmHkBBoJiY5uB0Qc7AKXcVz0N92O9gt2Yge4
%2
BwHz
%2
BKO0NP6JlWB7
%2
BIDSSMCAwEAAaOCAdcwggHTMD8GCCsGAQUFBwEBBDMwMTAvBggrBgEFBQcwAYYjaHR0cDovL29jc3AuYXBwbGUuY29tL29jc3AwMy13d2RyMDQwHQYDVR0OBBYEFJGknPzEdrefoIr0TfWPNl3tKwSFMAwGA1UdEwEB
%2
FwQCMAAwHwYDVR0jBBgwFoAUiCcXCam2GGCL7Ou69kdZxVJUo7cwggEeBgNVHSAEggEVMIIBETCCAQ0GCiqGSIb3Y2QFBgEwgf4wgcMGCCsGAQUFBwICMIG2DIGzUmVsaWFuY2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2NlcHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRpZmljYXRpb24gcHJhY3RpY2Ugc3RhdGVtZW50cy4wNgYIKwYBBQUHAgEWKmh0dHA6Ly93d3cuYXBwbGUuY29tL2NlcnRpZmljYXRlYXV0aG9yaXR5LzAOBgNVHQ8BAf8EBAMCB4AwEAYKKoZIhvdjZAYLAQQCBQAwDQYJKoZIhvcNAQEFBQADggEBAA2mG9MuPeNbKwduQpZs0
%2
BiMQzCCX
%2
BBc0Y2
%2
BvQ
%2
B9GvwlktuMhcOAWd
%2
Fj4tcuBRSsDdu2uP78NS58y60Xa45
%2
FH
%2
BR3ubFnlbQTXqYZhnb4WiCV52OMD3P86O3GH66Z
%2
BGVIXKDgKDrAEDctuaAEOR9zucgF
%2
FfLefxoqKm4rAfygIFzZ630npjP49ZjgvkTbsUxn
%2
FG4KT8niBqjSl
%2
FOnjmtRolqEdWXRFgRi48Ff9Qipz2jZkgDJwYyz
%2
BI0AZLpYYMB8r491ymm5WyrWHWhumEL1TKc3GZvMOxx6GUPzo22
%2
FSGAGDDaSK
%2
BzeGLUR2i0j0I78oGmcFxuegHs5R0UwYS
%2
FHE6gwggQiMIIDCqADAgECAggB3rzEOW2gEDANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwHhcNMTMwMjA3MjE0ODQ3WhcNMjMwMjA3MjE0ODQ3WjCBljELMAkGA1UEBhMCVVMxEzARBgNVBAoMCkFwcGxlIEluYy4xLDAqBgNVBAsMI0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zMUQwQgYDVQQDDDtBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9ucyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMo4VKbLVqrIJDlI6Yzu7F
%2
B4fyaRvDRTes58Y4Bhd2RepQcjtjn
%2
BUC0VVlhwLX7EbsFKhT4v8N6EGqFXya97GP9q
%2
BhUSSRUIGayq2yoy7ZZjaFIVPYyK7L9rGJXgA6wBfZcFZ84OhZU3au0Jtq5nzVFkn8Zc0bxXbmc1gHY2pIeBbjiP2CsVTnsl2Fq
%2
FToPBjdKT1RpxtWCcnTNOVfkSWAyGuBYNweV3RY1QSLorLeSUheHoxJ3GaKWwo
%2
FxnfnC6AllLd0KRObn1zeFM78A7SIym5SFd
%2
FWpqu6cWNWDS5q3zRinJ6MOL6XnAamFnFbLw
%2
FeVovGJfbs
%2
BZ3e8bY
%2
F6SZasCAwEAAaOBpjCBozAdBgNVHQ4EFgQUiCcXCam2GGCL7Ou69kdZxVJUo7cwDwYDVR0TAQH
%2
FBAUwAwEB
%2
FzAfBgNVHSMEGDAWgBQr0GlHlHYJ
%2
FvRrjS5ApvdHTX8IXjAuBgNVHR8EJzAlMCOgIaAfhh1odHRwOi8vY3JsLmFwcGxlLmNvbS9yb290LmNybDAOBgNVHQ8BAf8EBAMCAYYwEAYKKoZIhvdjZAYCAQQCBQAwDQYJKoZIhvcNAQEFBQADggEBAE
%2
FP71m
%2
BLPWybC
%2
BP7hOHMugFNahui33JaQy52Re8dyzUZ
%2
BL9mm06WVzfgwG9sq4qYXKxr83DRTCPo4MNzh1HtPGTiqN0m6TDmHKHOz6vRQuSVLkyu5AYU2sKThC22R1QbCGAColOV4xrWzw9pv3e9w0jHQtKJoc
%2
FupGSTKQZEhltV
%2
FV6WId7aIrkhoxK6
%2
BJJFKql3VUAqa67SzCu4aCxvCmA5gl35b40ogHKf9ziCuY7uLvsumKV8wVjQYLNDzsdTJWk26v5yZXpT
%2
BRN5yaZgem8
%2
BbQp0gF6ZuEujPYhisX4eOGBrr
%2
FTkJ2prfOv
%2
FTgalmcwHFGlXOxxioK0bA8MFR8wggS7MIIDo6ADAgECAgECMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYTAlVTMRMwEQYDVQQKEwpBcHBsZSBJbmMuMSYwJAYDVQQLEx1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEWMBQGA1UEAxMNQXBwbGUgUm9vdCBDQTAeFw0wNjA0MjUyMTQwMzZaFw0zNTAyMDkyMTQwMzZaMGIxCzAJBgNVBAYTAlVTMRMwEQYDVQQKEwpBcHBsZSBJbmMuMSYwJAYDVQQLEx1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEWMBQGA1UEAxMNQXBwbGUgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOSRqQkfkdseR1DrBe1eeYQt6zaiV0xV7IsZid75S2z1B6siMALoGD74UAnTf0GomPnRymacJGsR0KO75Bsqwx
%2
BVnnoMpEeLW9QWNzPLxA9NzhRp0ckZcvVdDtV
%2
FX5vyJQO6VY9NXQ3xZDUjFUsVWR2zlPf2nJ7PULrBWFBnjwi0IPfLrCwgb3C2PwEwjLdDzw
%2
BdPfMrSSgayP7OtbkO2V4c1ss9tTqt9A8OAJILsSEWLnTVPA3bYharo3GSR1NVwa8vQbP4
%2
B
%2
BNwzeajTEV
%2
BH0xrUJZBicR0YgsQg0GHM4qBsTBY7FoEMoxos48d3mVz
%2
F2deZbxJ2HafMxRloXeUyS0CAwEAAaOCAXowggF2MA4GA1UdDwEB
%2
FwQEAwIBBjAPBgNVHRMBAf8EBTADAQH
%2
FMB0GA1UdDgQWBBQr0GlHlHYJ
%2
FvRrjS5ApvdHTX8IXjAfBgNVHSMEGDAWgBQr0GlHlHYJ
%2
FvRrjS5ApvdHTX8IXjCCAREGA1UdIASCAQgwggEEMIIBAAYJKoZIhvdjZAUBMIHyMCoGCCsGAQUFBwIBFh5odHRwczovL3d3dy5hcHBsZS5jb20vYXBwbGVjYS8wgcMGCCsGAQUFBwICMIG2GoGzUmVsaWFuY2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2NlcHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRpZmljYXRpb24gcHJhY3RpY2Ugc3RhdGVtZW50cy4wDQYJKoZIhvcNAQEFBQADggEBAFw2mUwteLftjJvc83eb8nbSdzBPwR
%2
BFg4UbmT1HN
%2
FKpm0COLNSxkBLYvvRzm
%2
B7SZA
%2
FLeU802KI
%2
B
%2
BXj
%2
Fa8gH7H05g4tTINM4xLG
%2
Fmk8Ka
%2
F8r
%2
FFmnBQl8F0BWER5007eLIztHo9VvJOLr0bdw3w9F4SfK8W147ee1Fxeo3H4iNcol1dkP1mvUoiQjEfehrI9zgWDGG1sJL5Ky
%2
BERI8GA4nhX1PSZnIIozavcNgs
%2
Fe66Mv
%2
BVNqW2TAYzN39zoHLFbr2g8hDtq6cxlPtdk2f8GHVdmnmbkyQvvY1XGefqFStxu9k0IkEirHDx22TZxeY8hLgBdQqorV2uT80AkHN7B1dSExggHLMIIBxwIBATCBozCBljELMAkGA1UEBhMCVVMxEzARBgNVBAoMCkFwcGxlIEluYy4xLDAqBgNVBAsMI0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zMUQwQgYDVQQDDDtBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9ucyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQIIDutXh
%2
BeeCY0wCQYFKw4DAhoFADANBgkqhkiG9w0BAQEFAASCAQCBIxiQnH53BQ
%2
BPBjUe0P
%2
Fzt292qiyKYodbyHBrlSzvhxpxywHPV0iohT
%2
Fw0yKeJMBrkMMnlSMYS4DKAW
%2
B14I0Aw55oEdB10TI
%2
BpwgYyBvmw7wBK5VsqSArxLM8PgFxAGWSUCcEvfAJR
%2
BDFr6AE3hGoyhaWl5nE9E4AgYV0lo1SXb1oezvurCbOXvFzpQ
%2
BSsqoGUQGMKBT2JDyWP0EsBLeO0DZC5L6sb1rHpGgy37JiPvaHzyQTXHmmp
%2
BtzdHFWj038vDH75c6Y5BstubyV0fP7JF
%2
BSZOkEw2
%2
FiGiwLTb4fDh6ezYXW8W95jGQYhNlFwYB4htLpNUiqIf9zXO5bYt8g'
\ No newline at end of file
receipt_data
=
'MIIWpwYJKoZIhvcNAQcCoIIWmDCCFpQCAQExCzAJBgUrDgMCGgUAMIIGSAYJKoZIhvcNAQcBoIIGOQSCBjUxggYxMAoCAQgCAQEEAhYAMAoCARQCAQEEAgwAMAsCAQECAQEEAwIBADALAgELAgEBBAMCAQAwCwIBDwIBAQQDAgEAMAsCARACAQEEAwIBADALAgEZAgEBBAMCAQMwDAIBAwIBAQQEDAIyNDAMAgEKAgEBBAQWAjQrMAwCAQ4CAQEEBAICAJ4wDQIBDQIBAQQFAgMB
%2
FowwDQIBEwIBAQQFDAMxLjAwDgIBCQIBAQQGAgRQMjU2MBgCAQQCAQIEEOWzvfojBKpi4XyjCVgzeXwwGwIBAAIBAQQTDBFQcm9kdWN0aW9uU2FuZGJveDAcAgEFAgEBBBS8mpyetKOpFhfXIFm3IkN5rIneAjAdAgECAgEBBBUME2NvbS5xaW1lbmcudGFucHV5dW4wHgIBDAIBAQQWFhQyMDIwLTExLTI3VDA2OjMwOjUxWjAeAgESAgEBBBYWFDIwMTMtMDgtMDFUMDc6MDA6MDBaMEECAQcCAQEEOao8m8wfYq2cA
%2
Bh8iHoZ3KvM4vt3yQ3ajlrYaOQUb8k
%2
F8OpA39ISfxYJrFZ
%2
F5YkGxgFUUHCsZMsOujBZAgEGAgEBBFGXJsFGOz1Sozqxkh
%2
BDiwFG
%2
Bbt5f
%2
F
%2
FWY33XaWFUaVPMTBL7hBrEzVWUJWXIxSSaNVcnf1ZnaV9MYshaJYkrplVavvVB8hsNT
%2
FQZbhezbLBqYBUwggFfAgERAgEBBIIBVTGCAVEwCwICBqwCAQEEAhYAMAsCAgatAgEBBAIMADALAgIGsAIBAQQCFgAwCwICBrICAQEEAgwAMAsCAgazAgEBBAIMADALAgIGtAIBAQQCDAAwCwICBrUCAQEEAgwAMAsCAga2AgEBBAIMADAMAgIGpQIBAQQDAgEBMAwCAgarAgEBBAMCAQAwDAICBq4CAQEEAwIBADAMAgIGrwIBAQQDAgEAMAwCAgaxAgEBBAMCAQAwGwICBqcCAQEEEgwQMTAwMDAwMDc0MjY2NjAyMzAbAgIGqQIBAQQSDBAxMDAwMDAwNzQyNjY2MDIzMB8CAgaoAgEBBBYWFDIwMjAtMTEtMTdUMDU6NTc6MzJaMB8CAgaqAgEBBBYWFDIwMjAtMTEtMTdUMDU6NTc6MzJaMCUCAgamAgEBBBwMGmNvbS5xaW1lbmcudGFucHV5dW5fdGVzdF8xMIIBXwIBEQIBAQSCAVUxggFRMAsCAgasAgEBBAIWADALAgIGrQIBAQQCDAAwCwICBrACAQEEAhYAMAsCAgayAgEBBAIMADALAgIGswIBAQQCDAAwCwICBrQCAQEEAgwAMAsCAga1AgEBBAIMADALAgIGtgIBAQQCDAAwDAICBqUCAQEEAwIBATAMAgIGqwIBAQQDAgEAMAwCAgauAgEBBAMCAQAwDAICBq8CAQEEAwIBADAMAgIGsQIBAQQDAgEAMBsCAganAgEBBBIMEDEwMDAwMDA3NDI4ODUzMzgwGwICBqkCAQEEEgwQMTAwMDAwMDc0Mjg4NTMzODAfAgIGqAIBAQQWFhQyMDIwLTExLTE3VDEyOjI0OjUwWjAfAgIGqgIBAQQWFhQyMDIwLTExLTE3VDEyOjI0OjUwWjAlAgIGpgIBAQQcDBpjb20ucWltZW5nLnRhbnB1eXVuX3Rlc3RfMzCCAWQCARECAQEEggFaMYIBVjALAgIGrAIBAQQCFgAwCwICBq0CAQEEAgwAMAsCAgawAgEBBAIWADALAgIGsgIBAQQCDAAwCwICBrMCAQEEAgwAMAsCAga0AgEBBAIMADALAgIGtQIBAQQCDAAwCwICBrYCAQEEAgwAMAwCAgalAgEBBAMCAQEwDAICBqsCAQEEAwIBATAMAgIGrgIBAQQDAgEAMAwCAgavAgEBBAMCAQAwDAICBrECAQEEAwIBADAbAgIGpwIBAQQSDBAxMDAwMDAwNzQ3MTI1MTU0MBsCAgapAgEBBBIMEDEwMDAwMDA3NDcxMjUxNTQwHwICBqgCAQEEFhYUMjAyMC0xMS0yN1QwNjozMDo1MVowHwICBqoCAQEEFhYUMjAyMC0xMS0yN1QwNjozMDo1MVowKgICBqYCAQEEIQwfY29tLnFpbWVuZy50YW5wdXl1bl90YW5wdWJlaTM4OKCCDmUwggV8MIIEZKADAgECAggO61eH554JjTANBgkqhkiG9w0BAQUFADCBljELMAkGA1UEBhMCVVMxEzARBgNVBAoMCkFwcGxlIEluYy4xLDAqBgNVBAsMI0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zMUQwQgYDVQQDDDtBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9ucyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNTExMTMwMjE1MDlaFw0yMzAyMDcyMTQ4NDdaMIGJMTcwNQYDVQQDDC5NYWMgQXBwIFN0b3JlIGFuZCBpVHVuZXMgU3RvcmUgUmVjZWlwdCBTaWduaW5nMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQClz4H9JaKBW9aH7SPaMxyO4iPApcQmyz3Gn
%2
BxKDVWG
%2
F6QC15fKOVRtfX
%2
ByVBidxCxScY5ke4LOibpJ1gjltIhxzz9bRi7GxB24A6lYogQ
%2
BIXjV27fQjhKNg0xbKmg3k8LyvR7E0qEMSlhSqxLj7d0fmBWQNS3CzBLKjUiB91h4VGvojDE2H0oGDEdU8zeQuLKSiX1fpIVK4cCc4Lqku4KXY
%2
FQrk8H9Pm
%2
FKwfU8qY9SGsAlCnYO3v6Z
%2
Fv
%2
FCa
%2
FVbXqxzUUkIVonMQ5DMjoEC0KCXtlyxoWlph5AQaCYmObgdEHOwCl3Fc9DfdjvYLdmIHuPsB8
%2
FijtDT
%2
BiZVge
%2
FiA0kjAgMBAAGjggHXMIIB0zA
%2
FBggrBgEFBQcBAQQzMDEwLwYIKwYBBQUHMAGGI2h0dHA6Ly9vY3NwLmFwcGxlLmNvbS9vY3NwMDMtd3dkcjA0MB0GA1UdDgQWBBSRpJz8xHa3n6CK9E31jzZd7SsEhTAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFIgnFwmpthhgi
%2
BzruvZHWcVSVKO3MIIBHgYDVR0gBIIBFTCCAREwggENBgoqhkiG92NkBQYBMIH
%2
BMIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMDYGCCsGAQUFBwIBFipodHRwOi8vd3d3LmFwcGxlLmNvbS9jZXJ0aWZpY2F0ZWF1dGhvcml0eS8wDgYDVR0PAQH
%2
FBAQDAgeAMBAGCiqGSIb3Y2QGCwEEAgUAMA0GCSqGSIb3DQEBBQUAA4IBAQANphvTLj3jWysHbkKWbNPojEMwgl
%2
FgXNGNvr0PvRr8JZLbjIXDgFnf4
%2
BLXLgUUrA3btrj
%2
B
%2
FDUufMutF2uOfx
%2
Fkd7mxZ5W0E16mGYZ2
%2
BFogledjjA9z
%2
FOjtxh
%2
BumfhlSFyg4Cg6wBA3LbmgBDkfc7nIBf3y3n8aKipuKwH8oCBc2et9J6Yz
%2
BPWY4L5E27FMZ
%2
FxuCk
%2
FJ4gao0pfzp45rUaJahHVl0RYEYuPBX
%2
FUIqc9o2ZIAycGMs
%2
FiNAGS6WGDAfK
%2
BPdcppuVsq1h1obphC9UynNxmbzDscehlD86Ntv0hgBgw2kivs3hi1EdotI9CO
%2
FKBpnBcbnoB7OUdFMGEvxxOoMIIEIjCCAwqgAwIBAgIIAd68xDltoBAwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTEzMDIwNzIxNDg0N1oXDTIzMDIwNzIxNDg0N1owgZYxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDKOFSmy1aqyCQ5SOmM7uxfuH8mkbw0U3rOfGOAYXdkXqUHI7Y5
%2
FlAtFVZYcC1
%2
BxG7BSoU
%2
BL
%2
FDehBqhV8mvexj
%2
FavoVEkkVCBmsqtsqMu2WY2hSFT2Miuy
%2
FaxiV4AOsAX2XBWfODoWVN2rtCbauZ81RZJ
%2
FGXNG8V25nNYB2NqSHgW44j9grFU57Jdhav06DwY3Sk9UacbVgnJ0zTlX5ElgMhrgWDcHld0WNUEi6Ky3klIXh6MSdxmilsKP8Z35wugJZS3dCkTm59c3hTO
%2
FAO0iMpuUhXf1qarunFjVg0uat80YpyejDi
%2
Bl5wGphZxWy8P3laLxiX27Pmd3vG2P
%2
BkmWrAgMBAAGjgaYwgaMwHQYDVR0OBBYEFIgnFwmpthhgi
%2
BzruvZHWcVSVKO3MA8GA1UdEwEB
%2
FwQFMAMBAf8wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01
%2
FCF4wLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybC5hcHBsZS5jb20vcm9vdC5jcmwwDgYDVR0PAQH
%2
FBAQDAgGGMBAGCiqGSIb3Y2QGAgEEAgUAMA0GCSqGSIb3DQEBBQUAA4IBAQBPz
%2
B9Zviz1smwvj
%2
B4ThzLoBTWobot9yWkMudkXvHcs1Gfi
%2
FZptOllc34MBvbKuKmFysa
%2
FNw0Uwj6ODDc4dR7Txk4qjdJukw5hyhzs
%2
Br0ULklS5MruQGFNrCk4QttkdUGwhgAqJTleMa1s8Pab93vcNIx0LSiaHP7qRkkykGRIZbVf1eliHe2iK5IaMSuviSRSqpd1VAKmuu0swruGgsbwpgOYJd
%2
BW
%2
BNKIByn
%2
Fc4grmO7i77LpilfMFY0GCzQ87HUyVpNur
%2
BcmV6U
%2
FkTecmmYHpvPm0KdIBembhLoz2IYrF
%2
BHjhga6
%2
F05Cdqa3zr
%2
F04GpZnMBxRpVzscYqCtGwPDBUfMIIEuzCCA6OgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwHhcNMDYwNDI1MjE0MDM2WhcNMzUwMjA5MjE0MDM2WjBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkkakJH5HbHkdQ6wXtXnmELes2oldMVeyLGYne
%2
BUts9QerIjAC6Bg
%2
B
%2
BFAJ039BqJj50cpmnCRrEdCju
%2
BQbKsMflZ56DKRHi1vUFjczy8QPTc4UadHJGXL1XQ7Vf1
%2
Bb8iUDulWPTV0N8WQ1IxVLFVkds5T39pyez1C6wVhQZ48ItCD3y6wsIG9wtj8BMIy3Q88PnT3zK0koGsj
%2
BzrW5DtleHNbLPbU6rfQPDgCSC7EhFi501TwN22IWq6NxkkdTVcGvL0Gz
%2
BPvjcM3mo0xFfh9Ma1CWQYnEdGILEINBhzOKgbEwWOxaBDKMaLOPHd5lc
%2
F9nXmW8Sdh2nzMUZaF3lMktAgMBAAGjggF6MIIBdjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH
%2
FBAUwAwEB
%2
FzAdBgNVHQ4EFgQUK9BpR5R2Cf70a40uQKb3R01
%2
FCF4wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01
%2
FCF4wggERBgNVHSAEggEIMIIBBDCCAQAGCSqGSIb3Y2QFATCB8jAqBggrBgEFBQcCARYeaHR0cHM6Ly93d3cuYXBwbGUuY29tL2FwcGxlY2EvMIHDBggrBgEFBQcCAjCBthqBs1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMA0GCSqGSIb3DQEBBQUAA4IBAQBcNplMLXi37Yyb3PN3m
%2
FJ20ncwT8EfhYOFG5k9RzfyqZtAjizUsZAS2L70c5vu0mQPy3lPNNiiPvl4
%2
F2vIB
%2
Bx9OYOLUyDTOMSxv5pPCmv
%2
FK
%2
FxZpwUJfBdAVhEedNO3iyM7R6PVbyTi69G3cN8PReEnyvFteO3ntRcXqNx
%2
BIjXKJdXZD9Zr1KIkIxH3oayPc4FgxhtbCS
%2
BSsvhESPBgOJ4V9T0mZyCKM2r3DYLP3uujL
%2
FlTaltkwGMzd
%2
Fc6ByxW69oPIQ7aunMZT7XZNn
%2
FBh1XZp5m5MkL72NVxnn6hUrcbvZNCJBIqxw8dtk2cXmPIS4AXUKqK1drk
%2
FNAJBzewdXUhMYIByzCCAccCAQEwgaMwgZYxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkCCA7rV4fnngmNMAkGBSsOAwIaBQAwDQYJKoZIhvcNAQEBBQAEggEACPhAH
%2
BwPTgurg
%2
BVE0T0VDNIgGL95UNMRozLBS9WKxffCoLaARq6m36HMnlJJT
%2
FWe2O6ZwBwFDNGhDbNMDc8EIs2jcZ
%2
FPqjOQOTnfJVoMiJr9Bu3Ss8Ka4NfzuKsYkOU7SxrencFHURawREY
%2
BglgcJ
%2
FQYYKA4hYXC6SwCtMAO7KEA6OMFvHZiHsXT7fIgGWjXq3FcoulfmPC1b98WaHsiHdVJx
%2
BC
%2
BM0eRiZmGkySpGsNKZF0vuz4mly6JV7HWHL8MAEdEEDIL03ClYlwLH8YGdgyh6DeaZIXp4DVQq0kMXLV4CtBm0wY8Jl11nhes
%2
BlXG9rV6Ad3e2sm1pAkG0mJTTg
%3
D
%3
D'
receipt_data
=
'MIIWpQYJKoZIhvcNAQcCoIIWljCCFpICAQExCzAJBgUrDgMCGgUAMIIGRgYJKoZIhvcNAQcBoIIGNwSCBjMxggYvMAoCAQgCAQEEAhYAMAoCARQCAQEEAgwAMAsCAQECAQEEAwIBADALAgELAgEBBAMCAQAwCwIBDwIBAQQDAgEAMAsCARACAQEEAwIBADALAgEZAgEBBAMCAQMwDAIBAwIBAQQEDAIyNDAMAgEKAgEBBAQWAjQrMAwCAQ4CAQEEBAICAJ4wDQIBDQIBAQQFAgMB
%2
FowwDQIBEwIBAQQFDAMxLjAwDgIBCQIBAQQGAgRQMjU2MBgCAQQCAQIEEGLQjvbwia8LdbHEKphBbw0wGwIBAAIBAQQTDBFQcm9kdWN0aW9uU2FuZGJveDAcAgEFAgEBBBTiJWtzi5LILMppYNeP65hAms
%2
BfIzAdAgECAgEBBBUME2NvbS5xaW1lbmcudGFucHV5dW4wHgIBDAIBAQQWFhQyMDIwLTExLTI3VDA3OjA0OjMxWjAeAgESAgEBBBYWFDIwMTMtMDgtMDFUMDc6MDA6MDBaMEcCAQcCAQEEP
%2
FwSCUfw
%2
B5
%2
F67ApEF4mbICns7jzFPg7PbiXQlM37HSzqBtfeBTQiCudNHMRI2G5o9QzjnFhWfE577l0AZZ31VzBRAgEGAgEBBEmEv7Lmya12iyWVsEKdQvTktPTnywWn
%2
F97fILd2lX9
%2
BMW6Ui4KkBYlsTcj
%2
BDkubBHB5yTsGeoDXOdrlQSf4NaUrESwko0tzlbfgMIIBXwIBEQIBAQSCAVUxggFRMAsCAgasAgEBBAIWADALAgIGrQIBAQQCDAAwCwICBrACAQEEAhYAMAsCAgayAgEBBAIMADALAgIGswIBAQQCDAAwCwICBrQCAQEEAgwAMAsCAga1AgEBBAIMADALAgIGtgIBAQQCDAAwDAICBqUCAQEEAwIBATAMAgIGqwIBAQQDAgEAMAwCAgauAgEBBAMCAQAwDAICBq8CAQEEAwIBADAMAgIGsQIBAQQDAgEAMBsCAganAgEBBBIMEDEwMDAwMDA3NDI2NjYwMjMwGwICBqkCAQEEEgwQMTAwMDAwMDc0MjY2NjAyMzAfAgIGqAIBAQQWFhQyMDIwLTExLTE3VDA1OjU3OjMyWjAfAgIGqgIBAQQWFhQyMDIwLTExLTE3VDA1OjU3OjMyWjAlAgIGpgIBAQQcDBpjb20ucWltZW5nLnRhbnB1eXVuX3Rlc3RfMTCCAV8CARECAQEEggFVMYIBUTALAgIGrAIBAQQCFgAwCwICBq0CAQEEAgwAMAsCAgawAgEBBAIWADALAgIGsgIBAQQCDAAwCwICBrMCAQEEAgwAMAsCAga0AgEBBAIMADALAgIGtQIBAQQCDAAwCwICBrYCAQEEAgwAMAwCAgalAgEBBAMCAQEwDAICBqsCAQEEAwIBADAMAgIGrgIBAQQDAgEAMAwCAgavAgEBBAMCAQAwDAICBrECAQEEAwIBADAbAgIGpwIBAQQSDBAxMDAwMDAwNzQyODg1MzM4MBsCAgapAgEBBBIMEDEwMDAwMDA3NDI4ODUzMzgwHwICBqgCAQEEFhYUMjAyMC0xMS0xN1QxMjoyNDo1MFowHwICBqoCAQEEFhYUMjAyMC0xMS0xN1QxMjoyNDo1MFowJQICBqYCAQEEHAwaY29tLnFpbWVuZy50YW5wdXl1bl90ZXN0XzMwggFkAgERAgEBBIIBWjGCAVYwCwICBqwCAQEEAhYAMAsCAgatAgEBBAIMADALAgIGsAIBAQQCFgAwCwICBrICAQEEAgwAMAsCAgazAgEBBAIMADALAgIGtAIBAQQCDAAwCwICBrUCAQEEAgwAMAsCAga2AgEBBAIMADAMAgIGpQIBAQQDAgEBMAwCAgarAgEBBAMCAQEwDAICBq4CAQEEAwIBADAMAgIGrwIBAQQDAgEAMAwCAgaxAgEBBAMCAQAwGwICBqcCAQEEEgwQMTAwMDAwMDc0NzE0MjA5MzAbAgIGqQIBAQQSDBAxMDAwMDAwNzQ3MTQyMDkzMB8CAgaoAgEBBBYWFDIwMjAtMTEtMjdUMDc6MDQ6MzFaMB8CAgaqAgEBBBYWFDIwMjAtMTEtMjdUMDc6MDQ6MzFaMCoCAgamAgEBBCEMH2NvbS5xaW1lbmcudGFucHV5dW5fdGFucHViZWkzODiggg5lMIIFfDCCBGSgAwIBAgIIDutXh
%2
BeeCY0wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTUxMTEzMDIxNTA5WhcNMjMwMjA3MjE0ODQ3WjCBiTE3MDUGA1UEAwwuTWFjIEFwcCBTdG9yZSBhbmQgaVR1bmVzIFN0b3JlIFJlY2VpcHQgU2lnbmluZzEsMCoGA1UECwwjQXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMxEzARBgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApc
%2
BB
%2
FSWigVvWh
%2
B0j2jMcjuIjwKXEJss9xp
%2
FsSg1Vhv
%2
BkAteXyjlUbX1
%2
FslQYncQsUnGOZHuCzom6SdYI5bSIcc8
%2
FW0YuxsQduAOpWKIEPiF41du30I4SjYNMWypoN5PC8r0exNKhDEpYUqsS4
%2
B3dH5gVkDUtwswSyo1IgfdYeFRr6IwxNh9KBgxHVPM3kLiykol9X6SFSuHAnOC6pLuCl2P0K5PB
%2
FT5vysH1PKmPUhrAJQp2Dt7
%2
Bmf7
%2
Fwmv1W16sc1FJCFaJzEOQzI6BAtCgl7ZcsaFpaYeQEGgmJjm4HRBzsApdxXPQ33Y72C3ZiB7j7AfP4o7Q0
%2
FomVYHv4gNJIwIDAQABo4IB1zCCAdMwPwYIKwYBBQUHAQEEMzAxMC8GCCsGAQUFBzABhiNodHRwOi8vb2NzcC5hcHBsZS5jb20vb2NzcDAzLXd3ZHIwNDAdBgNVHQ4EFgQUkaSc
%2
FMR2t5
%2
BgivRN9Y82Xe0rBIUwDAYDVR0TAQH
%2
FBAIwADAfBgNVHSMEGDAWgBSIJxcJqbYYYIvs67r2R1nFUlSjtzCCAR4GA1UdIASCARUwggERMIIBDQYKKoZIhvdjZAUGATCB
%2
FjCBwwYIKwYBBQUHAgIwgbYMgbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjA2BggrBgEFBQcCARYqaHR0cDovL3d3dy5hcHBsZS5jb20vY2VydGlmaWNhdGVhdXRob3JpdHkvMA4GA1UdDwEB
%2
FwQEAwIHgDAQBgoqhkiG92NkBgsBBAIFADANBgkqhkiG9w0BAQUFAAOCAQEADaYb0y4941srB25ClmzT6IxDMIJf4FzRjb69D70a
%2
FCWS24yFw4BZ3
%2
BPi1y4FFKwN27a4
%2
Fvw1LnzLrRdrjn8f5He5sWeVtBNephmGdvhaIJXnY4wPc
%2
Fzo7cYfrpn4ZUhcoOAoOsAQNy25oAQ5H3O5yAX98t5
%2
FGioqbisB
%2
FKAgXNnrfSemM
%2
Fj1mOC
%2
BRNuxTGf8bgpPyeIGqNKX86eOa1GiWoR1ZdEWBGLjwV
%2
F1CKnPaNmSAMnBjLP4jQBkulhgwHyvj3XKablbKtYdaG6YQvVMpzcZm8w7HHoZQ
%2
FOjbb9IYAYMNpIr7N4YtRHaLSPQjvygaZwXG56AezlHRTBhL8cTqDCCBCIwggMKoAMCAQICCAHevMQ5baAQMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYTAlVTMRMwEQYDVQQKEwpBcHBsZSBJbmMuMSYwJAYDVQQLEx1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEWMBQGA1UEAxMNQXBwbGUgUm9vdCBDQTAeFw0xMzAyMDcyMTQ4NDdaFw0yMzAyMDcyMTQ4NDdaMIGWMQswCQYDVQQGEwJVUzETMBEGA1UECgwKQXBwbGUgSW5jLjEsMCoGA1UECwwjQXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMxRDBCBgNVBAMMO0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyjhUpstWqsgkOUjpjO7sX7h
%2
FJpG8NFN6znxjgGF3ZF6lByO2Of5QLRVWWHAtfsRuwUqFPi
%2
Fw3oQaoVfJr3sY
%2
F2r6FRJJFQgZrKrbKjLtlmNoUhU9jIrsv2sYleADrAF9lwVnzg6FlTdq7Qm2rmfNUWSfxlzRvFduZzWAdjakh4FuOI
%2
FYKxVOeyXYWr9Og8GN0pPVGnG1YJydM05V
%2
BRJYDIa4Fg3B5XdFjVBIuist5JSF4ejEncZopbCj
%2
FGd
%2
BcLoCWUt3QpE5ufXN4UzvwDtIjKblIV39amq7pxY1YNLmrfNGKcnow4vpecBqYWcVsvD95Wi8Yl9uz5nd7xtj
%2
FpJlqwIDAQABo4GmMIGjMB0GA1UdDgQWBBSIJxcJqbYYYIvs67r2R1nFUlSjtzAPBgNVHRMBAf8EBTADAQH
%2
FMB8GA1UdIwQYMBaAFCvQaUeUdgn
%2
B9GuNLkCm90dNfwheMC4GA1UdHwQnMCUwI6AhoB
%2
BGHWh0dHA6Ly9jcmwuYXBwbGUuY29tL3Jvb3QuY3JsMA4GA1UdDwEB
%2
FwQEAwIBhjAQBgoqhkiG92NkBgIBBAIFADANBgkqhkiG9w0BAQUFAAOCAQEAT8
%2
FvWb4s9bJsL4
%2
FuE4cy6AU1qG6LfclpDLnZF7x3LNRn4v2abTpZXN
%2
BDAb2yriphcrGvzcNFMI
%2
Bjgw3OHUe08ZOKo3SbpMOYcoc7Pq9FC5JUuTK7kBhTawpOELbZHVBsIYAKiU5XjGtbPD2m
%2
Fd73DSMdC0omhz
%2
B6kZJMpBkSGW1X9XpYh3toiuSGjErr4kkUqqXdVQCprrtLMK7hoLG8KYDmCXflvjSiAcp
%2
F3OIK5ju4u
%2
By6YpXzBWNBgs0POx1MlaTbq
%2
FnJlelP5E3nJpmB6bz5tCnSAXpm4S6M9iGKxfh44YGuv9OQnamt86
%2
F9OBqWZzAcUaVc7HGKgrRsDwwVHzCCBLswggOjoAMCAQICAQIwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTA2MDQyNTIxNDAzNloXDTM1MDIwOTIxNDAzNlowYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5JGpCR
%2
BR2x5HUOsF7V55hC3rNqJXTFXsixmJ3vlLbPUHqyIwAugYPvhQCdN
%2
FQaiY
%2
BdHKZpwkaxHQo7vkGyrDH5WeegykR4tb1BY3M8vED03OFGnRyRly9V0O1X9fm
%2
FIlA7pVj01dDfFkNSMVSxVZHbOU9
%2
Facns9QusFYUGePCLQg98usLCBvcLY
%2
FATCMt0PPD5098ytJKBrI
%2
Fs61uQ7ZXhzWyz21Oq30Dw4AkguxIRYudNU8DdtiFqujcZJHU1XBry9Bs
%2
Fj743DN5qNMRX4fTGtQlkGJxHRiCxCDQYczioGxMFjsWgQyjGizjx3eZXP
%2
FZ15lvEnYdp8zFGWhd5TJLQIDAQABo4IBejCCAXYwDgYDVR0PAQH
%2
FBAQDAgEGMA8GA1UdEwEB
%2
FwQFMAMBAf8wHQYDVR0OBBYEFCvQaUeUdgn
%2
B9GuNLkCm90dNfwheMB8GA1UdIwQYMBaAFCvQaUeUdgn
%2
B9GuNLkCm90dNfwheMIIBEQYDVR0gBIIBCDCCAQQwggEABgkqhkiG92NkBQEwgfIwKgYIKwYBBQUHAgEWHmh0dHBzOi8vd3d3LmFwcGxlLmNvbS9hcHBsZWNhLzCBwwYIKwYBBQUHAgIwgbYagbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjANBgkqhkiG9w0BAQUFAAOCAQEAXDaZTC14t
%2
B2Mm9zzd5vydtJ3ME
%2
FBH4WDhRuZPUc38qmbQI4s1LGQEti
%2
B9HOb7tJkD8t5TzTYoj75eP9ryAfsfTmDi1Mg0zjEsb
%2
BaTwpr
%2
Fyv8WacFCXwXQFYRHnTTt4sjO0ej1W8k4uvRt3DfD0XhJ8rxbXjt57UXF6jcfiI1yiXV2Q
%2
FWa9SiJCMR96Gsj3OBYMYbWwkvkrL4REjwYDieFfU9JmcgijNq9w2Cz97roy
%2
F5U2pbZMBjM3f3OgcsVuvaDyEO2rpzGU
%2
B12TZ
%2
FwYdV2aeZuTJC
%2
B9jVcZ5
%2
BoVK3G72TQiQSKscPHbZNnF5jyEuAF1CqitXa5PzQCQc3sHV1ITGCAcswggHHAgEBMIGjMIGWMQswCQYDVQQGEwJVUzETMBEGA1UECgwKQXBwbGUgSW5jLjEsMCoGA1UECwwjQXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMxRDBCBgNVBAMMO0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENlcnRpZmljYXRpb24gQXV0aG9yaXR5AggO61eH554JjTAJBgUrDgMCGgUAMA0GCSqGSIb3DQEBAQUABIIBADTZOLZ
%2
BK7WCPIH05HL71QXr
%2
FxfArUIiDDW0F2r2yRaFUSU
%2
B
%2
FYVE2TAVdLM3w6rXKNZyB652rsEP4t
%2
BnrjAOiTlAgDY35ssBxQy3ds00DMAxC2afdNApiUJRAKIksXT
%2
BweNQSivN6RzqYOszB7dK1CKdpcfOgZ
%2
BVJQ3mYgeE00vsmRg
%2
BhNmdDui8EmkVtPq5uNDXc2WM
%2
FSIyBVtf2qOFtWX7kYgvEmfzXAxgrnKmBb6A0Ty4rKCrJ
%2
BANgOo
%2
B0jfK6AfgeR4hGl0IhqzRdiVuuKq6einG0YmcxV4X0GqxD75HBGZwjTEYw9ScAT6Au7m81dVeLR76o0XPFXUUNmjJ7LA
%3
D'
product_id
=
'com.qimeng.tanpuyun_tanpubei388'
res
=
apple_pay
(
receipt_data
,
product_id
)
print
(
res
)
\ No newline at end of file
logs/tamp_course_order.log
View file @
f03624e7
This source diff could not be displayed because it is too large. You can
view the blob
instead.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment