s
第一个版本:http://www.myexception.cn/perl-python/416264.html
iap支付服务器验证python版本
客户端支付成功,发送信息到服务器,进行二次验证。
#-*- coding: utf-8 -*-
from django.http import HttpResponse, HttpResponseRedirect
import simplejson as json
import httplib
def pay_check(request):
uid = request.uid
params = request.POST.get('params','')
if not params:
return HttpResponse('false')
pay_receipt_dict = json.loads(params)
pay_receipt_data = pay_receipt_dict.get('receipt-data')
pay_receipt = json.dumps({'receipt-data':pay_receipt_data})
headers = {"Content-type": "application/json"}
#测试地址
#connect = httplib.HTTPSConnection("sandbox.itunes.apple.com")
#正式地址
connect = httplib.HTTPSConnection("buy.itunes.apple.com")
try:
connect.request("POST", "/verifyReceipt", pay_receipt, headers)
result = connect.getresponse()
except:
return HttpResponse('false')
if result.status != 200:
return HttpResponse('false')
data = result.read()
connect.close()
if data:
decodedJson = json.loads(data)
status = decodedJson.get('status')
receipt = decodedJson.get('receipt', {})
transaction_id = receipt.get('transaction_id', '')
purchase_date = receipt.get('original_purchase_date', '')
product_id = receipt.get('product_id', '')
if status == 0:
#返回的status为0时代表支付是成功的,支付成功,最好记录一下
return HttpResponse('true')
return HttpResponse('false')
验证返回结果格式,注意其中的时间是格林尼治时间。和中国时间相差8小时。
{'receipt': {'bid': 'com.****.shop',
'bvrs': '1.0.1',
'item_id': '514487074',
'original_purchase_date': '2012-05-03 03:46:52 Etc/GMT',
'original_purchase_date_ms': '1336016812072',
'original_purchase_date_pst': '2012-05-02 20:46:52 America/Los_Angeles',
'original_transaction_id': '1000000046751500',
'product_id': 'store_1',
'purchase_date': '2012-05-03 03:46:52 Etc/GMT',
'purchase_date_ms': '1336016812072',
'purchase_date_pst': '2012-05-02 20:46:52 America/Los_Angeles',
'quantity': '1',
'transaction_id': '1000000046751500'},
'status': 0}
第二个版本
from:http://www.cnblogs.com/eagley/archive/2011/06/15/2081577.html
encode完成后,就开始将编码过的receipt发送到我的服务器。这一段很简单,只要先创建一段url格式的字符串,再创建url,然后在初始化request的时候添加这个url,最后创建connection就行了。其中VMRequest是我写的一个继承自NSMutableURLRequest的类,这里可以直接用NSMutableURLRequest代替。需要注意的是这里的request最好使用POST方式,因为GET方式很可能因为发送的receipt数据量过大而导致数据丢失。VMRequestQueue是VMRequest的队列,这个队列会自动按顺序执行队列中的request,这部分可以改成直接创建NSURLConnection。总之,只要创建好需要访问的URL,再用POST方式发送到自己的服务器,这第一步就完成了。
第二步:向app store验证
这一步中所做的事全部是在服务器端完成。我的服务器使用的是Google App Engine(GAE)的Python环境。
首先,服务器收到receipt。因为这段receipt是已经经过编码的,所以不需要再度编码,唯一要做的就是生成一个json格式的数据,发送到app store并获取返回的数据。具体代码如下:
import httplib
# have to import simplejson because google app engine uses python 2.5. When it upgrades, can import json directly
import simplejson as json
jsonStr = json.dumps({"receipt-data": receipt})
#connect = httplib.HTTPSConnection("buy.itunes.apple.com")
# sandbox
connect = httplib.HTTPSConnection("sandbox.itunes.apple.com")
headers = {"Content-type": "application/json"}
connect.request("POST", "/verifyReceipt", jsonStr)
result = connect.getresponse()
data = result.read()
connect.close()
decodedJson = json.loads(data)
status = decodedJson[u'status']
if status == 0:
return decodedJson
else:
return False
simplejson是python2.5支持的一个json库,使用simplejson的原因是GAE只支持到python2.5。如果GAE版本更新到2.6及以上了,那就可以直接import json。
json对象的格式有点类似于一个dictionary,一个key对应于一个value。
json.dumps是将一个json对象序列化成一段字符串,相对的json.loads就是将一段字符串反序列化成一个json对象。
httplib是一个python自带的库,用来做http连接。根据apple文档,代码中的request类型必须是POST,这一点需要注意。
最后,在读取json对象的数据的时候,必须要在key的前面加“u”。
结果:服务器收到解码的receipt
服务器收到的解码的receipt格式是:
{
u'status': < status>,
u'receipt': {
u'product_id': u'<product_id>',
u'original_transaction_id': u'< original_transaction_id>',
u'bid': u'<bid>',
u'original_purchase_date': u'< original_purchase_date>',
u'bvrs': u'< bvrs>',
u'purchase_date': u'< purchase_date>',
u'item_id': u'<item_id>',
u'transaction_id': u'< transaction_id>',
u'quantity': u'< quantity>'
}
}
s
s
s