2010-12-31 2 views
2

나는 Ryan Bates' railcast 146을 따르고 있으며 실제로 도움이됩니다. 그러나, 메신저 개체를 프로세스에서 제거하려고 시도하고 주문을 개별적으로 처리합니다. 내가 가지고있는 문제는 두 번 사용되는 금액을 설정하는 방법입니다. 한 번 구매를 설정하고 실제로 한 번만 실행합니다. 이것은 내가이 일에 의지 한 것입니다,하지만 그것은 아마 나쁜 관행 생각 return_url의 양, 노출 : 나는 양의 숨겨진 필드를 추가 뷰에서 다음Paypal Express ActiveMerchant 통합

class OrdersController < ApplicationController 
    def express 
    response = EXPRESS_GATEWAY.setup_purchase(params[:amount], 
     :ip    => request.remote_ip, 
     :return_url  => new_order_url(:amount=>params[:amount]), 
     :cancel_return_url => root_url 
    ) 
    redirect_to EXPRESS_GATEWAY.redirect_url_for(response.token) 
    end 

    def new 
    @order = Order.new(:express_token => params[:token], :price_in_cents=>params[:amount]) 
    end 

를되도록 할 때 주문이 생성되면 금액이 생성됩니다 (주문 모델에 price_in_cents 필드를 추가했습니다). 그것은 잘 작동하지만 param으로 금액을 드러내는 것은 조금 iffy 수 있습니다. 나는 PARAMS에 양 주위를 통과하지 않고이 작업을 수행 할 수있는 방법, 요컨대

def purchase 
    response = process_purchase 
    transactions.create!(:action => "purchase", :amount => price_in_cents, :response => response) 
    cart.update_attribute(:purchased_at, Time.now) if response.success? 
    response.success? 
    end 

: 마지막으로, 구매 코드는 다음과 같습니다?

감사합니다.

답변

0

입력 해 주셔서 감사합니다. 결국 사용자 세션에 금액을 저장하는 일이 발생했습니다 (예 : session[:amount]). 프로세스를 완료하자마자 nil으로 설정합니다. 그런 식으로 사용자로부터 숨겨지며 새로운 개체를 만들거나 암호화하는 데 어려움을 겪습니다.

0

URL에 금액을 전송하는 것은 매우 나쁜 습관입니다. URL에서 지정하는 금액만큼 팔고있는 가격을 변경하고 구매할 수 있습니다.

이 문제를 해결하는 방법은 두 가지입니다.
1. 전달한 매개 변수를 암호화하고 URL에서 해독 할 수 있습니다. 암호화 방법보기 here
2. 구매 가격을 보유하는 새 엔티티를 만들 수 있습니다 (또는 장바구니를 사용하지 않으므로 특정 항목을 판매하는 경우).이 항목의 ID를 전달할 수 있습니다 필요한 때에 가격을 묻습니다.) 다음과 같이 입력하십시오 :

class OrdersController < ApplicationController 
    def express 
    @product = Product.find(params(:product_id)); 
    response = EXPRESS_GATEWAY.setup_purchase(product.price_in_cents, 
     :ip    => request.remote_ip, 
     :return_url  => new_order_url(product.price_in_cents), 
     :cancel_return_url => root_url 
    ) 
    redirect_to EXPRESS_GATEWAY.redirect_url_for(response.token) 
    end 

    def new 
    @product = Product.find(params(:product_id)); 
    @order = Order.new(:express_token => params[:token], :price_in_cents=> @product.price_in_cents) 
    end