快速结账订单总计缺失

时间:2014-04-13 05:46:00

标签: ruby-on-rails ruby paypal express-checkout

我一直收到错误#10400(订单总数不足)但不确定我要遗漏的是什么。一切似乎都正确处理。这是付款设置的地方:

def setcheckout
    api = PayPal::SDK::Merchant::API.new


    @set_express_checkout = api.build_set_express_checkout(params[:SetExpressCheckoutRequestType])

    # Find Item Total and Order Total
    details = @set_express_checkout.SetExpressCheckoutRequestDetails
    pay = details.PaymentDetails[0]

    pay.PaymentDetailsItem[0].Name = 'Item'
    pay.PaymentDetailsItem[0].Amount = 1
    pay.PaymentDetailsItem[0].Quantity = 1

    pay.ItemTotal  = pay.PaymentDetailsItem[0].Amount
    pay.OrderTotal.currencyID = pay.ItemTotal.currencyID
    pay.OrderTotal.value = pay.ItemTotal.value.to_f

    # Notify url
    #pay.NotifyURL ||= ipn_notify_url

    # Return and cancel url
    details.ReturnURL ||= 'http://localhost:3000/confirm'
    details.CancelURL ||= 'http://localhost:3000/failed'

    @set_express_checkout_response = api.set_express_checkout(@set_express_checkout)


    if @set_express_checkout_response.success?
      redirect_to "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=#{@set_express_checkout_response.Token}"
    end
end

这会将我带到paypal,对用户进行身份验证,然后按预期返回确认网址。看起来像这样:

def confirm
    session[:token]   = params[:token]    if params[:token]
    session[:PayerID] = params[:PayerID]  if params[:PayerID]

    api = PayPal::SDK::Merchant::API.new
    @do_express_checkout_payment = api.build_do_express_checkout_payment(params[:DoExpressCheckoutPaymentRequestType])
    details = @do_express_checkout_payment.DoExpressCheckoutPaymentRequestDetails
    details.Token   = session[:token]
    details.PayerID = session[:PayerID]
    #details.PaymentDetails[0].NotifyURL ||= ipn_notify_url
    @do_express_checkout_payment_response = api.do_express_checkout_payment(@do_express_checkout_payment) if request.post?
end

单击“确认并付款”按钮并将上述内容发布到该按钮后,事务将失败并显示10400 Order total is missing.错误。在我看来,就像我指定上面的订单总数,当我被带到贝宝时显示总数。我错过了什么?

1 个答案:

答案 0 :(得分:2)

我没有看到您的DoExpressCheckoutPayment请求中发送的总数。您需要在SEC中包含与SEC中相同的详细信息。

从版本112.0开始,他们引入了USESESSIONPAYMENTDETAILS参数,该参数允许告诉DECP只使用您在SEC中发送的内容,如果将其设置为true或1.似乎有一些差异,无论它是否有效但是。我还没有自己测试一下。