Пример #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())
Пример #2
0
  def post(self, mode =""):
      # Nothing to do here, content script will pick up accesstoken from here
      if mode == "ipn":
        logging.info(self.request.body)
        result = urlfetch.fetch(
                        ipn_sandbox_url,
                        payload = "cmd=_notify-validate&" + self.request.body,
                        method=urlfetch.POST,
                        validate_certificate=True
                     )
        logging.info(result.content)
        if result.status_code == 200 and result.content == 'VERIFIED': # OK
          ipn_values = cgi.parse_qs(self.request.body)
          debug_msg = '\n'.join(["%s=%s" % (k,'&'.join(v)) for (k,v) in ipn_values.items()])
          #logging.info("from tung with love")
          item_number = cgi.escape(self.request.get('item_number'))


          # get stuff
          transaction_id        = str(cgi.escape(self.request.get('txn_id')))
          payer_email           = str(cgi.escape(self.request.get('payer_email')))  
          receiver_email        = str(cgi.escape(self.request.get('receiver_email')))
          item_amount           = str(cgi.escape(self.request.get('payment_gross')))
          sales_tax             = str(cgi.escape(self.request.get('tax')))
          shipping              = str(cgi.escape(self.request.get('shipping')))
          handling              = str(cgi.escape(self.request.get('mc_fee')))    
          quantity              = str(cgi.escape(self.request.get('quantity')))
          item_name             = str(cgi.escape(self.request.get('item_name')))     
          date                  = str(cgi.escape(self.request.get('payment_date'))) 
          status                = str(cgi.escape(self.request.get('payment_status')))
          payment_type          = str(cgi.escape(self.request.get('payment_type')))



          ### Change Request to done
          post = RequestPost.query(RequestPost.reference == item_number).get() #that post
          
          if post:
            post.payment_is_done = True

            ## Notify tutee
            notifymsg = NotifiedMessage()
            notifymsg.read             =  False
            notifymsg.person_reference =  post.requester
            notifymsg.object_reference =  item_number
            notifymsg.content          =  " paid " + item_amount + ", click to give feedback"
            notifymsg.price            =  item_amount
            notifymsg.initiator        =  post.requester
            notifymsg.put()

            #

            ## Notify tutor
            notifymsg2 = NotifiedMessage()
            notifymsg2.read             =  False
            notifymsg2.person_reference =  post.final_provider
            notifymsg2.object_reference =  item_number
            notifymsg2.content          =  " paid " + item_amount + ", click to give feedback "
            notifymsg2.price            =  item_amount
            notifymsg2.initiator        =  post.requester
            notifymsg2.put()

            ### Create Transaction Object
            newtransaction    = Transaction()
            newtransaction.transaction_id    = transaction_id
            newtransaction.payer_email       = payer_email
            newtransaction.receiver_email    = receiver_email
            newtransaction.item_amount       = item_amount
            newtransaction.sales_tax         = sales_tax
            newtransaction.shipping          = shipping
            newtransaction.handling          = handling
            newtransaction.quantity          = quantity
            newtransaction.item_name         = item_name
            newtransaction.item_number       = item_number
            newtransaction.date              = date
            newtransaction.status            = status
            newtransaction.payment_type      = payment_type

            newtransaction.tutee_username    = post.requester
            newtransaction.tutor_username    = post.final_provider

            newtransaction.testPeoplewhocanseethis.append(post.requester)
            newtransaction.testPeoplewhocanseethis.append(post.final_provider)


            newtransaction.put()

            post.put()

          self.response.out.write(debug_msg)
        else:
          logging.error('Could not fetch %s (%i)' % (url, result.status_code,))
      else:
        logging.error("Unknown mode for POST request!")