IOS IAP serverCheck by python

29 篇文章 0 订阅
4 篇文章 0 订阅


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值