【问题标题】:PayPal Express Checkout Asp.Net贝宝快速结帐 Asp.Net
【发布时间】:2015-11-18 04:37:28
【问题描述】:

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

我已成功连接到 Paypal 网络服务并使用沙盒,但我什至无法开始。

在您必须遵循的步骤中,文档很容易理解,但我就是无法编译任何代码,更不用说运行了。这是我所得到的。见下文,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";

【问题讨论】:

  • 我查看了网络上的大量文章,但没有一篇能做我想做的事。事实上,他们几乎都没有我已经开始工作的支付标准,问题是在这种情况下我是否需要打扰快速结帐?
  • 在我看来您没有遵循 API 要求。这里有一个关于如何使用 Express Checkout 的部分:codeproject.com/Articles/42894/… 上面代码中的“缺失部分”似乎与您的工作流程有关,而不一定与您的代码有关。在上面的链接中查看事物的顺序,您应该正在路上。祝你好运
  • 你没有抓住重点。我的代码无法编译,更不用说担心工作流程了。我已经逐字阅读了那篇文章,但没有帮助。从那篇文章到“PayPal API”,我工作正常,只是找不到正确的代码来编译以使用 Express Checkout Api

标签: c# asp.net web-services paypal


【解决方案1】:

来自 PayPal 开发者网站的 PayPal Code Wizard 包含用于 Express Checkout 的示例 ASP.Net。只需从下拉列表中选择 ASP.net。

这里只是一些示例。您可以从 PayPal 代码向导获得所有 ASP.Net 以及功能。您需要从 PayPal 代码向导下载五个文件。我确实包含了来自 PayPal 向导站点的代码 sn-ps。

这是处理计费的代码部分:

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 payerId = "";

token = Session["token"].ToString();

bool ret = test.GetShippingDetails( token, ref payerId, ref shippingAddress, ref retMsg );
if (ret)
{
    Session["payerId"] = payerId;
    Response.Write ( shippingAddress );    
}
else
{
    Response.Redirect("APIError.aspx?" + retMsg);
}
}

这是处理付款确认的部分:

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 和开发人员帐户上的所有内容`10002 身份验证/授权失败您无权进行此 API 调用`
  • 该特定错误消息意味着您的 API 签名凭据无效。凭据中有空格或不正确。另一种可能性是确保如果您使用的是 Sandbox 凭据,它们是针对 Business Sandbox 帐户的,并且您被指向 Sandbox 而不是实时的。
  • 嗯。我已经完成了所有设置。我有一个沙盒帐户,并且正在使用这些 API 凭据。我已确保已在我的帐户上启用 ExpressCheckout。据我所知,沙盒没有该设置。任何其他想法:)
  • 确保您使用的是沙盒 API 端点。 API Endpoints
  • 是的,我正在使用沙盒端点。我已经使用断点彻底检查了我的代码以检查正在使用的值,但我仍然遇到同样的错误。 10002 Authentication/Authorization Failed You do not have permissions to make this API call
【解决方案2】:

已解决

我使用了从 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 在发送之前的所有内容,所以他们告诉我这是一个 URLEncoding 问题,这是一个红鲱鱼。

在我的情况下,解决方法是从这里更改 HttpCall 中的这一行

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

到这里

    string strPost = NvpRequest;

嘿,很快,Paypal 出现了。我真的希望这个解决方案能帮助别人,因为它让我很头疼。或者是那些拥有它的人一直在谈论他们的解决方案。

现在转到下一个问题,我相信这里会发布另一个问题。

【讨论】:

    猜你喜欢
    • 2014-09-06
    • 2012-08-06
    • 2017-11-11
    • 2019-03-16
    • 2013-07-20
    • 2013-11-01
    • 1970-01-01
    • 2018-07-27
    • 2015-12-28
    相关资源
    最近更新 更多