[英]PayPal C# SDK Endpoint
我正在尋找一種在代碼中設置PayPal SOAP API端點的方法,而不是在web.config或app.config中指定它。 我需要從特定於環境的配置中讀取和使用端點,該配置不是web.config / app.config。
這可能嗎? 我已經在他們的github repo上閱讀了SDK的一些代碼,但這似乎不可能,但我希望我錯過了一些東西。
我正在使用PayPal Merchant SDK for .Net,ver 2.1.96.0。
我需要能夠指定.config文件之外的所有重要設置。 我很懶,所以我就是這樣做的:
paypalConfig = new Dictionary<string, string>();
paypalConfig.Add("apiUsername", "xxxxx");
paypalConfig.Add("apiPassword", "xxxxx");
paypalConfig.Add("apiSignature", "xxxxx");
==>paypalConfig.Add("mode","live|sandbox");
然后你需要通過再次指定憑證來調用你的方法(沒有調查為什么這是必要的):
var service = new PayPalAPIInterfaceServiceService(paypalConfig);
var doCaptureResponse = service.DoCapture(amount, new SignatureCredential(paypalConfig["apiUsername"], paypalConfig["apiPassword"], paypalConfig["apiSignature"]));
答案2:但如果您對編輯PayPal代碼沒問題,這將很好...
(PayPal:如果您正在閱讀此請請實現此功能!!)
編輯:這不是必要的 - 請看Simon Simon先生的回答
因此,在花了HOURS並編寫我的應用程序后,我可以在live和sandbox之間切換端點(就像我以前直接調用SOAP服務時那樣),我決定再去深入挖掘源代碼並進行計算出。
這是我為使其發揮作用而做出的改變。
假設:
腳步:
<paypal>
下的web.config中刪除endpoint
。 建議安全預防措施! PayPalAPIInterfaceServiceService.cs
源代碼 DefaultSOAPAPICallHandler.cs
源代碼 您可能需要花一點時間來確保版本與nuGet包相同。
在項目中將這兩個文件復制到PayPalMerchantSDK
等文件夾中
SimonsPayPalAPIInterfaceServiceService
和SimonsSOAPAPICallHandler
- 但無論你想要什么,都可以調用它們。 更改構造函數以添加布爾值useSandbox
:
注意:它必須是第一個參數,因為我們將盡快進行搜索並替換魔法。
public SimonsSOAPAPICallHandler(bool useSandbox, string rawPayLoad, string attributesNamespace,
string headerString)
: base()
{
this.rawPayLoad = rawPayLoad;
this.nmespceAttributes = attributesNamespace;
this.headElement = headerString;
// you can get these from config if you wish but I doubt they'll ever change
this.endpoint = useSandbox ? "https://api-3t.sandbox.paypal.com/2.0" : "https://api-3t.paypal.com/2.0";
}
更改GetEndPoint()
:
/// <summary>
/// Returns the endpoint for the API call
/// </summary>
/// <returns></returns>
public string GetEndPoint()
{
return this.endpoint;
}
添加相應的成員:
/// <summary>
/// Endpoint
/// </summary>
private string endpoint;
修改構造函數以添加useSandbox
參數
public SimonsPayPalAPIInterfaceServiceService(bool useSandbox)
{
this.useSandbox = useSandbox;
}
添加相應的成員
private bool useSandbox;
對此文件執行兩次搜索和替換。 每個你將有大約100個替換
new DefaultSOAPAPICallHandler(
使用new SimonsSOAPAPICallHandler(useSandbox,
DefaultSOAPAPICallHandler defaultHandler
替換為var defaultHandler
你剛才所做加入useSandbox
作為參數的構造函數SimonsSOAPAPICallHandler
(其中謝天謝地實現IAPICallPreHandler
),你會這樣結束了對每種方法:
public DoExpressCheckoutPaymentResponseType DoExpressCheckoutPayment(DoExpressCheckoutPaymentReq doExpressCheckoutPaymentReq, string apiUserName)
{
IAPICallPreHandler apiCallPreHandler = null;
string portName = "PayPalAPIAA";
setStandardParams(doExpressCheckoutPaymentReq.DoExpressCheckoutPaymentRequest);
var defaultHandler = new SimonsSOAPAPICallHandler(useSandbox, doExpressCheckoutPaymentReq.ToXMLString(null, "DoExpressCheckoutPaymentReq"), null, null);
apiCallPreHandler = new MerchantAPICallPreHandler(defaultHandler, apiUserName, getAccessToken(), getAccessTokenSecret());
((MerchantAPICallPreHandler) apiCallPreHandler).SDKName = SDKName;
((MerchantAPICallPreHandler) apiCallPreHandler).SDKVersion = SDKVersion;
((MerchantAPICallPreHandler) apiCallPreHandler).PortName = portName;
string response = Call(apiCallPreHandler);
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(response);
XmlNode xmlNode = xmlDocument.SelectSingleNode("*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='DoExpressCheckoutPaymentResponse']");
return new DoExpressCheckoutPaymentResponseType(xmlNode);
}
而已!
現在,當你打電話給方法時,你可以說......
bool useSandbox = true; // or false
var service = new SimonsPayPalAPIInterfaceServiceService(useSandbox);
然后正常調用該方法
caller.DoExpressCheckoutPayment(pp_request, config.AccountName);
注意:它仍會在配置中查找帳戶名稱以查找相應的密鑰。 顯然要小心更新到以后版本的Merchant SDK,您必須重新執行此操作 。
我希望有人覺得這很有用:-)
它完全可行,但您必須通過將綁定創建為對象來對值進行硬編碼。 這就是我為自己的項目所做的事情:
protected static PayPalAPIInterface GetService()
{
return new PayPalAPIInterfaceClient(new BasicHttpBinding()
{
SendTimeout = new TimeSpan(0, 5, 0),
MaxReceivedMessageSize = 200000,
Security = new BasicHttpSecurity()
{
Mode = BasicHttpSecurityMode.Transport,
Transport = new HttpTransportSecurity()
{
ClientCredentialType = HttpClientCredentialType.None,
ProxyCredentialType = HttpProxyCredentialType.None,
},
Message = new BasicHttpMessageSecurity()
{
ClientCredentialType = BasicHttpMessageCredentialType.Certificate,
}
}
},
new EndpointAddress(@"https://api-3t.paypal.com/2.0/")
).ChannelFactory.CreateChannel();
}
您可以設置更多參數 - 理論上, .config
文件中的所有內容都可以在此處重現。 這對我有用,所以我沒有再深思。
值得注意的是,這使您可以將PayPal調用放入庫中, 而不必將綁定復制到包含該庫的項目的配置文件中,這就是我首先開發它的原因。
編輯:這是PayPalAPIInterfaceClient
的基本定義 - 不保證它實際上足以使用。
public partial class PayPalAPIInterfaceClient : System.ServiceModel.ClientBase<PayPalAPIInterfaceServiceService>
{
public PayPalAPIInterfaceClient(System.ServiceModel.Channels.Binding binding,
System.ServiceModel.EndpointAddress remoteAddress)
: base(binding, remoteAddress) { }
}
您還可以修改早期代碼,使其返回類型為PayPalAPIInterfaceServiceService
。
答案1:我同意 - 不可能開箱即用。
如果沒有自己編譯代碼並且進行相當多的改變,這似乎是不可能的。 這是來自GitHub的PayPalAPIInterfaceServiceService
的當前代碼,它實際上是生成的 - 可能使用的是T4模板。 這是一個龐大的2489行文件,每個API方法都有這樣的代碼。
這里的關鍵是IAPICallPreHandler
。 您將看到它設置為null,然后初始化為MerchantAPICallPreHandler
的實例。 沒有辦法傳遞它。
public SetExpressCheckoutResponseType SetExpressCheckout(SetExpressCheckoutReq setExpressCheckoutReq, ICredential credential)
{
IAPICallPreHandler apiCallPreHandler = null;
string portName = "PayPalAPIAA";
setStandardParams(setExpressCheckoutReq.SetExpressCheckoutRequest);
DefaultSOAPAPICallHandler defaultHandler = new DefaultSOAPAPICallHandler(setExpressCheckoutReq.ToXMLString(null, "SetExpressCheckoutReq"), null, null);
apiCallPreHandler = new MerchantAPICallPreHandler(defaultHandler, credential);
((MerchantAPICallPreHandler) apiCallPreHandler).SDKName = SDKName;
((MerchantAPICallPreHandler) apiCallPreHandler).SDKVersion = SDKVersion;
((MerchantAPICallPreHandler) apiCallPreHandler).PortName = portName;
string response = Call(apiCallPreHandler);
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(response);
XmlNode xmlNode = xmlDocument.SelectSingleNode("*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='SetExpressCheckoutResponse']");
return new SetExpressCheckoutResponseType(xmlNode);
}
現在讓我們來看看界面:
public interface IAPICallPreHandler
{
ICredential GetCredential();
string GetEndPoint();
Dictionary<string, string> GetHeaderMap();
string GetPayLoad();
}
衛生署! GetEndPoint()
看起來不像我們想要覆蓋的那樣。
更深入地研究代碼-實例GetEndPoint()
被稱為最終這是一個在DefaultSOAPAPICallHandler
-正如你可以看到,可直接到達ConfigManager
。
public string GetEndPoint()
{
return ConfigManager.Instance.GetProperty(BaseConstants.END_POINT);
}
ConfigManager
直接進入web.config
或app.config
config = (SDKConfigHandler)ConfigurationManager.GetSection("paypal");
遺憾的是,沒有任何鈎子或任何其他東西來改變終點。
我已經考慮過在本地編譯它並修復它,但我寧願失去在代碼中更改端點的能力,也就是失去了一鍵更新整個包的能力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.