付款有效,但用户永远不知道它是在 Paypal 页面上的订阅还是一次性付款

Posted

技术标签:

【中文标题】付款有效,但用户永远不知道它是在 Paypal 页面上的订阅还是一次性付款【英文标题】:Payment works but the user never knows if it was a subscription or one time payment on the Paypal page 【发布时间】:2012-02-18 11:05:38 【问题描述】:

所以我已将 Paypal 集成到我的支付流程中,结果如下:

用户进入页面。点击支付按钮 用户首先被重定向到调用SetExpressCheckout 的页面并被重定向到Paypal。 (他会被记一次,比如 77 美元,然后每个月支付 1 年相同的金额。因此我没有设置初始金额,而是直接扣除。) 返回时,他单击确认按钮,使用DoExpressCheckout 扣除一次付款并创建计费配置文件。

一切正常。我每个月都会收到付款。用户一开始不会被计费两次。

问题:当用户被重定向到 Paypal 时,他只能看到我设置的 ITEM NAMEDESCRIPTION。 IE。 Paypal 没有描述交易是一次性的还是订阅,就像您使用简单的订阅按钮进行付款时那样。 Paypal 仅提及金额,但未提及交易类型。

NVPEncoder encoder = new NVPEncoder();

encoder.add("METHOD","SetExpressCheckout");
encoder.add("RETURNURL",returnURL);
encoder.add("CANCELURL",cancelURL);             
encoder.add("CURRENCYCODE","USD");
encoder.add("AMT",amt);
encoder.add("BILLINGPERIOD", "Month");
encoder.add("BILLINGFREQUENCY", "1");
encoder.add("PROFILESTARTDATE",dateFormatGmt.format(new Date()));
encoder.add("L_BILLINGTYPE0", "RecurringPayments");
encoder.add("L_BILLINGAGREEMENTDESCRIPTION0",package_name);
encoder.add("L_NAME0",package_name);
encoder.add("L_AMT0",amt);
encoder.add("L_QTY0","1");

String strNVPRequest = encoder.encode();
String ppresponse = (String) caller.call(strNVPRequest);
NVPDecoder resultValues = new NVPDecoder();
resultValues.decode(ppresponse);
String strAck = resultValues.get("ACK"); 
if (strAck !=null && !(strAck.equals("Success") || 
            strAck.equals("SuccessWithWarning"))) 
    response.sendRedirect("APIError.jsp");
 else 
    response.sendRedirect(redirectUrl);

【问题讨论】:

您应该提供如何实现表单的示例。我认为您已阅读所有文档并且您传递了正确的 cmd 值。 paypal.com/eBay/cgi-bin/webscr?cmd=p/pdn/… 添加了代码。我在这里使用网站支付专业版。我没有尝试通过将 POST 数据发送到 Paypal 来实现表单。但是现在我想起来了,它是否可以无缝运行?在会员网站上实施它之前我还应该知道什么吗? 【参考方案1】:

你包括L_BILLINGTYPE0=RecurringPayments吗? 这就是应该更改 PayPal 登录页面上的措辞的原因。

回顾一下;使用(至少)以下参数调用以下 API 调用:

SetExpressCheckout:

$nvps = array();
$nvps["VERSION"] = "80.0";

$nvps["METHOD"] = "SetExpressCheckout";

$nvps["PAYMENTREQUEST_0_PAYMENTACTION"] = "Sale";
$nvps["PAYMENTREQUEST_0_AMT"] = "1.00";
$nvps["PAYMENTREQUEST_0_CURRENCYCODE"] = "GBP";
$nvps["PAYMENTREQUEST_0_ITEMAMT"] = "1.00";

$nvps["L_BILLINGTYPE0"] = 'RecurringPayments';
$nvps["L_BILLINGAGREEMENTDESCRIPTION0"] = "the subscription";

$nvps["L_PAYMENTREQUEST_0_NUMBER0"] = 1;
$nvps["L_PAYMENTREQUEST_0_NAME0"]= "subscription";
$nvps["L_PAYMENTREQUEST_0_AMT0"]= 1.00;
$nvps["L_PAYMENTREQUEST_0_QTY0"]= 1;

还有 CreateRecurringPaymentsProfile 和:

$nvps["PROFILESTARTDATE"] = "2011-07-08T17:40:00Z";
$nvps["BILLINGPERIOD"] = "Month";
$nvps["BILLINGFREQUENCY"] = "1";
$nvps["AMT"] = "1.00";
$nvps["CURRENCYCODE"] = "GBP";
$nvps["DESC"] = "the subscription";

【讨论】:

我刚刚在这里发布了我的代码。它在 Java 中,但我认为它不应该有太大的区别。我看到你发送的 NVP 比我的代码多。是因为我使用的 Paypal SDK 版本吗? 我也尝试在您的帖子中手动发送 NVP,但收到 10001 内部错误(“超时处理请求。”)

以上是关于付款有效,但用户永远不知道它是在 Paypal 页面上的订阅还是一次性付款的主要内容,如果未能解决你的问题,请参考以下文章

PayPal 购物车上传 - 如果用户点击离开 PayPal,则链接返回以稍后付款

PayPal 单笔付款到电子邮件

Paypal 自适应付款 - 完成付款

贝宝定期付款 - 猝死

贝宝定期付款 - 猝死

如何在付款时添加公司标志