def get(self):
     souvenirInfo = Souvenir.get_souvenir()
     
     # セッション変数をクッキー・バックエンドへと設定
     self.session[SESSION_NAME] = 'message'
 
     self.response.out.write(template.render('html/cart.html',
                                             {'name': souvenirInfo['name'],
                                              'unitPrice': souvenirInfo['unitPrice'],
                                             }))
    def post(self):

        if self.has_session_error():
            return
            
            
        quantity = int(self.request.get('quantity'))
        
        souvenirInfo = Souvenir.get_souvenir()
        amount = (souvenirInfo['unitPrice'] + souvenirInfo['tax']) * quantity + souvenirInfo['carriage']
        
        nvpParams = {# APIの設定
                     'RETURNURL': self.request.host_url + URL_PAYMENT,
                     'CANCELURL': self.request.host_url + URL_CANCEL_REDIRECT,
                     'LANDINGPAGE': 'Billing',
                     'SOLUTIONTYPE': 'Sole',
                     'GIFTMESSAGEENABLE': 0,
                     'GIFTRECEIPTENABLE': 0,
                     'GIFTWRAPENABLE': 0,
                     'LOCALECODE': 'jp_JP',
                     'LANDINGPAGE': 'Billing',
                     'ALLOWNOTE': 0,
                     
                     # 商品全体の設定
                     'PAYMENTREQUEST_0_AMT': (souvenirInfo['unitPrice'] + souvenirInfo['tax']) * quantity + souvenirInfo['carriage'],
                     'PAYMENTREQUEST_0_CURRENCYCODE': souvenirInfo['currency'],
                     'PAYMENTREQUEST_0_PAYMENTACTION': 'Sale',
                     'PAYMENTREQUEST_0_ITEMAMT': souvenirInfo['unitPrice'] * quantity,
                     'PAYMENTREQUEST_0_SHIPPINGAMT': souvenirInfo['carriage'],
                     'PAYMENTREQUEST_0_TAXAMT': souvenirInfo['tax'] * quantity,
                     
                     # 商品明細の設定
                     'L_PAYMENTREQUEST_0_ITEMCATEGORY0': 'Physical',
                     'L_PAYMENTREQUEST_0_NAME0': souvenirInfo['name'],
                     'L_PAYMENTREQUEST_0_QTY0': quantity,
                     'L_PAYMENTREQUEST_0_TAXAMT0': souvenirInfo['tax'],
                     'L_PAYMENTREQUEST_0_AMT0': souvenirInfo['unitPrice'],
                    }
        
        paypalResponse = EC.set_express_checkout(nvpParams)


        hasError = ErrorOperation.has_set_error(self.response, paypalResponse, 'SetExpressCheckout')
        if hasError:
            return
        
        contents = urlparse.parse_qs(paypalResponse.content)
        
        
        # tokenをつけて、PayPalのページへ移動
        redirect_url = EC.generate_express_checkout_redirect_url(contents['TOKEN'][0])
        return self.redirect(redirect_url)
    def post(self):
    
        if self.has_session_error():
            return
    
    
        payerId = self.request.get('PayerID')
        souvenirInfo = Souvenir.get_souvenir()
        
        
        # もう一度 GetExpressCheckoutで支払額合計を取得する
        paypalResponse = EC.get_express_checkout_details(self.request.get('token'))
        hasGetError = ErrorOperation.has_get_error(self.response, paypalResponse, 'GetExpressCheckoutDetails')
        if hasGetError:
            return
            
        contents = urlparse.parse_qs(paypalResponse.content)
            
        # get時と金額を変えてもエラーも何も出ずに決済されるので、そこが怖い...
        nvpParams = { 'PAYERID': payerId,
                      'PAYMENTREQUEST_0_PAYMENTACTION': 'Sale',
                      'PAYMENTREQUEST_0_AMT': contents['PAYMENTREQUEST_0_AMT'][0],
                      'PAYMENTREQUEST_0_CURRENCYCODE': souvenirInfo['currency'],
                     }
        
        paypalResponse = EC.do_express_checkout_payment(self.request.get('token'),
                                                        nvpParams
                                                       )
        

        hasDoError = ErrorOperation.has_do_error(self.response, paypalResponse, 'DoExpressCheckoutPayment')
        if hasDoError:
            return
        

        self.response.out.write(template.render('html/success.html',{}))