Интеграция PayPal в решение C # / .NET с использованием WSDL (SOAP) - PullRequest
6 голосов
/ 06 января 2012

Среда: Visual Studio 2010 Professional .NET Framework 4 C #

Добавлена ​​ссылка на службу с использованием следующего WSDL: https://www.paypalobjects.com/wsdl/PayPalSvc.wsdl

Проблема 1 : Когда скомпилировано просто так, получите кучу ошибок из файла Reference.cs.Похоже, ошибки пространства имен.В нем упоминается, что он не может найти пространство имен ссылок на службы в пространстве имен моего проекта.Поэтому я пошел в файл Reference.cs и там, где я получил эту ошибку, я удалил пространство имен проекта перед именами методов, и теперь он компилируется.

Наконец-то получаем доступ ко всем классам.Созданы и заполнены объекты DoDirectPaymentReq и CustomSecurityHeader с необходимыми свойствами.Создан экземпляр класса PayPalAPIAAInterfaceClient, который содержит метод DoDirectPayment , который принимает аргументы типа CustomSecurityHeader и DoDirectPaymentReq.Выглядит так:

using (var client = new **PayPalAPIAAInterfaceClient**())
{
   var credentials = new CustomSecurityHeaderType
   {
      Credentials = new UserIdPasswordType
      {
         Username = "xxxxxxxx@xxxxxx.com",
         Password = "xxxxxxx",
         Signature = "jksadfuhasfweakjhasf"
      }
   };

   _doDirectPaymentResponseType = client.DoDirectPayment(ref credentials, _doDirectPaymentReq);
}

Проблема 2 : После написания TestMethod для метода, который содержит приведенный выше код, я получаю сообщение об ошибке следующим образом:

System.InvalidOperationException: Could not find default endpoint element that references contract 'Paypal.PayPalAPIAAInterface' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element.

at System.ServiceModel.Description.ConfigLoader.LoadChannelBehaviors(ServiceEndpoint serviceEndpoint, String configurationName)
at System.ServiceModel.ChannelFactory.ApplyConfiguration(String configurationName, Configuration configuration)
at System.ServiceModel.ChannelFactory.ApplyConfiguration(String configurationName)
at System.ServiceModel.ChannelFactory.InitializeEndpoint(String configurationName, EndpointAddress address)
at System.ServiceModel.ChannelFactory`1..ctor(String endpointConfigurationName, EndpointAddress remoteAddress)
at System.ServiceModel.EndpointTrait`1.CreateSimplexFactory()
at System.ServiceModel.ClientBase`1.CreateChannelFactoryRef(EndpointTrait`1 endpointTrait)
at System.ServiceModel.ClientBase`1.InitializeChannelFactoryRef()
at System.ServiceModel.ClientBase`1..ctor()
at PaymentEngine.Paypal.PayPalAPIAAInterfaceClient..ctor() in Reference.cs: line 30063

Поэтому до сих пор я не смог совершить успешную транзакцию с использованием протокола PayPal SOAP с использованием WSDL в C #.

У меня сложилось впечатление, что это очень просто.Просто добавьте ссылку на службу и используйте классы с их свойствами и методами, созданными в прокси-сервере из WSDL.

Куда я иду не так?

Использую ли я неправильный WSDL?Я хотел бы сначала протестировать против Sandbox, а затем перейти к Live.

Если я прав в WSDL, похоже, что класс PayPalAPIAAInterfaceClient не знает свою конечную точку , которую я не знаюНе знаю, если я должен установить вручную или нет, так как его уже есть в определении WSDL в конце (проверить это).Я думаю, что сам класс должен знать, какую конечную точку вызывать в зависимости от того, использую ли я Signature или Certificate для заполнения CustomSecurityHeaderType.

Но как класс PayPalAPIAAInterfaceClient узнает, пытаюсь ли я позвонить в изолированную программную среду (тестирование) или это активная транзакция?

В PayPal использовались два разных WSDL для изолированной программной среды и для рабочей среды,Их можно найти здесь: -> https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_soap_PayPalSOAPAPIArchitecture

После разговора с их поддержкой меня попросили использовать следующий WSDL для Sandbox и Live: -> https://www.paypalobjects.com/wsdl/PayPalSvc.wsdl

Но как это сделать?Я сообщаю классу PayPalAPIAAInterfaceClient, когда предполагается выполнять тесты Live или Sandbox.А также, какой конечный пункт использовать в зависимости от моего метода SOAP и подписи.Конечные точки PayPal упоминаются здесь:

https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/howto_api_endpoints

HELP!

Ответы [ 2 ]

6 голосов
/ 06 января 2012

У вас есть несколько проблем здесь, но ни одна не должна быть слишком болезненной для решения.Прежде всего, когда я добавляю ссылку на службу в WSDL, на которую вы ссылаетесь в верхней части своего поста, у меня не возникает проблем с описанными вами пространствами имен.Возможно, ваши собственные пространства имен / ссылки каким-то образом конфликтуют с автоматически сгенерированными терминами, или, возможно, вы выбрали какой-то странный вариант в процессе добавления ссылки?Удаление и повторное добавление может решить проблему, или, я думаю, вы можете просто проигнорировать ее, поскольку вы уже обошли ее.(Однако это довольно хлопотно для редактирования автоматически сгенерированного кода, поэтому в конечном итоге вы должны планировать исправление.)

Чтобы разрешить InvalidOperationException, вам, вероятно, просто нужно указать одну из конечных точек, которыеVisual Studio автоматически добавляется в ваш файл app.config.В вашем конфигурационном файле должно быть что-то вроде этого:

<system.serviceModel>
  <client>
    <endpoint name="PayPalAPI" ... />
    <endpoint name="PayPalAPIAA" ... />
  </client>
</system.serviceModel>

Вы можете передать имя конечной точки, которую вы хотите, в конструктор прокси-класса.Есть другие варианты для решения этой проблемы, но просто указать конечную точку легко и просто.(Примечание: если у вас нет этого раздела в вашем конфигурационном файле, что-то пошло не так во время фазы Добавить ссылку на службу . Опять же, я бы просто предложил сбросить ваш проект и повторно добавить ссылку.)

Наконец, вы не хотите использовать блок using, когда используете прокси-класс, несмотря на то, что он IDisposable.По сути, в WCF есть ошибка проектирования .

1 голос
/ 11 сентября 2012

У меня была такая же проблема, потому что я занимался модульным тестированием.

Вам нужно скопировать файл application.config в тестовый проект, иначе он не найдет конфигурацию WCF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...