Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 贝宝快捷结账Asp.Net_C#_Asp.net_Web Services_Paypal - Fatal编程技术网

C# 贝宝快捷结账Asp.Net

C# 贝宝快捷结账Asp.Net,c#,asp.net,web-services,paypal,C#,Asp.net,Web Services,Paypal,简单的问题。我该怎么做呢 我已经成功连接到Paypal web服务并使用沙盒,但我甚至无法开始 在您必须遵循的步骤中,文档很容易理解,但我无法获得任何代码来编译,更不用说运行了。这是我所能做到的。请参见下文,PayPalTest是我的服务参考的名称 我已经标记了开始出错的地方,我无法正确获取参数,无论我试图声明或实例化什么,都会得到一个无效的类型错误(厄运的红色波浪线) 我应该做什么。是否有人有工作样本可供分享。是的,我可以看到很多使用Ajax、jQuery等的示例。但是我找不到任何我想要的方式

简单的问题。我该怎么做呢

我已经成功连接到Paypal web服务并使用沙盒,但我甚至无法开始

在您必须遵循的步骤中,文档很容易理解,但我无法获得任何代码来编译,更不用说运行了。这是我所能做到的。请参见下文,
PayPalTest
是我的服务参考的名称

我已经标记了开始出错的地方,我无法正确获取参数,无论我试图声明或实例化什么,都会得到一个无效的类型错误(厄运的红色波浪线)

我应该做什么。是否有人有工作样本可供分享。是的,我可以看到很多使用Ajax、jQuery等的示例。但是我找不到任何我想要的方式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace GenericWebApplication.ApplicationClasses
{
    class PayPalIntegration
    {
        public void PayForGoods()
        {
            PayPalTest.CustomSecurityHeaderType c = new PayPalTest.CustomSecurityHeaderType();

            c.Credentials.Username = "xxxxx.xxxxx.xxxxx.xxxxx";
            c.Credentials.Password = "XXXXXXXXXXXX";
            c.Credentials.Signature = "XXxxX-XXXxxXXxX.XXXXXXXxxXXxXX-XXXXxxxXXXXxxXXXXxxXXX";

            PayPalTest.PayPalAPIAAInterfaceClient cl = new PayPalTest.PayPalAPIAAInterfaceClient();
            //I get stuck here
            PayPalTest.SetExpressCheckoutReq r = new PayPalTest.SetExpressCheckoutReq();

            PayPalTest.SetExpressCheckoutRequestDetailsType d = new SetExpressCheckoutRequestDetailsType();
            d.ReturnURL = "";
            d.CancelURL = "";

            PayPalTest.SetExpressCheckoutResponse re = cl.SetExpressCheckout(d, d);

        }
    }
}
[更新]

    encoder["METHOD"] = "SetExpressCheckout";
    encoder["USER"] = APIUsername;
    encoder["PWD"] = APIPassword;
    encoder["SIGNATURE"] = APISignature;
    encoder["RETURNURL"] = returnURL;
    encoder["CANCELURL"] = cancelURL;
    encoder["VERSION"] = SystemFunctions.Settings("PayPalVersion", "")[0].Value;
    encoder["NOSHIPPING"] = "2";
    encoder["PAYMENTREQUEST_0_AMT"] = amt;
    encoder["MAXAMT"] = amt;
    encoder["PAYMENTREQUEST_0_PAYMENTACTION"] = "Sale";
    encoder["PAYMENTREQUEST_0_CURRENCYCODE"]  = "GBP";
    encoder["PAYMENTREQUEST_0_DESC"] = "test EC payment";
    encoder["PAYMENTREQUEST_0_SHIPPINGAMT"] = SystemFunctions.Shipping;
    //Optional Shipping Address entered on the merchant site
    encoder["PAYMENTREQUEST_0_SHIPTONAME"]       = shipToName;
    encoder["PAYMENTREQUEST_0_SHIPTOSTREET"]     = shipToStreet;
    encoder["PAYMENTREQUEST_0_SHIPTOSTREET2"]    = shipToStreet2;
    encoder["PAYMENTREQUEST_0_SHIPTOCITY"]       = shipToCity;
    encoder["PAYMENTREQUEST_0_SHIPTOSTATE"]      = shipToState;
    encoder["PAYMENTREQUEST_0_SHIPTOZIP"]        = shipToZip;
    encoder["PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE"]= shipToCountryCode;
    encoder["EMAIL"] = SystemFunctions.UserAddress.Email;
    encoder["SOLUTIONTYPE"] = "Sole";
    encoder["LANDINGPAGE"] = "Billing";
    encoder["CHANNELTYPE"] = "Merchant";
    encoder["PAYMENTREQUEST_0_ITEMAMT"] = SystemFunctions.TrolleyTotal.ToString("0.00");
    encoder["L_PAYMENTREQUEST_0_NAME0"] = "Goods";
    encoder["L_PAYMENTREQUEST_0_AMT0"] = SystemFunctions.TrolleyTotal.ToString("0.00");
    encoder["L_PAYMENTREQUEST_0_NUMBER0"]="ABC123";
    encoder["L_PAYMENTREQUEST_0_QTY0"] = "1";
PayPal开发者网站上的PayPal提供了用于快速结账的ASP.Net示例。只需从下拉列表中选择ASP.net即可

这里只是一些样品。您可以从PayPal代码向导获得所有ASP.Net以及函数。您需要从PayPal代码向导下载五个文件。我确实包括了来自PayPal向导站点的代码片段

这是处理账单的代码部分:

if (PaymentOption == "PayPal")
{
NVPAPICaller test = new NVPAPICaller();

string retMsg = "";
string token = "";

if (Session["payment_amt"] != null)
{
    string amt = Session["payment_amt"].ToString();

    //Optional Shipping Address entered on the merchant site
    string shipToName           = "<PAYMENTREQUEST_0_SHIPTONAME>";
    string shipToStreet        = "<PAYMENTREQUEST_0_SHIPTOSTREET>";
    string shipToStreet2       = "<PAYMENTREQUEST_0_SHIPTOSTREET2>";
    string shipToCity           = "<PAYMENTREQUEST_0_SHIPTOCITY>";
    string shipToState          = "<PAYMENTREQUEST_0_SHIPTOSTATE>";
    string shipToZip            = "<PAYMENTREQUEST_0_SHIPTOZIP>";
    string shipToCountryCode    = "<PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE>";

    bool ret = test.MarkExpressCheckout(amt, shipToName, shipToStreet, shipToStreet2,
                    shipToCity, shipToState, shipToZip, shipToCountryCode,
                    ref token, ref retMsg);
    if (ret)
    {
        Session["token"] = token;
        Response.Redirect(retMsg);
    }
    else
    {
        Response.Redirect("APIError.aspx?" + retMsg);
    }
}
else
{
    Response.Redirect( "APIError.aspx?ErrorCode=AmtMissing" );
}
}
这是处理付款确认的部分:

if (PaymentOption == "PayPal")
{
NVPAPICaller test = new NVPAPICaller();

string retMsg = "";
string token = "";
string finalPaymentAmount = "";
string payerId = "";
NVPCodec decoder;

token = Session["token"].ToString();
payerId = Session["payerId"].ToString();
finalPaymentAmount = Session["payment_amt"].ToString();

bool ret = test.ConfirmPayment( finalPaymentAmount, token, PayerId, ref decoder, ref retMsg );
if (ret)
{
    // Unique transaction ID of the payment. Note:  If the PaymentAction of the request was Authorization or Order, this value is your AuthorizationID for use with the Authorization & Capture APIs. 
    string transactionId    = decoder["PAYMENTINFO_0_TRANSACTIONID"]; 

    // The type of transaction Possible values: l  cart l  express-checkout 
    string transactionType = decoder["PAYMENTINFO_0_TRANSACTIONTYPE"]; 

    // Indicates whether the payment is instant or delayed. Possible values: l  none l  echeck l  instant 
    string paymentType      = decoder["PAYMENTINFO_0_PAYMENTTYPE"]; 

    // Time/date stamp of payment
    string orderTime        = decoder["PAYMENTINFO_0_ORDERTIME"]; 

    // The final amount charged, including any shipping and taxes from your Merchant Profile.
    string amt              = decoder["PAYMENTINFO_0_AMT"];

    // A three-character currency code for one of the currencies listed in PayPay-Supported Transactional Currencies. Default: USD.    
    string currencyCode = decoder["PAYMENTINFO_0_CURRENCYCODE"];

    // PayPal fee amount charged for the transaction    
    string feeAmt           = decoder["PAYMENTINFO_0_FEEAMT"]; 

    // Amount deposited in your PayPal account after a currency conversion.    
    string settleAmt        = decoder["PAYMENTINFO_0_SETTLEAMT"]; 

    // Tax charged on the transaction.    
    string taxAmt           = decoder["PAYMENTINFO_0_TAXAMT"];

    //' Exchange rate if a currency conversion occurred. Relevant only if your are billing in their non-primary currency. If 
    string exchangeRate = decoder["PAYMENTINFO_0_EXCHANGERATE"];
}
else
{
    Response.Redirect("APIError.aspx?" + retMsg);
}
}
PayPal开发者网站上的PayPal提供了用于快速结账的ASP.Net示例。只需从下拉列表中选择ASP.net即可

这里只是一些样品。您可以从PayPal代码向导获得所有ASP.Net以及函数。您需要从PayPal代码向导下载五个文件。我确实包括了来自PayPal向导站点的代码片段

这是处理账单的代码部分:

if (PaymentOption == "PayPal")
{
NVPAPICaller test = new NVPAPICaller();

string retMsg = "";
string token = "";

if (Session["payment_amt"] != null)
{
    string amt = Session["payment_amt"].ToString();

    //Optional Shipping Address entered on the merchant site
    string shipToName           = "<PAYMENTREQUEST_0_SHIPTONAME>";
    string shipToStreet        = "<PAYMENTREQUEST_0_SHIPTOSTREET>";
    string shipToStreet2       = "<PAYMENTREQUEST_0_SHIPTOSTREET2>";
    string shipToCity           = "<PAYMENTREQUEST_0_SHIPTOCITY>";
    string shipToState          = "<PAYMENTREQUEST_0_SHIPTOSTATE>";
    string shipToZip            = "<PAYMENTREQUEST_0_SHIPTOZIP>";
    string shipToCountryCode    = "<PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE>";

    bool ret = test.MarkExpressCheckout(amt, shipToName, shipToStreet, shipToStreet2,
                    shipToCity, shipToState, shipToZip, shipToCountryCode,
                    ref token, ref retMsg);
    if (ret)
    {
        Session["token"] = token;
        Response.Redirect(retMsg);
    }
    else
    {
        Response.Redirect("APIError.aspx?" + retMsg);
    }
}
else
{
    Response.Redirect( "APIError.aspx?ErrorCode=AmtMissing" );
}
}
这是处理付款确认的部分:

if (PaymentOption == "PayPal")
{
NVPAPICaller test = new NVPAPICaller();

string retMsg = "";
string token = "";
string finalPaymentAmount = "";
string payerId = "";
NVPCodec decoder;

token = Session["token"].ToString();
payerId = Session["payerId"].ToString();
finalPaymentAmount = Session["payment_amt"].ToString();

bool ret = test.ConfirmPayment( finalPaymentAmount, token, PayerId, ref decoder, ref retMsg );
if (ret)
{
    // Unique transaction ID of the payment. Note:  If the PaymentAction of the request was Authorization or Order, this value is your AuthorizationID for use with the Authorization & Capture APIs. 
    string transactionId    = decoder["PAYMENTINFO_0_TRANSACTIONID"]; 

    // The type of transaction Possible values: l  cart l  express-checkout 
    string transactionType = decoder["PAYMENTINFO_0_TRANSACTIONTYPE"]; 

    // Indicates whether the payment is instant or delayed. Possible values: l  none l  echeck l  instant 
    string paymentType      = decoder["PAYMENTINFO_0_PAYMENTTYPE"]; 

    // Time/date stamp of payment
    string orderTime        = decoder["PAYMENTINFO_0_ORDERTIME"]; 

    // The final amount charged, including any shipping and taxes from your Merchant Profile.
    string amt              = decoder["PAYMENTINFO_0_AMT"];

    // A three-character currency code for one of the currencies listed in PayPay-Supported Transactional Currencies. Default: USD.    
    string currencyCode = decoder["PAYMENTINFO_0_CURRENCYCODE"];

    // PayPal fee amount charged for the transaction    
    string feeAmt           = decoder["PAYMENTINFO_0_FEEAMT"]; 

    // Amount deposited in your PayPal account after a currency conversion.    
    string settleAmt        = decoder["PAYMENTINFO_0_SETTLEAMT"]; 

    // Tax charged on the transaction.    
    string taxAmt           = decoder["PAYMENTINFO_0_TAXAMT"];

    //' Exchange rate if a currency conversion occurred. Relevant only if your are billing in their non-primary currency. If 
    string exchangeRate = decoder["PAYMENTINFO_0_EXCHANGERATE"];
}
else
{
    Response.Redirect("APIError.aspx?" + retMsg);
}
}
解决

我使用了从Paypal下载的代码,但我发现它不是现成的。我不得不对它进行一些修补,以使它能够编译,更不用说提出一个成功的请求了

我使用CURL(在他们的开发者文档中提到)调试实际发送给Paypal的内容。我通过断点停止了代码,并手动复制粘贴了请求字符串。成功。然后我开始翻阅PayPal代码,找到了这个代码

public string HttpCall(string NvpRequest) //CallNvpServer
{
    string url = pendpointurl;

    //To Add the credentials from the profile
    string strPost = NvpRequest +"&" + buildCredentialsNVPString();
如果您的API详细信息是在全局变量中设置的(谁说全局变量是不好的做法),它会将您的API详细信息附加到请求字符串的末尾

这就是问题所在,因为我已经在“MarkExpressCheckout”中包含了我的API详细信息

public bool MarkExpressCheckout(string amt, ...
    '''
    encoder["USER"] = APIUsername;
    encoder["PWD"] = APIPassword;
    encoder["SIGNATURE"] = APISignature;
因此,本质上,请求字符串在开始和结束时都有我的API详细信息。看起来API详细信息的存在标志着一个新的请求,该请求没有任何与之相关的购物车详细信息,因此出现了10400错误

Paypal代码URLEncode在发送之前就已经存在了,所以他们告诉我这是URLEncode问题是在转移注意力

在我的例子中,修复方法是将
HttpCall
中的这一行从

    string strPost = NvpRequest +"&" + buildCredentialsNVPString();
对此

    string strPost = NvpRequest;
嘿,普雷斯托,贝宝来了。我真的希望这个解决方案能帮助别人,因为它让我头疼。或者是那些有过这种经历的人一直在讨论他们的解决方案

现在转到下一个问题,我肯定会在这里看到另一个问题。

已解决

我使用了从Paypal下载的代码,但我发现它不是现成的。我不得不对它进行一些修补,以使它能够编译,更不用说提出一个成功的请求了

我使用CURL(在他们的开发者文档中提到)调试实际发送给Paypal的内容。我通过断点停止了代码,并手动复制粘贴了请求字符串。成功。然后我开始翻阅PayPal代码,找到了这个代码

public string HttpCall(string NvpRequest) //CallNvpServer
{
    string url = pendpointurl;

    //To Add the credentials from the profile
    string strPost = NvpRequest +"&" + buildCredentialsNVPString();
如果您的API详细信息是在全局变量中设置的(谁说全局变量是不好的做法),它会将您的API详细信息附加到请求字符串的末尾

这就是问题所在,因为我已经在“MarkExpressCheckout”中包含了我的API详细信息

public bool MarkExpressCheckout(string amt, ...
    '''
    encoder["USER"] = APIUsername;
    encoder["PWD"] = APIPassword;
    encoder["SIGNATURE"] = APISignature;
因此,本质上,请求字符串在开始和结束时都有我的API详细信息。看起来API详细信息的存在标志着一个新的请求,该请求没有任何与之相关的购物车详细信息,因此出现了10400错误

Paypal代码URLEncode在发送之前就已经存在了,所以他们告诉我这是URLEncode问题是在转移注意力

在我的例子中,修复方法是将
HttpCall
中的这一行从

    string strPost = NvpRequest +"&" + buildCredentialsNVPString();
对此

    string strPost = NvpRequest;
嘿,普雷斯托,贝宝来了。我真的希望这个解决方案能帮助别人,因为它让我头疼。或者是那些有过这种经历的人一直在讨论他们的解决方案


现在转到下一个问题,毫无疑问,我会在这里看到另一个问题。

我已经在网上看到了无数篇文章,没有一篇是我想做的。事实上,他们几乎都不做更多的付款标准,我已经得到工作,问题是我需要麻烦与快速结帐在这种情况下?在我看来,你没有遵循API的要求。这里有一个关于如何使用快速签出的部分:上面代码中的“缺失部分”似乎与您的工作流有关,而不一定与您的代码有关。在上面的链接中回顾事情的顺序,你应该已经上路了。幸运的是你没有抓住重点。我的代码无法编译,更不用说担心工作流了。我逐字逐句地读了那篇文章,但没有用。从那篇文章到“PayPal API”,我都工作得很好,只是找不到合适的代码来编译以使用Express Checkout API。我在网上看了无数篇文章,但没有一篇是我想做的。事实上,他们几乎都不做更多的付款标准,我已经得到了工作,问题是我需要麻烦与快速结帐在这种情况下?在我看来,你们并没有遵循