从 cURL 支付向 paypal IPN 添加自定义变量

Posted

技术标签:

【中文标题】从 cURL 支付向 paypal IPN 添加自定义变量【英文标题】:Adding custom variables to paypal IPN from a cURL payment 【发布时间】:2014-02-21 22:51:46 【问题描述】:

我的问题:设置将在 IPN 上返回的贝宝变量。

所以背景: 我正在使用 CodeIgniter,并且正在使用我发现的预制在线库来处理整个贝宝的事情。图书馆做了繁重的工作,而且效果很好。 [这是我正在使用的库][1]

据我了解,该库使用 XML 格式向贝宝发送一个包含所有需要信息的 cURL 请求,基本上如贝宝本身所描述的 [此处][2]

这个库的文档记录很差,我不知道下一步该怎么做。

下一步,将数据添加到将显示在 IPN 上的 cURL 请求。

确切地说;我会找到一种添加数据的方法,我更感兴趣的是最后应该是什么样子。

这是 cURL 请求的经典事务部分(来自我收集的内容):

 "transactions":[
    
      "amount":
        "total":"7.47",
        "currency":"USD"
      
    
  ]

我想知道我需要的信息应该是什么样子,例如,如果我想传递用户 ID,它会不会是类似于

"userID":"4",

它应该嵌套在其他参数中吗?

如果需要任何其他代码,我很乐意发布它,我确实广泛搜索了该主题,并且我找到的所有答案都与表单和隐藏字段有关,对我来说不是这种情况。(正如所说的 paypal 被激怒了通过使用 cURL 的 php 函数)。

提前致谢!

编辑:

你好!感谢您的回复,非常感谢这个很棒的库:) 我将 Adaptive_payments 控制器与 pay 方法一起使用。

我刚刚意识到 invoiceID 确实会被退回,这非常合适。 不过,我在您的回答中遗漏了一些内容,IPN 没有返回许多字段,包括 customerID(这是我尝试使用的,我只是假设没有返回任何内容)。

这是 IPN 捕获的我的回归论点:

    cmd=_notify-validate
    &transaction_subject=
    &payment_date=12%3A02%3A40+Jan+29%2C+2014+PST
    &txn_type=web_accept
    &last_name=patrick
    &residence_country=US
    &item_name=
    &payment_gross=50.00
    &mc_currency=USD
    &business=test@example.com //not the actual email
    &payment_type=instant
    &protection_eligibility=Ineligible
    &verify_sign=ASsSVovq77sBsVg2xPiCnEG3N9AIAD1pW3tgoSX59hTmz9AA9lT6AH0E
    &payer_status=verified
    &test_ipn=1
    &tax=0.00
    &payer_email=patrick.buyer%40gmail.com
    &txn_id=69J264685H5924531&quantity=0
    &receiver_email=test@example.com //not the actual email
    &first_name=patrick
    &payer_id=5MLPF23854T8Q
    &receiver_id=F5K3CSR99E9WA
    &item_number=
    &payment_status=Completed
    &payment_fee=1.75
    &mc_fee=1.75
    &mc_gross=50.00
    &custom=
    &charset=windows-1252
    &notify_version=3.7
    &ipn_track_id=50879f4bb9d2

似乎并非所有控制器的控件都由 IPN 返回。 发票将非常适合我,我会标记为已回答。 非常感谢您的时间和精力。

编辑 2: $PayPalResult['RawResponse'] 由于某种原因不存在,我做了一个 $PayPalResult 的 var_dump (在adaptive_payment控制器中,就在我重定向到paypal之前)。

array(10) 
  ["Errors"]=>
  array(0) 
  
  ["Ack"]=>
  string(7) "Success"
  ["Build"]=>
  string(7) "7935900"
  ["CorrelationID"]=>
  string(13) "8c2afcee2d74b"
  ["Timestamp"]=>
  string(29) "2014-01-31T02:37:38.806-08:00"
  ["PayKey"]=>
  string(20) "AP-1WW538504G900525L"
  ["PaymentExecStatus"]=>
  string(7) "CREATED"
  ["RedirectURL"]=>
  string(81) "https://www.sandbox.paypal.com/webscr?cmd=_ap-payment&paykey=AP-1WW538504G900525L"
  ["XMLRequest"]=>
  string(1439) "ReturnAllen_USPAYhttp://httpexample.no-ip.biz/ROOT/index.php/userControllers/regularuserActions/viewShoppingCartAPP-80W284485P519543T109.67.55.127USDBALANCECREDITCARDhttp://httpexample.no-ip.biz/root/index.php/main/IPNIPN100XXXXXXX@gmail.com5SERVICEfalsehttp://httpexample.no-ip.biz/ROOT/index.php/userControllers/regularuserActions/paypalSuccess"
  ["XMLResponse"]=>
  string(373) "2014-01-31T02:37:38.806-08:00Success8c2afcee2d74b7935900AP-1WW538504G900525LCREATED"

简而言之,我的 IPN 类正在被调用,但它找不到任何要处理的信息(我已经通过日志确认了这一点,调试显示该类被调用但不存在 $_POST 数据)。

编辑 3:

XML 请求生成良好,我测试的特定属性是 myownID - 出现在请求中。

由于某种原因,虽然没有发回 $_POST 信息。 IPN 方法中的这一行:

$this->_log('debug - IPN 导出的应用程序是'.var_export($_POST));

在我的日志中显示如下: 调试 - 应用程序的 IPN 导出是

[XMLRequest] => <?xml version="1.0" encoding="utf-8"?><PayRequest xmlns="http://svcs.paypal.com/types/ap"><requestEnvelope xmlns=""><detailLevel>ReturnAll</detailLevel><errorLanguage>en_US</errorLanguage></requestEnvelope><actionType xmlns="">PAY</actionType><cancelUrl xmlns="">http://httpexample.no-ip.biz/ROOT/index.php/userControllers/regularuserActions/viewShoppingCart</cancelUrl><clientDetails xmlns=""><applicationId xmlns="">APP-80W284485P519543T</applicationId><customerId xmlns="">myownID</customerId><geoLocation xmlns="">Israel</geoLocation><ipAddress xmlns="">109.67.55.127</ipAddress></clientDetails><currencyCode xmlns="">ILS</currencyCode><fundingConstraint xmlns=""><allowedFundingType xmlns=""><fundingTypeInfo xmlns=""><fundingType xmlns="">BALANCE</fundingType></fundingTypeInfo><fundingTypeInfo xmlns=""><fundingType xmlns="">CREDITCARD</fundingType></fundingTypeInfo></allowedFundingType></fundingConstraint><ipnNotificationUrl xmlns="">http://httpexample.no-ip.biz/root/index.php/main/IPN</ipnNotificationUrl><receiverList xmlns=""><receiver xmlns=""><amount xmlns="">25</amount><email xmlns="">XXXXXX@gmail.com</email><invoiceId xmlns="">5</invoiceId><paymentType xmlns="">SERVICE</paymentType><primary xmlns="">false</primary></receiver></receiverList><sender><useCredentials xmlns=""></useCredentials></sender><account xmlns=""><phone xmlns=""></phone></account><returnUrl xmlns="">http://httpexample.no-ip.biz/ROOT/index.php/userControllers/regularuserActions/paypalSuccess</returnUrl></PayRequest>

编辑:从应用程序 IPN 接收到的最新 IPN 属性到我的 IPN 方法中。

cmd=_notify-validate&
transaction=
&payment_request_date=Sun+Feb+02+08%3A25%3A52+PST+2014
&return_url=http%3A%2F%2Fhttpexample.no-ip.biz%2FROOT%2Findex.php%2FuserControllers%2FregularuserActions%2FpaypalSuccess
&fees_payer=EACHRECEIVER
&ipn_notification_url=http%3A%2F%2Fhttpexample.no-ip.biz%2Froot%2Findex.php%2Fpaypal%2Fpaypal_ipn%2Frunagain
&sender_email=patrick.buyer%40gmail.com
&verify_sign=AFcWxV21C7fd0v3bYYYRCps-s-rl31AwGY-gIhQZM2WI9Ae63J.CxI7j4y
&test_ipn=1
&cancel_url=http%3A%2F%2Fhttpexample.no-ip.biz%2FROOT%2Findex.php%2FuserControllers%2FregularuserActions%2FviewShoppingCart
&pay_key=AP-6RR41041VH869594S
&action_type=PAY
&transaction_type=Adaptive+Payment+PAY
&status=COMPLETED
&log_default_shipping_address_in_transaction=false
&charset=windows-1252
&notify_version=UNVERSIONED
&reverse_all_parallel_payments_on_error=false

【问题讨论】:

请记住,自适应支付有一个特定于应用程序的 IPN 和一个特定于商家的 IPN。您的应用程序将收到一个您在 API 请求中指定的 IPN URL。我相信一个会包含客户 ID。如果商家(卖家账户)在自己的 Paypal 账户中配置了 IPN,他们也会收到一个包含交易特定数据的 IPN。 感谢您的回答,这是否意味着我应该获得两组不同的 IPN?一个用于商家帐户,一个用于应用程序本身?我想这是有道理的。我猜我需要两个不同的 URL 来处理 IPN? 是的,API 将包含特定于应用程序 IPN 的 URL,然后您的 PayPal 个人资料将包含卖家帐户 IPN 所在的位置。 我似乎无法让应用程序 IPN 工作,但我不想打扰你,如果你能提供有关此事的任何文件,我会很高兴,暂时发票完美运行(尽管通过发票传递用户 ID 属性有点奇怪:)) 让我看看生成的 XML 请求的示例。结果返回为 $PayPalResult['RawResponse'] 【参考方案1】:

我是该库的开发人员,我很乐意提供帮助。不过,您发布的 JSON 内容指的是 PayPal 的新 REST API,这不是我的库使用的。它使用classic API's,它比现在的 REST API 更加成熟,限制更少。

您具体使用的是哪个 API?该库附带已设置的控制器,并在请求中包含所有可能的参数。请求中包含的任何数据也会返回到 IPN。

如果您有需要包含的自定义字段,那么您需要在可用时使用 CUSTOM 参数,或者另一种选择是将数据保存在您的数据库中,然后在 CUSTOM 或 INVNUM 中传递记录 ID。这样,ID 就会在 IPN 中返回,您可以将所有详细信息从数据库中提取出来。

如果您使用的是 Pay API,您可以在 $Receiver 数据中包含 InvoiceID 参数,该数据已包含在 Pay() 的控制器方法中。 Pay_with_options() 结合了 Pay 和 SetPaymentOptions API,它提供了更多参数,包括可以使用的 CustomID,也可以在 IPN 中返回。

如果您提供更多关于您正在使用的 API 的详细信息,我可以为您提供更多帮助。

【讨论】:

已编辑响应。谢谢

以上是关于从 cURL 支付向 paypal IPN 添加自定义变量的主要内容,如果未能解决你的问题,请参考以下文章

多次收到 Paypal IPN 响应

隐式自适应支付不生成 IPN

Paypal 链式支付 - 支付密钥和 IPN

如何通过 IPN 使用 Paypal 自适应支付?

Paypal 自适应支付和 IPN

paypal自适应支付IPN中的自定义字段