通过Twisted服务器验证Apple Store收据
我正在尝试通过我的Twisted服务器验证来自Apple商店的应用内购买交易收据。我已经把来自我应用的(SKPaymentTransaction *)transaction.transactionReceipt
发送到了我的服务器。
但是,现在我在把JSON对象发送到Apple服务器时,总是从我的Agent.request()
中收到一个未处理的错误。我怀疑这是因为我没有在443端口上监听来自Apple商店的响应,但我又不想让我的应用通过443端口与我的Twisted服务器通信。以下是我的代码:
from twisted.application import internet, service
from twisted.internet import protocol, reactor
from zope.interface import implements
from twisted.web.iweb import IBodyProducer
from twisted.internet import defer
from twisted.web.client import Agent
from twisted.web.http_headers import Headers
import json
import base64
class StringProducer(object):
implements(IBodyProducer)
def __init__(self, body):
self.body = body
self.length = len(body)
def startProducing(self, consumer):
consumer.write(self.body)
return succeed(None)
def pauseProducing(self):
pass
def stopProducing(self):
pass
def printResponse(response):
print response # just testing to see what I have
def httpRequest(url, values, headers={}, method='POST'):
agent = Agent(reactor)
d = agent.request(method,
url,
Headers(headers),
StringProducer(values)
)
d.addCallback(printResponse)
class storeServer(protocol.Protocol):
def dataReceived(self, data):
receiptBase64 = base64.standard_b64encode(data)
jsonReceipt = json.dumps({'receipt-data':receiptBase64})
print jsonReceipt # verified that my data is correct
d = httpRequest(
"https://buy.itunes.apple.com/verifyReceipt",
jsonReceipt,
{'Content-Type': ['application/x-www-form-urlencoded']}
)
factory = protocol.Factory()
factory.protocol = storeServer
tcpServer = internet.TCPServer(30000, factory)
tcpServer.setServiceParent(application)
我该如何修复这个错误?我需要创建一个在443端口上监听的服务吗?如果是这样,我该如何让连接到我应用的服务与通过https连接的服务进行通信呢?
1 个回答
1
你代码里的注释写法不对。Python用#来写注释,而不是//。
修正这个问题后,我用pyflakes检查了一下代码,发现了这些错误:
program.py:1: 'service' imported but unused
program.py:6: 'defer' imported but unused
program.py:21: undefined name 'succeed'
program.py:48: local variable 'd' is assigned to but never used
program.py:57: undefined name 'application'
看起来第21行的未定义名称可能是导致你遇到的NameError
错误的原因。NameError
是Python用来表示这种错误的方式:
x = y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'y' is not defined