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

Ost*_*tap 8 transactions paypal ruby-on-rails report

我需要获取交易数据(日期,有价值)和用户adata.我可以在这个问题中使用这个宝石进行一些修改吗?

另外,从文档:

例如,如果您计划使用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
Run Code Online (Sandbox Code Playgroud)

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

谁能给我代码的例子?

Fra*_*ois 1

Paypal Adaptive似乎是解决这个问题的方法,这里是我找到的一些文档,希望它有所帮助。

\n\n
\n\n

PayPal 与 Rails 3 自适应

\n\n

与往常一样,PayPal 文档相当混乱且杂乱无章,因此我认为我\xe2\x80\x99d 记录了我如何设法让 PayPal Adaptive 在市场风格的网站上工作。

\n\n
\n\n

警告!

\n\n

请使用这篇文章作为有关 paypal API 如何与您的 Rails 应用程序连接的指南。正如 Jamesw 在下面的评论中指出的那样,我还没有创建一种适当的方法来记录每笔交易的所有详细信息;毫无疑问,这是法律所要求的。所以也许读完这篇文章后看看他的评论。希望你能找到一种方法来做到这一点

\n\n
\n\n

设置

\n\n

经过一番搜索后,我发现现在最好使用的 gem 是paypal_adaptive。ActiveMerchant目前不支持PayPal Adaptive(有一个gem将其添加到\xe2\x80\x99s中,但似乎没有维护。)

\n\n
# Gemfile\ngem \'paypal_adaptive\'\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

怎么运行的

\n\n

PayPal Adaptive 相对简单,但凌乱的文档让它显得令人望而生畏。简而言之,我就是这样做的:

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

paypal_adaptive.yml

\n\n

转到此处创建一个沙盒帐户(您将需要它)。登录后,转到\xe2\x80\x9c创建预配置帐户\xe2\x80\x9d。创建两个帐户 \xe2\x80\x93 一个买家和一个卖家。如果您使用链式或并行付款(分摊给多人的付款),则创建更多帐户。

\n\n

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

\n\n

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

\n\n
development:\n  environment: "sandbox"\n  username: "platts_xxxxxxxx_biz_api1.gmail.com"\n  password: "xxxxxxxxxxxx"\n  signature: "xxxxxxx"\n  application_id: "APP-80W284485P519543T"\n\ntest:\n  environment: "sandbox"\n  username: "platts_xxxxxxxx_biz_api1.gmail.com"\n  password: "xxxxxxxx"\n  signature: "xxxxxxxx"\n  application_id: "APP-80W284485P519543T"\n\nproduction:\n  environment: "production"\n  username: "my_production_username"\n  password: "my_production_password"\n  signature: "my_production_signature"\n  application_id: "my_production_app_id"\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

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

\n\n

在这里,您实际上只需要支付的金额以及您希望这笔钱发送到的电子邮件列表。因此,编写您的逻辑来解决这个问题,然后致电 PayPal 来设置购买。

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

处理 IPN 呼叫

\n\n

我将 IPN 呼叫从 PayPal 路由至此方法:

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

不幸的是,如果您在本地主机上,PayPal 无法\xe2\x80\x99 向您发送 IPN,因此测试整个过程会出现问题。Ryan Bates\xe2\x80\x99 解决方案是使用curl 来模拟IPN 请求。然而,正如您在上面的代码中看到的,我们向 PayPal 发出另一个请求,确认 IPN 是真实的。因此,即使curl 发送假IPN,我们也会遇到问题。我\xe2\x80\x99m 现在要去寻找解决方案,但如果您有任何想法,请发表评论。

\n