在 ASP.net 中使用 NVP API 时 Paypal SetExpressCheckout 出现问题

发布于 2024-12-02 14:50:36 字数 5536 浏览 0 评论 0原文

嗨, 我正在实现我的 Facebook 游戏和 Paypal 的快速结账支付服务之间的集成。

我的网站是在 ASP.net 中开发的,我使用 NVP API 进行集成。

我的问题是我不断收到 10400 错误 - 订单总计丢失。

我的代码是:

// Set the key/value pairs to send in the request
var kvpl = new List<KeyValuePair<string, string>>();
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_PAYMENTACTION", "Sale"));
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_AMT", "23.00"));
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_ITEMAMT", "15.00"));
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_TAXAMT", "5.00"));
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_SHIPPINGAMT", "1.00"));
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_HANDLINGAMT", "1.00"));
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_INSURANCEAMT", "1.00"));
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_CURRENCYCODE", "ILS"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_NAME0", "The name of product 1"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_NUMBER0", "5543312"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_DESC0", "The description of product 1"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_AMT0", "10.00"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_QTY0", "1"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_NAME1", "The name of product 2"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_NUMBER1", "4431234"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_DESC1", "The description of product 2"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_AMT1", "5.00"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_QTY1", "1"));     
kvpl.Add(new KeyValuePair<string, string>("ALLOWNOTE", "1"));
kvpl.Add(new KeyValuePair<string, string>("NOSHIPPING", "1"));

// SetExpressCheckout
bool ret = test.ShortcutExpressCheckout(amt, ref token, ref retMsg, kvpl);

// Check return value
if (ret)
{
    // Success, store the token in the session and redirect to Paypal
    session["token"] = token;
    Response.Redirect( retMsg );
}
else
{
    // Something went wrong
    Response.Redirect("APIError.aspx?" + retMsg);
}

ShortcutExpressCheckout 方法的代码是:

public bool ShortcutExpressCheckout(string amt, ref string token, ref string retMsg, List<KeyValuePair<string, string>> customParams)
{
    string host = "www.paypal.com";
    if (bSandbox)
    {
        pendpointurl = "https://api-3t.sandbox.paypal.com/nvp";
        host = "www.sandbox.paypal.com";
    }

    string returnURL = "http://localhost:50020/" + "ConfirmPayment.aspx";
    string cancelURL = "http://localhost:50020/" + "CancelPayment.aspx";

    var encoder = new NVPCodec();
    encoder["VERSION"] = "72.0";
    encoder["METHOD"] = "SetExpressCheckout";        
    encoder["RETURNURL"] = returnURL;
    encoder["CANCELURL"] = cancelURL;

    if (customParams != null)
    {
        customParams.ForEach(kvp => encoder[kvp.Key] = kvp.Value);
    }

    string pStrrequestforNvp = encoder.Encode();
    string pStresponsenvp = HttpCall(pStrrequestforNvp);

    var decoder = new NVPCodec();
    decoder.Decode(pStresponsenvp);

    string strAck = decoder["ACK"].ToLower();
    if (strAck != null && (strAck == "success" || strAck == "successwithwarning"))
    {
        token = decoder["TOKEN"];

        string ECURL = "https://" + host + "/cgi-bin/webscr?cmd=_express-checkout" + "&token=" + token;

        retMsg = ECURL;
        return true;
    }
    else
    {
        retMsg = "ErrorCode=" + decoder["L_ERRORCODE0"] + "&" +
                 "Desc=" + decoder["L_SHORTMESSAGE0"] + "&" +
                 "Desc2=" + decoder["L_LONGMESSAGE0"];

        return false;
    }
}

由代码生成的请求是:

 METHOD=SetExpressCheckout&
 VERSION=72.0&
 RETURNURL=[removed]&
 CANCELURL=[removed]&
 PAYMENTREQUEST_0_PAYMENTACTION=Sale&
 PAYMENTREQUEST_0_AMT=23.00&
 PAYMENTREQUEST_0_ITEMAMT=15.00&
 PAYMENTREQUEST_0_TAXAMT=5.00&
 PAYMENTREQUEST_0_SHIPPINGAMT=1.00&
 PAYMENTREQUEST_0_HANDLINGAMT=1.00&
 PAYMENTREQUEST_0_INSURANCEAMT=1.00&
 PAYMENTREQUEST_0_CURRENCYCODE=ILS&
 L_PAYMENTREQUEST_0_NAME0=The+name+of+product+1&
 L_PAYMENTREQUEST_0_NUMBER0=5543312&
 L_PAYMENTREQUEST_0_DESC0=The+description+of+product+1&
 L_PAYMENTREQUEST_0_AMT0=10&L_PAYMENTREQUEST_0_QTY0=1&
 L_PAYMENTREQUEST_0_NAME1=The+name+of+product+2&
 L_PAYMENTREQUEST_0_NUMBER1=4431234&
 L_PAYMENTREQUEST_0_DESC1=The+description+of+product+2&
 L_PAYMENTREQUEST_0_AMT1=5.00&
 L_PAYMENTREQUEST_0_QTY1=1.00&
 ALLOWNOTE=1&
 NOSHIPPING=1

我得到的回复是:

TIMESTAMP=2011%2d09%2d01T12%3a23%3a19Z&
CORRELATIONID=cf89eeaa101ae&
ACK=Failure&
VERSION=2%2e3&
BUILD=2085867&
L_ERRORCODE0=10400&
  L_SHORTMESSAGE0=Transaction%20refused%20because%20of%20an%20invalid%20argument%2e%20See%20additional%20error%20messages%20for%20details%2e&
L_LONGMESSAGE0=Order%20total%20is%20missing%2e&
L_SEVERITYCODE0=Error

我查看了 paypal 提供的文档以及有关此问题的许多帖子,但我找不到我做错了什么。

任何帮助将不胜感激,

科比

Hi,
I am implementing the intergration between my Facebook game and Paypal's express checkout payment service.

My website is developed in ASP.net and I am using NVP API for the integration.

MY problem is that I am keep getting the 10400 error - Order Total is missing.

My code is:

// Set the key/value pairs to send in the request
var kvpl = new List<KeyValuePair<string, string>>();
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_PAYMENTACTION", "Sale"));
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_AMT", "23.00"));
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_ITEMAMT", "15.00"));
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_TAXAMT", "5.00"));
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_SHIPPINGAMT", "1.00"));
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_HANDLINGAMT", "1.00"));
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_INSURANCEAMT", "1.00"));
kvpl.Add(new KeyValuePair<string, string>("PAYMENTREQUEST_0_CURRENCYCODE", "ILS"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_NAME0", "The name of product 1"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_NUMBER0", "5543312"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_DESC0", "The description of product 1"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_AMT0", "10.00"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_QTY0", "1"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_NAME1", "The name of product 2"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_NUMBER1", "4431234"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_DESC1", "The description of product 2"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_AMT1", "5.00"));
kvpl.Add(new KeyValuePair<string, string>("L_PAYMENTREQUEST_0_QTY1", "1"));     
kvpl.Add(new KeyValuePair<string, string>("ALLOWNOTE", "1"));
kvpl.Add(new KeyValuePair<string, string>("NOSHIPPING", "1"));

// SetExpressCheckout
bool ret = test.ShortcutExpressCheckout(amt, ref token, ref retMsg, kvpl);

// Check return value
if (ret)
{
    // Success, store the token in the session and redirect to Paypal
    session["token"] = token;
    Response.Redirect( retMsg );
}
else
{
    // Something went wrong
    Response.Redirect("APIError.aspx?" + retMsg);
}

The code of the ShortcutExpressCheckout method is:

public bool ShortcutExpressCheckout(string amt, ref string token, ref string retMsg, List<KeyValuePair<string, string>> customParams)
{
    string host = "www.paypal.com";
    if (bSandbox)
    {
        pendpointurl = "https://api-3t.sandbox.paypal.com/nvp";
        host = "www.sandbox.paypal.com";
    }

    string returnURL = "http://localhost:50020/" + "ConfirmPayment.aspx";
    string cancelURL = "http://localhost:50020/" + "CancelPayment.aspx";

    var encoder = new NVPCodec();
    encoder["VERSION"] = "72.0";
    encoder["METHOD"] = "SetExpressCheckout";        
    encoder["RETURNURL"] = returnURL;
    encoder["CANCELURL"] = cancelURL;

    if (customParams != null)
    {
        customParams.ForEach(kvp => encoder[kvp.Key] = kvp.Value);
    }

    string pStrrequestforNvp = encoder.Encode();
    string pStresponsenvp = HttpCall(pStrrequestforNvp);

    var decoder = new NVPCodec();
    decoder.Decode(pStresponsenvp);

    string strAck = decoder["ACK"].ToLower();
    if (strAck != null && (strAck == "success" || strAck == "successwithwarning"))
    {
        token = decoder["TOKEN"];

        string ECURL = "https://" + host + "/cgi-bin/webscr?cmd=_express-checkout" + "&token=" + token;

        retMsg = ECURL;
        return true;
    }
    else
    {
        retMsg = "ErrorCode=" + decoder["L_ERRORCODE0"] + "&" +
                 "Desc=" + decoder["L_SHORTMESSAGE0"] + "&" +
                 "Desc2=" + decoder["L_LONGMESSAGE0"];

        return false;
    }
}

The request that generated by the code is:

 METHOD=SetExpressCheckout&
 VERSION=72.0&
 RETURNURL=[removed]&
 CANCELURL=[removed]&
 PAYMENTREQUEST_0_PAYMENTACTION=Sale&
 PAYMENTREQUEST_0_AMT=23.00&
 PAYMENTREQUEST_0_ITEMAMT=15.00&
 PAYMENTREQUEST_0_TAXAMT=5.00&
 PAYMENTREQUEST_0_SHIPPINGAMT=1.00&
 PAYMENTREQUEST_0_HANDLINGAMT=1.00&
 PAYMENTREQUEST_0_INSURANCEAMT=1.00&
 PAYMENTREQUEST_0_CURRENCYCODE=ILS&
 L_PAYMENTREQUEST_0_NAME0=The+name+of+product+1&
 L_PAYMENTREQUEST_0_NUMBER0=5543312&
 L_PAYMENTREQUEST_0_DESC0=The+description+of+product+1&
 L_PAYMENTREQUEST_0_AMT0=10&L_PAYMENTREQUEST_0_QTY0=1&
 L_PAYMENTREQUEST_0_NAME1=The+name+of+product+2&
 L_PAYMENTREQUEST_0_NUMBER1=4431234&
 L_PAYMENTREQUEST_0_DESC1=The+description+of+product+2&
 L_PAYMENTREQUEST_0_AMT1=5.00&
 L_PAYMENTREQUEST_0_QTY1=1.00&
 ALLOWNOTE=1&
 NOSHIPPING=1

And the response that I am getting is:

TIMESTAMP=2011%2d09%2d01T12%3a23%3a19Z&
CORRELATIONID=cf89eeaa101ae&
ACK=Failure&
VERSION=2%2e3&
BUILD=2085867&
L_ERRORCODE0=10400&
  L_SHORTMESSAGE0=Transaction%20refused%20because%20of%20an%20invalid%20argument%2e%20See%20additional%20error%20messages%20for%20details%2e&
L_LONGMESSAGE0=Order%20total%20is%20missing%2e&
L_SEVERITYCODE0=Error

I reviewed the documentation that paypal provides and many posts about this issue but I couldn't find what I am doing wrong.

Any help will be appreciated,

Koby

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦巷 2024-12-09 14:50:36

您的订单总计参数丢失,因为您使用的是旧版本。您显示的 API 请求与您的响应不匹配。

您实际上提交的是版本 2.3,而不是版本 72.0.. 请参阅您的 API 响应:“VERSION=2%2e3&”

以下请求和响应对我有用

API 请求

USER=********************
PWD=********************
SIGNATURE=********************
METHOD=SetExpressCheckout 
VERSION=72.0 
RETURNURL=******************** 
CANCELURL=********************
PAYMENTREQUEST_0_PAYMENTACTION=Sale 
PAYMENTREQUEST_0_AMT=23.00 
PAYMENTREQUEST_0_ITEMAMT=15.00 
PAYMENTREQUEST_0_TAXAMT=5.00 
PAYMENTREQUEST_0_SHIPPINGAMT=1.00 
PAYMENTREQUEST_0_HANDLINGAMT=1.00 
PAYMENTREQUEST_0_INSURANCEAMT=1.00 
PAYMENTREQUEST_0_CURRENCYCODE=ILS 
L_PAYMENTREQUEST_0_NAME0=The+name+of+product+1 
L_PAYMENTREQUEST_0_NUMBER0=5543312 
L_PAYMENTREQUEST_0_DESC0=The+description+of+product+1 
L_PAYMENTREQUEST_0_AMT0=10&L_PAYMENTREQUEST_0_QTY0=1 
L_PAYMENTREQUEST_0_NAME1=The+name+of+product+2 
L_PAYMENTREQUEST_0_NUMBER1=4431234 
L_PAYMENTREQUEST_0_DESC1=The+description+of+product+2 
L_PAYMENTREQUEST_0_AMT1=5.00 
L_PAYMENTREQUEST_0_QTY1=1.00 
ALLOWNOTE=1 
NOSHIPPING=1 

API 响应

TOKEN=EC-3UE641439J019845E
TIMESTAMP=2011-09-01T17:13:17Z
CORRELATIONID=4f7e60c2d70aa
ACK=Success
VERSION=72.0
BUILD=2085867

Your Order Total parameter is missing, because you're using an old version. The API request you show, and your response, do not match.

You're actually submitting version 2.3, not version 72.0.. see your API response: "VERSION=2%2e3& "

The below request and response worked for me

API Request

USER=********************
PWD=********************
SIGNATURE=********************
METHOD=SetExpressCheckout 
VERSION=72.0 
RETURNURL=******************** 
CANCELURL=********************
PAYMENTREQUEST_0_PAYMENTACTION=Sale 
PAYMENTREQUEST_0_AMT=23.00 
PAYMENTREQUEST_0_ITEMAMT=15.00 
PAYMENTREQUEST_0_TAXAMT=5.00 
PAYMENTREQUEST_0_SHIPPINGAMT=1.00 
PAYMENTREQUEST_0_HANDLINGAMT=1.00 
PAYMENTREQUEST_0_INSURANCEAMT=1.00 
PAYMENTREQUEST_0_CURRENCYCODE=ILS 
L_PAYMENTREQUEST_0_NAME0=The+name+of+product+1 
L_PAYMENTREQUEST_0_NUMBER0=5543312 
L_PAYMENTREQUEST_0_DESC0=The+description+of+product+1 
L_PAYMENTREQUEST_0_AMT0=10&L_PAYMENTREQUEST_0_QTY0=1 
L_PAYMENTREQUEST_0_NAME1=The+name+of+product+2 
L_PAYMENTREQUEST_0_NUMBER1=4431234 
L_PAYMENTREQUEST_0_DESC1=The+description+of+product+2 
L_PAYMENTREQUEST_0_AMT1=5.00 
L_PAYMENTREQUEST_0_QTY1=1.00 
ALLOWNOTE=1 
NOSHIPPING=1 

API Response

TOKEN=EC-3UE641439J019845E
TIMESTAMP=2011-09-01T17:13:17Z
CORRELATIONID=4f7e60c2d70aa
ACK=Success
VERSION=72.0
BUILD=2085867
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文