def get_product_jwt(product, contribution): """Prepare a JWT for paid products to pass into navigator.pay()""" issued_at = calendar.timegm(time.gmtime()) token_data = { 'iss': settings.APP_PURCHASE_KEY, 'typ': settings.APP_PURCHASE_TYP, 'aud': settings.APP_PURCHASE_AUD, 'iat': issued_at, 'exp': issued_at + 3600, # expires in 1 hour 'request': { 'id': product.external_id(), 'name': unicode(product.name()), 'icons': product.icons(), 'description': strip_tags(product.description()), 'pricePoint': product.price().name, 'productData': urlencode(product.product_data(contribution)), 'chargebackURL': absolutify(reverse('webpay.chargeback')), 'postbackURL': absolutify(reverse('webpay.postback')), } } token = sign_webpay_jwt(token_data) log.debug('Preparing webpay JWT for self.product {0}: {1}'.format( product.id(), token)) return { 'webpayJWT': token, 'contribStatusURL': reverse( 'webpay-status', kwargs={'uuid': contribution.uuid} ) }
def _prepare_pay(request, addon): """Prepare a JWT to pass into navigator.pay()""" if addon.is_premium() and addon.has_purchased(request.amo_user): log.info('Already purchased: %d' % addon.pk) raise AlreadyPurchased amount, currency, uuid_, contrib_for = start_purchase(request, addon) log.debug('Storing contrib for uuid: %s' % uuid_) Contribution.objects.create(addon_id=addon.id, amount=amount, source=request.REQUEST.get('src', ''), source_locale=request.LANG, uuid=str(uuid_), type=amo.CONTRIB_PENDING, paykey=None, user=request.amo_user, price_tier=addon.premium.price, client_data=ClientData.get_or_create(request)) # Until atob() supports encoded HTML we are stripping all tags. # See bug 831524 app_description = bleach.clean(unicode(addon.description), strip=True, tags=[]) acct = addon.app_payment_account.payment_account seller_uuid = acct.solitude_seller.uuid application_size = addon.current_version.all_files[0].size issued_at = calendar.timegm(time.gmtime()) icons = {} for size in amo.ADDON_ICON_SIZES: icons[str(size)] = absolutify(addon.get_icon_url(size)) req = { 'iss': settings.APP_PURCHASE_KEY, 'typ': settings.APP_PURCHASE_TYP, 'aud': settings.APP_PURCHASE_AUD, 'iat': issued_at, 'exp': issued_at + 3600, # expires in 1 hour 'request': { 'name': unicode(addon.name), 'description': app_description, 'pricePoint': addon.premium.price.name, 'id': make_ext_id(addon.pk), 'postbackURL': absolutify(reverse('webpay.postback')), 'chargebackURL': absolutify(reverse('webpay.chargeback')), 'productData': urlencode({'contrib_uuid': uuid_, 'seller_uuid': seller_uuid, 'addon_id': addon.pk, 'application_size': application_size}), 'icons': icons, } } jwt_ = sign_webpay_jwt(req) log.debug('Preparing webpay JWT for addon %s: %s' % (addon, jwt_)) app_pay_cef.log(request, 'Preparing JWT', 'preparing_jwt', 'Preparing JWT for: %s' % (addon.pk), severity=3) if request.API: url = reverse('webpay-status', kwargs={'uuid': uuid_}) else: url = reverse('webpay.pay_status', args=[addon.app_slug, uuid_]) return {'webpayJWT': jwt_, 'contribStatusURL': url}
def get_product_jwt(product, user=None, region=None, source=None, lang=None, client_data=None): """Prepare a JWT for paid products to pass into navigator.pay()""" # TODO: Contribution should be created outside of the JWT producer contribution = Contribution.objects.create( addon_id=product.addon().pk, amount=product.amount(region), client_data=client_data, paykey=None, price_tier=product.price(), source=source, source_locale=lang, type=amo.CONTRIB_PENDING, user=user, uuid=str(uuid.uuid4()), ) log.debug('Storing contrib for uuid: {0}'.format(contribution.uuid)) user_id = user.pk if user else None log.debug('Starting purchase of app: {0} by user: {1}'.format( product.id(), user_id)) issued_at = calendar.timegm(time.gmtime()) token_data = { 'iss': settings.APP_PURCHASE_KEY, 'typ': settings.APP_PURCHASE_TYP, 'aud': settings.APP_PURCHASE_AUD, 'iat': issued_at, 'exp': issued_at + 3600, # expires in 1 hour 'request': { 'id': product.external_id(), 'name': unicode(product.name()), 'icons': product.icons(), 'description': strip_tags(product.description()), 'pricePoint': product.price().name, 'productData': urlencode(product.product_data(contribution)), 'chargebackURL': absolutify(reverse('webpay.chargeback')), 'postbackURL': absolutify(reverse('webpay.postback')), } } token = sign_webpay_jwt(token_data) log.debug('Preparing webpay JWT for self.product {0}: {1}'.format( product.id(), token)) return { 'webpayJWT': token, 'contribStatusURL': reverse('webpay-status', kwargs={'uuid': contribution.uuid}) }
def get_product_jwt(product, user=None, region=None, source=None, lang=None, client_data=None): """Prepare a JWT for paid products to pass into navigator.pay()""" # TODO: Contribution should be created outside of the JWT producer contribution = Contribution.objects.create( addon_id=product.addon().pk, amount=product.amount(region), client_data=client_data, paykey=None, price_tier=product.price(), source=source, source_locale=lang, type=amo.CONTRIB_PENDING, user=user, uuid=str(uuid.uuid4()), ) log.debug('Storing contrib for uuid: {0}'.format(contribution.uuid)) user_id = user.pk if user else None log.debug('Starting purchase of app: {0} by user: {1}'.format( product.id(), user_id)) issued_at = calendar.timegm(time.gmtime()) token_data = { 'iss': settings.APP_PURCHASE_KEY, 'typ': settings.APP_PURCHASE_TYP, 'aud': settings.APP_PURCHASE_AUD, 'iat': issued_at, 'exp': issued_at + 3600, # expires in 1 hour 'request': { 'id': product.external_id(), 'name': unicode(product.name()), 'icons': product.icons(), 'description': strip_tags(product.description()), 'pricePoint': product.price().name, 'productData': urlencode(product.product_data(contribution)), 'chargebackURL': absolutify(reverse('webpay.chargeback')), 'postbackURL': absolutify(reverse('webpay.postback')), } } token = sign_webpay_jwt(token_data) log.debug('Preparing webpay JWT for self.product {0}: {1}'.format( product.id(), token)) return { 'webpayJWT': token, 'contribStatusURL': reverse( 'webpay-status', kwargs={ 'uuid': contribution.uuid } ) }
def get_product_jwt(product, contribution): """ Prepare a JWT describing the item about to be purchased when working with navigator.mozPay(). See the MDN docs for details on the JWT fields: https://developer.mozilla.org/en-US/Marketplace/Monetization /In-app_payments_section/mozPay_iap """ issued_at = calendar.timegm(time.gmtime()) product_data = product.product_data(contribution) simulation = product.simulation() if not simulation and not product_data.get('public_id'): raise ValueError( 'Cannot create JWT without a cached public_id for ' 'app {a}'.format(a=product.addon())) token_data = { 'iss': settings.APP_PURCHASE_KEY, 'typ': settings.APP_PURCHASE_TYP, 'aud': settings.APP_PURCHASE_AUD, 'iat': issued_at, 'exp': issued_at + 3600, # expires in 1 hour 'request': { 'id': product.external_id(), 'name': unicode(product.name()), 'defaultLocale': product.default_locale(), 'locales': product.localized_properties(), 'icons': product.icons(), 'description': strip_tags(product.description()), 'pricePoint': product.price().name, 'productData': urlencode(product_data), 'chargebackURL': absolutify(reverse('webpay.chargeback')), 'postbackURL': absolutify(reverse('webpay.postback')), } } if simulation: token_data['request']['simulate'] = simulation token = sign_webpay_jwt(token_data) log.debug('Preparing webpay JWT for product {p}, contrib {c}: {t}' .format(p=product.id(), t=token_data, c=contribution)) return { 'webpayJWT': token, 'contribStatusURL': reverse( 'webpay-status', kwargs={'uuid': contribution.uuid} ) }
def prepare_webpay_refund(data): issued_at = calendar.timegm(time.gmtime()) return sign_webpay_jwt({ 'iss': settings.APP_PURCHASE_KEY, 'typ': 'tu.com/payments/v1/refund', 'aud': 'tu.com', 'iat': issued_at, 'exp': issued_at + 3600, # expires in 1 hour 'request': { 'refund': data['id'], 'reason': 'refund' } })
def prepare_pay(request, addon): """Prepare a BlueVia JWT to pass into navigator.pay()""" amount, currency, uuid_, contrib_for = start_purchase(request, addon) log.debug('Storing contrib for uuid: %s' % uuid_) Contribution.objects.create(addon_id=addon.id, amount=amount, source=request.REQUEST.get('src', ''), source_locale=request.LANG, uuid=str(uuid_), type=amo.CONTRIB_PENDING, paykey=None, user=request.amo_user, price_tier=addon.premium.price, client_data=ClientData.get_or_create(request)) # Until atob() supports encoded HTML we are stripping all tags. # See bug 831524 app_summary = bleach.clean(unicode(addon.summary), strip=True, tags=[]) acct = addon.app_payment_account.payment_account seller_uuid = acct.solitude_seller.uuid issued_at = calendar.timegm(time.gmtime()) req = { 'iss': settings.APP_PURCHASE_KEY, 'typ': settings.APP_PURCHASE_TYP, 'aud': settings.APP_PURCHASE_AUD, 'iat': issued_at, 'exp': issued_at + 3600, # expires in 1 hour 'request': { 'name': unicode(addon.name), 'description': app_summary, 'pricePoint': addon.premium.price.pk, 'id': make_ext_id(addon.pk), 'postbackURL': absolutify(reverse('webpay.postback')), 'chargebackURL': absolutify(reverse('webpay.chargeback')), 'productData': urlencode({'contrib_uuid': uuid_, 'seller_uuid': seller_uuid, 'addon_id': addon.pk}), } } jwt_ = sign_webpay_jwt(req) log.debug('Preparing webpay JWT for addon %s: %s' % (addon, jwt_)) app_pay_cef.log(request, 'Preparing JWT', 'preparing_jwt', 'Preparing JWT for: %s' % (addon.pk), severity=3) return {'webpayJWT': jwt_, 'contribStatusURL': reverse('webpay.pay_status', args=[addon.app_slug, uuid_])}
def prepare_pay(request, addon): """Prepare a BlueVia JWT to pass into navigator.pay()""" amount, currency, uuid_, contrib_for = start_purchase(request, addon) log.debug("Storing contrib for uuid: %s" % uuid_) Contribution.objects.create( addon_id=addon.id, amount=amount, source=request.REQUEST.get("src", ""), source_locale=request.LANG, uuid=str(uuid_), type=amo.CONTRIB_PENDING, paykey=None, user=request.amo_user, price_tier=addon.premium.price, client_data=ClientData.get_or_create(request), ) # Until atob() supports encoded HTML we are stripping all tags. # See bug 831524 app_summary = bleach.clean(unicode(addon.summary), strip=True, tags=[]) acct = addon.app_payment_account.payment_account seller_uuid = acct.solitude_seller.uuid issued_at = calendar.timegm(time.gmtime()) req = { "iss": settings.APP_PURCHASE_KEY, "typ": settings.APP_PURCHASE_TYP, "aud": settings.APP_PURCHASE_AUD, "iat": issued_at, "exp": issued_at + 3600, # expires in 1 hour "request": { "name": unicode(addon.name), "description": app_summary, "pricePoint": addon.premium.price.pk, "id": make_ext_id(addon.pk), "postbackURL": absolutify(reverse("webpay.postback")), "chargebackURL": absolutify(reverse("webpay.chargeback")), "productData": urlencode({"contrib_uuid": uuid_, "seller_uuid": seller_uuid, "addon_id": addon.pk}), }, } jwt_ = sign_webpay_jwt(req) log.debug("Preparing webpay JWT for addon %s: %s" % (addon, jwt_)) app_pay_cef.log(request, "Preparing JWT", "preparing_jwt", "Preparing JWT for: %s" % (addon.pk), severity=3) return {"webpayJWT": jwt_, "contribStatusURL": reverse("webpay.pay_status", args=[addon.app_slug, uuid_])}
def get_product_jwt(product, contribution): """Prepare a JWT for paid products to pass into navigator.pay()""" issued_at = calendar.timegm(time.gmtime()) product_data = product.product_data(contribution) simulation = product.simulation() if not simulation and not product_data.get('public_id'): raise ValueError( 'Cannot create JWT without a cached public_id for ' 'app {a}'.format(a=product.addon())) token_data = { 'iss': settings.APP_PURCHASE_KEY, 'typ': settings.APP_PURCHASE_TYP, 'aud': settings.APP_PURCHASE_AUD, 'iat': issued_at, 'exp': issued_at + 3600, # expires in 1 hour 'request': { 'id': product.external_id(), 'name': unicode(product.name()), 'icons': product.icons(), 'description': strip_tags(product.description()), 'pricePoint': product.price().name, 'productData': urlencode(product_data), 'chargebackURL': absolutify(reverse('webpay.chargeback')), 'postbackURL': absolutify(reverse('webpay.postback')), } } if simulation: token_data['request']['simulate'] = simulation token = sign_webpay_jwt(token_data) log.debug('Preparing webpay JWT for product {p}, contrib {c}: {t}' .format(p=product.id(), t=token_data, c=contribution)) return { 'webpayJWT': token, 'contribStatusURL': reverse( 'webpay-status', kwargs={'uuid': contribution.uuid} ) }
def prepare_webpay_pay(data): issued_at = calendar.timegm(time.gmtime()) req = { 'iss': settings.APP_PURCHASE_KEY, 'typ': settings.APP_PURCHASE_TYP, 'aud': settings.APP_PURCHASE_AUD, 'iat': issued_at, 'exp': issued_at + 3600, # expires in 1 hour 'request': { 'name': data['app_name'], 'description': data['app_description'], 'price': data['prices'], 'defaultPrice': data['currency'], 'postbackURL': data['postback_url'], 'chargebackURL': data['chargeback_url'], 'productData': data['product_data'] } } return sign_webpay_jwt(req)
def prepare_pay(request, addon): """Prepare a BlueVia JWT to pass into navigator.pay()""" amount, currency, uuid_, contrib_for = start_purchase(request, addon) log.debug('Storing contrib for uuid: %s' % uuid_) Contribution.objects.create(addon_id=addon.id, amount=amount, source=request.REQUEST.get('src', ''), source_locale=request.LANG, uuid=str(uuid_), type=amo.CONTRIB_PENDING, paykey=None, user=request.amo_user, price_tier=addon.premium.price, client_data=ClientData.get_or_create(request)) # Until atob() supports encoded HTML we are stripping all tags. # See bug 831524 app_summary = bleach.clean(unicode(addon.summary), strip=True, tags=[]) acct = addon.app_payment_account.payment_account seller_uuid = acct.solitude_seller.uuid issued_at = calendar.timegm(time.gmtime()) req = { 'iss': settings.APP_PURCHASE_KEY, 'typ': settings.APP_PURCHASE_TYP, 'aud': settings.APP_PURCHASE_AUD, 'iat': issued_at, 'exp': issued_at + 3600, # expires in 1 hour 'request': { 'name': unicode(addon.name), 'description': app_summary, 'pricePoint': addon.premium.price.pk, 'id': make_ext_id(addon.pk), 'postbackURL': absolutify(reverse('webpay.postback')), 'chargebackURL': absolutify(reverse('webpay.chargeback')), 'productData': urlencode({'contrib_uuid': uuid_, 'seller_uuid': seller_uuid, 'addon_id': addon.pk}), } } jwt_ = sign_webpay_jwt(req) log.debug('Preparing webpay JWT for addon %s: %s' % (addon, jwt_)) return {'webpayJWT': jwt_, 'contribStatusURL': reverse('webpay.pay_status', args=[addon.app_slug, uuid_])}
def test_notifies(self, _notify): data = sign_webpay_jwt(refund) res = self.client.post(self.url, data, content_type='application/json') eq_(res.status_code, 200) assert _notify.called
def test_encode(self): data = sign_webpay_jwt(refund) res = self.client.post(self.url, data, content_type='application/json') eq_(res.status_code, 200) eq_(self.sale.is_refunded(), True)
def _prepare_pay(request, addon): """Prepare a JWT to pass into navigator.pay()""" if addon.is_premium() and addon.has_purchased(request.amo_user): log.info('Already purchased: %d' % addon.pk) raise AlreadyPurchased amount, currency, uuid_, contrib_for = start_purchase(request, addon) log.debug('Storing contrib for uuid: %s' % uuid_) Contribution.objects.create(addon_id=addon.id, amount=amount, source=request.REQUEST.get('src', ''), source_locale=request.LANG, uuid=str(uuid_), type=amo.CONTRIB_PENDING, paykey=None, user=request.amo_user, price_tier=addon.premium.price, client_data=ClientData.get_or_create(request)) # Until atob() supports encoded HTML we are stripping all tags. # See bug 831524 app_description = bleach.clean(unicode(addon.description), strip=True, tags=[]) acct = addon.app_payment_account.payment_account seller_uuid = acct.solitude_seller.uuid application_size = addon.current_version.all_files[0].size issued_at = calendar.timegm(time.gmtime()) icons = {} for size in amo.ADDON_ICON_SIZES: icons[str(size)] = absolutify(addon.get_icon_url(size)) req = { 'iss': settings.APP_PURCHASE_KEY, 'typ': settings.APP_PURCHASE_TYP, 'aud': settings.APP_PURCHASE_AUD, 'iat': issued_at, 'exp': issued_at + 3600, # expires in 1 hour 'request': { 'name': unicode(addon.name), 'description': app_description, 'pricePoint': addon.premium.price.name, 'id': make_ext_id(addon.pk), 'postbackURL': absolutify(reverse('webpay.postback')), 'chargebackURL': absolutify(reverse('webpay.chargeback')), 'productData': urlencode({ 'contrib_uuid': uuid_, 'seller_uuid': seller_uuid, 'addon_id': addon.pk, 'application_size': application_size }), 'icons': icons, } } jwt_ = sign_webpay_jwt(req) log.debug('Preparing webpay JWT for addon %s: %s' % (addon, jwt_)) app_pay_cef.log(request, 'Preparing JWT', 'preparing_jwt', 'Preparing JWT for: %s' % (addon.pk), severity=3) if request.API: url = reverse('api_dispatch_detail', kwargs={ 'resource_name': 'status', 'api_name': 'webpay', 'uuid': uuid_ }) else: url = reverse('webpay.pay_status', args=[addon.app_slug, uuid_]) return {'webpayJWT': jwt_, 'contribStatusURL': url}