Storing iOS payment transaction identifier so as to not upgrade a user multiple times.

This commit is contained in:
Samuel Clay 2017-11-15 17:26:27 -08:00
parent 055e8f0352
commit 8fe07dc701
3 changed files with 31 additions and 16 deletions

View file

@ -415,13 +415,24 @@ class Profile(models.Model):
return ipn[0].payer_email
def activate_ios_premium(self, amount):
def activate_ios_premium(self, product_identifier, transaction_identifier, amount=36):
payments = PaymentHistory.objects.filter(user=self.user,
payment_identifier=transaction_identifier)
if len(payments):
# Already paid
return False
PaymentHistory.objects.create(user=self.user,
payment_date=datetime.datetime.now(),
payment_amount=amount,
payment_provider='ios-subscription')
payment_provider='ios-subscription',
payment_identifier=transaction_identifier)
if not self.is_premium:
self.activate_premium()
logging.user(self.user, "~FG~BBNew iOS premium subscription: $%s~FW" % amount)
logging.user(self.user, "~FG~BBNew iOS premium subscription: $%s~FW" % product_identifier)
return True
@classmethod
def clear_dead_spammers(self, days=30, confirm=False):
@ -1124,6 +1135,7 @@ class PaymentHistory(models.Model):
payment_date = models.DateTimeField()
payment_amount = models.IntegerField()
payment_provider = models.CharField(max_length=20)
payment_identifier = models.CharField(max_length=100)
def __unicode__(self):
return "[%s] $%s/%s" % (self.payment_date.strftime("%Y-%m-%d"), self.payment_amount,

View file

@ -313,16 +313,17 @@ def profile_is_premium(request):
@ajax_login_required
@json.json_view
def save_ios_receipt(request):
request.user.profile.activate_ios_premium(36)
receipt = request.REQUEST.get('receipt')
product_identifier = request.POST.get('product_identifier')
transaction_identifier = request.POST.get('transaction_identifier')
subject = "iOS Premium: %s" % (request.user.profile)
message = """User: %s (%s) -- Email: %s, receipt: %s""" % (request.user.username, request.user.pk, request.user.email, request.REQUEST.get('receipt', None))
paid = request.user.profile.activate_ios_premium(product_identifier, transaction_identifier)
if paid:
subject = "iOS Premium: %s (%s)" % (request.user.profile, product_identifier)
message = """User: %s (%s) -- Email: %s, product: %s, txn: %s, receipt: %s""" % (request.user.username, request.user.pk, request.user.email, product_identifier, transaction_identifier, receipt)
mail_admins(subject, message, fail_silently=True)
return {
'is_premium': request.user.profile.is_premium,
'premium_expire': request.user.profile.premium_expire,
}
return request.user.profile
@login_required
def stripe_form(request):

View file

@ -170,7 +170,7 @@
//NSString *productID = transaction.payment.productIdentifier;
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
[self finishTransaction];
[self finishTransaction:transaction];
break;
}
}
@ -189,7 +189,7 @@
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
NSLog(@"Transaction state -> Purchased");
[self finishTransaction];
[self finishTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
@ -197,7 +197,7 @@
//add the same code as you did from SKPaymentTransactionStatePurchased here
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
[self finishTransaction];
[self finishTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
@ -215,7 +215,7 @@
}
}
- (void)finishTransaction {
- (void)finishTransaction:(SKPaymentTransaction *)transaction {
productsTable.hidden = YES;
spinner.hidden = NO;
@ -231,6 +231,8 @@
appDelegate.url];
NSDictionary *params = @{
@"receipt": [receipt base64EncodedStringWithOptions:0],
@"transaction_identifier": transaction.transactionIdentifier,
@"product_identifier": transaction.payment.productIdentifier,
};
[appDelegate.networkManager POST:urlString parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {