簡體   English   中英

PayPal C#SDK端點

[英]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的源代碼並在本地編譯 - 但只有2個文件:
  • <paypal>下的web.config中刪除endpoint 建議安全預防措施!
  • 從GitHub (Merchant SDK)下載PayPalAPIInterfaceServiceService.cs源代碼
  • 從GitHub (Core SDK)下載DefaultSOAPAPICallHandler.cs源代碼
  • 您可能需要花一點時間來確保版本與nuGet包相同。

  • 在項目中將這兩個文件復制到PayPalMerchantSDK等文件夾中

  • 我建議重命名這兩個文件,以避免混淆和與NuGet版本沖突。 我很沮喪,只是稱他們為SimonsPayPalAPIInterfaceServiceServiceSimonsSOAPAPICallHandler - 但無論你想要什么,都可以調用它們。

對SimonsSOAPAPICallHandler.cs的更改

更改構造函數以添加布爾值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;

對SimonsPayPalAPIInterfaceServiceService.cs的更改

修改構造函數以添加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:我同意 - 不可能開箱即用。

如果沒有自己編譯代碼並且進行相當多的改變,這似乎是不可能的。 這是來自GitHubPayPalAPIInterfaceServiceService的當前代碼,它實際上是生成的 - 可能使用的是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.configapp.config

  config = (SDKConfigHandler)ConfigurationManager.GetSection("paypal");

遺憾的是,沒有任何鈎子或任何其他東西來改變終點。

我已經考慮過在本地編譯它並修復它,但我寧願失去在代碼中更改端點的能力,也就是失去了一鍵更新整個包的能力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM