如何使用paypal_permissions gem获取PayPal的用户数据和交易详情?

时间:2012-07-10 07:39:12

标签: ruby-on-rails transactions report paypal

我需要获取交易数据(日期,有价值)和用户adata。我可以使用此gem进行一些修改,如question所示吗?

另外,来自文档:

  

例如,如果您计划使用getBasicPersonalData和getAdvancedPersonalData查询PayPal,则可能会生成以下商家模型:

rails generate paypal_permissions merchant email:string first_name:string last_name:string full_name:string country:string payer_id:string street1:string street2:string city:string state:string postal_code_string phone:string birth_date:string 
bundle exec
rake db:migrate

我应该使用付款数据传输(PDT)还是TRANSACTION_DETAILS? 这是我将写数据的地方,但我如何从PayPal获取数据?

任何人都可以给我一些代码示例吗?

1 个答案:

答案 0 :(得分:1)

Paypal Adaptive 似乎是这样做的方法,这里有一些我发现的文档,希望它有所帮助。


使用Rails 3的PayPal自适应

像往常一样,PayPal文档非常杂乱无序,因此我想我已经记录了如何在市场风格的网站上设置PayPal Adaptive。


警告!

请使用此帖子作为paypal API如何与您的rails应用程序连接的指南。正如Jamesw在下面的评论中指出的那样,我没有创建一个记录每笔交易的所有细节的充分方法;法律无疑要求的东西。所以也许在阅读之后看看他的评论。希望你能找到一种方法来做到这一点


设置

经过一番搜索,我发现现在使用的最好的宝石是paypal_adaptive。 ActiveMerchant目前不支持PayPal Adaptive(有一个gem可以添加它,但它似乎没有被维护。)

# Gemfile
gem 'paypal_adaptive'

如何运作

PayPal Adaptive相对简单,但凌乱的文档可能会让它看起来令人生畏。简而言之,我就这样做了:

  1. 在您的配置文件夹中创建paypal_adaptive.yml并添加您的详细信息
  2. 创建资源来处理付款 - 我创建了“购买”资源(型号:购买)
  3. 当用户点击购买按钮时,它会在我的PurchasesController中调用我称为“购买”的操作
  4. 在“购买”操作中我首先创建一个新的购买项目(Purchase.new),然后添加一些细节,如user_id,product_id,amount等。
  5. 然后我在新创建的购买对象(purchase.pay)上调用名为“pay”的模型方法
  6. 在我的购买模型中我定义了“pay”方法,在其中我最终通过创建其Request类(PaypalAdaptive :: Request.new)来使用paypal_adaptive gem
  7. 我将要发送到PayPal的所有必要数据添加到哈希中,然后调用Request.pay方法,传入该数据哈希。这会向PayPal发出API调用,然后PayPal会回复确认此请求成功
  8. 如果API调用成功,我会将用户重定向到PayPal以登录并确认付款
  9. 一旦用户付款,PayPal会向您指定的IPN地址发送IPN(即时付款通知) - 我已将其路由到我的PurchasesController中的方法
  10. 在这个方法中,我找到了Purchase对象,并将其标记为已付款(purchase.paid = true),然后就完成了!

  11. paypal_adaptive.yml

    转到here创建沙盒帐户(您将需要它)。登录后,请转到“创建预配置帐户”。创建两个帐户 - 一个买家和一个卖家。如果您使用链式或并行付款(付款分配给多个人),则再创建一些帐户。

    单击左侧面板中的Api凭证。

    现在使用这些凭据填写你的paypal_adaptive.yml(也使用我在下面提供的application_id - 这是www.x.com提供的测试application_id

    development:
      environment: "sandbox"
      username: "platts_xxxxxxxx_biz_api1.gmail.com"
      password: "xxxxxxxxxxxx"
      signature: "xxxxxxx"
      application_id: "APP-80W284485P519543T"
    
    test:
      environment: "sandbox"
      username: "platts_xxxxxxxx_biz_api1.gmail.com"
      password: "xxxxxxxx"
      signature: "xxxxxxxx"
      application_id: "APP-80W284485P519543T"
    
    production:
      environment: "production"
      username: "my_production_username"
      password: "my_production_password"
      signature: "my_production_signature"
      application_id: "my_production_app_id"
    

    创建控制器操作以处理购买请求

    在这里,您只需要支付足够的金额以及您希望获得这笔钱的电子邮件列表。所以写下你的逻辑来解决这个问题,然后打电话给PayPal设置购买。

    pay_request = PaypalAdaptive::Request.new
        data = {
          "returnUrl" => return_url,
          "requestEnvelope" => {"errorLanguage" => "en_US"},
          "currencyCode" => "USD",
          "receiverList" =>
                  { "receiver" => [
                    {"email" => "platts_xxxxxxxx_biz@gmail.com", "amount"=> amount}
                  ]},
          "cancelUrl" => cancel_url,
          "actionType" => "PAY",
          "ipnNotificationUrl" => ipn_url
        }
    
        #To do chained payments, just add a primary boolean flag:{“receiver”=> [{"email"=>"PRIMARY", "amount"=>"100.00", "primary" => true}, {"email"=>"OTHER", "amount"=>"75.00", "primary" => false}]}
    
        pay_response = pay_request.pay(data)
    
        if pay_response.success?
            # Send user to paypal
            redirect_to pay_response.approve_paypal_payment_url
        else
            puts pay_response.errors.first['message']
            redirect_to "/", notice: "Something went wrong. Please contact support."
        end
    

    处理IPN呼叫

    我将来自PayPal的IPN呼叫路由到此方法:

    def ipn_notification
        ipn = PaypalAdaptive::IpnNotification.new
        ipn.send_back(request.raw_post)
    
        if ipn.verified?
          logger.info "IT WORKED"
        else
          logger.info "IT DIDNT WORK"
        end
    
        render nothing: true
      end
    

    不幸的是,如果您使用的是localhost,PayPal无法向您发送IPN,因此测试整个过程存在问题。 Ryan Bates的解决方案是使用curl来模仿IPN请求。但是,正如您在上面的代码中看到的那样,我们向PayPal发出另一个请求,确认IPN是真实的。因此,即使卷发发送假IPN,我们也会遇到问题。我现在要去寻找解决方案,但如果你有任何想法,请发表评论。