Я разработал плагин Payment Gateway для SagePay South Africa, который будет использоваться с платформой электронной коммерции nopCommerce (v3.90).Сам плагин работает отлично, однако SagePay требует, чтобы плагин проверял идентификатор продавца и сервисный ключ во время установки и настройки плагина.Это делается с помощью веб-службы, предоставляемой SagePay, Южная Африка.
Я использую Visual Studio 2017. Плагин представляет собой веб-приложение, расширяющее функциональные возможности nopCommerce и основанное на ASP.NET MVC 5, wriiten.в C #.
Добавление веб-службы SagePay в качестве «Подключенной службы» на моем ПК для разработки не представляет проблемы.Когда я тестирую плагин, процесс проверки работает отлично.Однако при развертывании плагина на тестовом сервере я могу заставить плагин работать только в том случае, если я скопирую настройки конфигурации конечной точки (Web.Config) из папки плагина в корневой файл Web.Config установки nopCommerce.
Это проблема, поскольку мы не хотим, чтобы клиенты, загружающие плагин, должны были вручную редактировать / изменять корневой файл Web.Config.
Так что мой вопрос: как подключиться?в веб-службу, указав параметры конечной точки в коде контроллера и при этом обходя необходимость для подключаемого модуля получать параметры конфигурации конечной точки из корневого файла Web.Config?
Когда плагин установлен наНа тестовом сервере в папке плагина существует файл web.config, в котором содержатся параметры конфигурации конечной точки для веб-службы.Как я обнаружил, это не работает, так как плагин ищет корневой файл Web.Config для этих настроек.
Если я вручную добавлю эти настройки в корневой Web.Config, плагин работает отлично, но какЯ заявил, что мы не хотим, чтобы пользователи вручную редактировали основной файл Web.Config, по понятным причинам.
Это файл Web.Config в подпапке плагина - мне нужно добавить его прямо вКонтроллер:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_INIWS_Partner">
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint
address="https://ws.sagepay.co.za/NIWS/NIWS_Partner.svc"
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_INIWS_Partner"
contract="NIWS.INIWS_Partner"
name="WSHttpBinding_INIWS_Partner" />
</client>
</system.serviceModel>
=================================================
Ниже приведены два метода, для которых требуется вышеуказанный веб-сервис:
using Nop.Plugin.Payments.SagePay.NIWS;
protected ServiceInfoList GetServiceInfo(string pServiceID, string pServiceKey)
{
ServiceInfo serviceInfo = new ServiceInfo
{
ServiceId = pServiceID,
ServiceKey = pServiceKey
};
ServiceInfoList serviceInfoList = new ServiceInfoList
{
serviceInfo
};
return serviceInfoList;
}
protected void ValidateServiceKey(string AccountNumber, string PayNowKey)
{
//initialise all operations needed
//---------------------------------------
ServiceInfoList serviceInfoList = new ServiceInfoList();
NIWS_PartnerClient client = new NIWS_PartnerClient();
ValidateServiceKeyRequest validateServiceKeyRequest = new ValidateServiceKeyRequest();
//---------------------------------------
string SoftwareVendorKey = "******-****-****-****-************";
//Populating request to validate
//---------------------------------------
//Add account number to MerchantAccount
validateServiceKeyRequest.MerchantAccount = AccountNumber;
//Add Vendor key issued by Sage Pay
validateServiceKeyRequest.SoftwareVendorKey = SoftwareVendorKey;
//checks if field was populated
if (PayNowKey != null)
{
serviceInfoList = GetServiceInfo("14", PayNowKey);
}
//Add service info list to request
validateServiceKeyRequest.ServiceInfoList = serviceInfoList;
//---------------------------------------
//Calling the ValidateServiceKey method validating account number with the service keys added
var Request = client.ValidateServiceKey(validateServiceKeyRequest);
//Do a check on the response for Account Status
//001 = valid
if (Request.AccountStatus == "001")
{
//do something, eg. output if account active
//then add service info to list to check on each service status
sageAccountStatus = Request.AccountStatus;
ServiceInfoResponseList serviceInfoResponseList = new ServiceInfoResponseList();
serviceInfoResponseList = Request.ServiceInfo;
foreach (var s in serviceInfoResponseList)
{
string service = s.ServiceId;
switch (service)
{
case "14": // Pay Now Service Status
sagePayNowStatus = s.ServiceStatus;
break;
default:
break;
}
}
}
else
{
sageAccountStatus = Request.AccountStatus;
}
client.Close();
}
Я бы хотел, чтобы плагин определял настройки вТаким образом, файл Web.Config напрямую не связан с контроллером, что устраняет необходимость в файле Web.Config.