狂欢场外付款Payu.in集成:如何将订单标记为已付款

时间:2016-02-27 07:19:26

标签: ruby-on-rails spree

我是ruby / rails / spree的新手。我正在使用spree-3.0.7实现印度支付网关。 我可以处理订单,但付款状态始终为balance_due。 控制器代码

def confirm
  payment_method = Spree::PaymentMethod.find(payment_method_id)

  Spree::LogEntry.create({
    source: payment_method,
    details: params.to_yaml
  })

  order = current_order || raise(ActiveRecord::RecordNotFound)

  if(address = order.bill_address || order.ship_address)
    firstname = address.firstname
  end

  #confirm for correct hash and order amount requested before marking an payment as 'complete'
  checksum_matched = payment_method.checksum_ok?([params[:status], '', '', '', '', '', '', params[:udf4], params[:udf3], params[:udf2], params[:udf1], order.email, firstname, @productinfo, params[:amount], params[:txnid]], params[:hash])
  if !checksum_matched
    flash.alert = 'Malicious transaction detected.'
    redirect_to checkout_state_path(order.state)
    return
  end
  #check for order amount
  if !payment_method.amount_ok?(order.total, params[:amount])
    flash.alert = 'Malicious transaction detected. Order amount not matched.'
    redirect_to checkout_state_path(order.state)
    return
  end

  payment = order.payments.create!({
    source_type: 'Spree::Gateway::Payumoney',#could be something generated by system
    amount: order.total,
    payment_method: payment_method
  })
  payment.started_processing!
  payment.pend!

  order.next
  order.update_attributes({:state => "complete", :completed_at => Time.now})

  if order.complete?
    order.update!
    flash.notice = Spree.t(:order_processed_successfully)

    redirect_to order_path(order)
    return
  else
    redirect_to checkout_state_path(order.state)
    return
  end
end

网关/型号代码

require "offsite_payments"
module Spree
  class Gateway::Payumoney < Gateway
    preference :merchant_id, :string
    preference :secret_key, :string


  def provider_class
    ::OffsitePayments.integration('Payu_In')
  end

  def provider
    #assign payment mode
    OffsitePayments.mode = preferred_test_mode == true ? :test : :production
    provider_class
  end

  def checksum(items)
    provider_class.checksum(preferred_merchant_id, preferred_secret_key, items)
  end    

  def auto_capture?
    true
  end

  def method_type
    "payumoney"
  end

  def support?(source)
    true
  end

  def authorization
    self
  end

  def purchase(amount, source, gateway_options={})
    ActiveMerchant::Billing::Response.new(true, "payumoney success")
  end

  def success?
    true
  end

  def txnid(order)
    order.id.to_s + order.number.to_s
  end

  def service_provider
    "payu_paisa"
  end

  def checksum_ok?(itms, pg_hash)
    Digest::SHA512.hexdigest([preferred_secret_key, *itms, preferred_merchant_id].join("|")) == pg_hash
  end

  def amount_ok?(order_total, pg_amount)
    BigDecimal.new(pg_amount) == order_total
  end
end

在狂欢付款文档https://guides.spreecommerce.com/developer/payments.html中,他们提到如果auto_capture?返回true,则会调用购买方法,但不会调用购买方法。 有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:0)

无需致电以下命令 payment.started_processing! payment.pend!

只需将付款保留在初始状态即可。即checkout声明并完成您的订单。

因为订单完成后会调用process_payments!。 此方法处理未经处理的付款,其标准如下所示 def unprocessed_payments payments.select { |payment| payment.checkout? } end

希望这能解决你的问题:)

答案 1 :(得分:0)

我通过将付款标记为完整来解决问题。

除去

payment.started_processing!
payment.pend!

添加

payment.complete

以上

order.next

我在github上发布了我的代码作为gem https://github.com/isantoshsingh/spree_payumoney

相关问题