从 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
¬ify_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
¬ify_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 添加自定义变量的主要内容,如果未能解决你的问题,请参考以下文章