回答 2: ただし、PayPal のコードを編集することに問題がなければ、問題なく動作します...
(PayPal: これを読んでいる場合は、この機能を実装してください!!)
編集:これはもはや必要ありません-Simon Labrecqueによる回答を参照してください
したがって、これに何時間も費やし、ライブとサンドボックスの間でエンドポイントを切り替えることができるという期待に基づいてアプリケーションを作成した後 (SOAP サービスを直接呼び出すときと同じように)、ソースをさらに掘り下げて理解することにしました。アウト。
これを機能させるために行った変更を次に示します。
仮定:
手順:
SimonsSOAPAPICallHandler.cs への変更
コンストラクターを変更して boolean を追加し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;
このファイルに対して 2 つの検索と置換を行います。それぞれ約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 の新しいバージョンに更新する場合は、これを最初からやり直す必要があるため、明らかに注意してください。
誰かがこれが役立つことを願っています:-)