Пример #1
0
def make_payment(content_object, request, transaction_opts={}):
  """"""

  trans = Transaction(content_object=content_object)
  trans.status = Transaction.PROCESSING
  trans.save()

  total = content_object.get_amount()
  shipping = content_object.shipping_cost()
  subtotal = (total - shipping)

  post_data = {
    'intent':'sale',
    'redirect_urls':{
        'return_url': build_url(request, trans.get_success_url()),
        'cancel_url': build_url(request, trans.get_failure_url()),
    },
    'payer':{
        'payment_method': 'paypal',
    },
    'transactions': [{
      'amount': {
        'total': "%.2f" % total,
        'currency': content_object.currency,
        'details': {
          'subtotal': "%.2f" % subtotal,
          'shipping': "%.2f" % shipping,
        }
      },
      'description': str(content_object).encode('ascii', 'ignore'),
      'item_list': {'items': []},
    }]
  }

  if hasattr(content_object, 'get_lines'):
    for line in content_object.get_lines():
      post_data['transactions'][0]['item_list']['items'].append({
        'name': '%s x %s' % (line[1], line[0]),
        'quantity': 1,
        'price': "%.2f" % line[2],
        'currency': content_object.currency,
      })
  else:
    post_data['transactions'][0]['item_list']['items'].append({
      'quantity': 1,
      'name': str(content_object).encode('ascii', 'ignore'),
      'price': "%.2f" % subtotal,
      'currency': content_object.currency,
    })

  url = PAYPAL_API + '/v1/payments/payment'
  token = get_paypal_token()

  # see https://developer.paypal.com/docs/integration/web/accept-paypal-payment/#specify-payment-information-to-create-a-payment

  opener = urllib2.build_opener(BetterHTTPErrorProcessor)
  urllib2.install_opener(opener)

  encoded_data = json.dumps(post_data)

  request = urllib2.Request(url, encoded_data,
                            headers={"Authorization": 'Bearer ' + token,
                                     "Content-Type": 'application/json'})
  try:
    request = urllib2.Request(url, encoded_data,
                              headers={"Authorization": 'Bearer ' + token,
                                       "Content-Type": 'application/json'})
    result = urllib2.urlopen(request).read()
  except urllib2.HTTPError, e:
    raise Exception(e.read())