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