2016-08-22 78 views
-1

有没有人使用Sage Pay with asp.net网页?有没有人使用Sage Pay with asp.net网页

我已经从Sage Pay下载了集成套件,但这是在webforms中完成的,我无法将其转换为WebPages格式。

Sage Pay没有帮助,所以我希望有人在那里做了这个。或者可以指出我正确的方向。

+0

问题要求我们推荐或找到一本书,工具,软件库,教程或其他非本地资源,因为它们倾向于吸引舆论的答案和垃圾邮件,所以不适合堆栈溢出。相反,请描述问题以及到目前为止解决问题所做的工作。 – DavidG

+0

嗨@DavidG我知道这是脱离主题,但我完全坚持这一点。来自圣人的帮助套件使用不同的语言,我认为向社区伸出援手,我可能会摔倒一个做过这件事的人。 –

+0

就这种集成而言,MVC和WebForms之间几乎没有区别。 – DavidG

回答

0

我已经设法使用您可以下载的SagePay模板中的类来完成此操作。

将这些文件放入您的bin文件夹: -

SagePay.IntegrationKit.DotNet.dll 
SagePay.IntegrationKit.DotNet.pdb 

把这些文件放在App_Code文件夹: -

SagePayConfiguration.cs 
SagePayAPIIntegration.cs 
SagePayFormIntegration.cs 

你还需要一些东西添加到您的web.config文件

<SagePayConfiguration> 
    <!--Mandatory  
    Set to TEST for the Test Server and LIVE for the live environment--> 
    <add key="sagepay.api.env" value="TEST" /> 

    <!--Transaction Settings --> 
    <add key="sagepay.api.protocolVersion" value="3.00" /> 
    <add key="sagepay.kit.vendorName" value="your Name" /> 
    <add key="sagepay.kit.fullUrl" value="your url" /> 
    <add key="sagepay.kit.currency" value="GBP" /> 

    <!--Optional setting. It's recommended to set the siteFqdn value to the Fully 
    Qualified Domain Name of your server. 
    This should start http:// or https:// and should be the name by which our servers can call back to yours 
    i.e. it MUST be resolvable externally, and have access granted to the Sage Pay servers 
    examples would be https://yoursite or http://212.111.32.22/ 
    NOTE: Do not include any URI path. 
    If you leave this value blank the kit will use the current host name--> 
    <add key="sagepay.kit.siteFqdn.LIVE" value="http://your web address" /> 
    <add key="sagepay.kit.siteFqdn.TEST" value="http://your web address" /> 

    <!--Mandatory. Usually PAYMENT. This can be DEFERRED or AUTHENTICATE if your Sage Pay 
    account supports those payment types 
    NB Ideally all DEFERRED transaction should be released within 6 days (according to card scheme rules). 
    DEFERRED transactions can be ABORTed before a RELEASE if necessary--> 
    <add key="sagepay.kit.defaultTransactionType" value="PAYMENT" /> 

    <!--0 = If AVS/CV2 enabled then check them. If rules apply, use rules (default). 
    1 = Force AVS/CV2 checks even if not enabled for the account. If rules apply, use rules. 
    2 = Force NO AVS/CV2 checks even if enabled on account. 
    3 = Force AVS/CV2 checks even if not enabled for the account but DON'T apply any rules.--> 
    <add key="sagepay.kit.applyAvsCv2" value="0" /> 

    <!--0 = If 3D-Secure checks are possible and rules allow, perform the checks and apply the authorisation rules. (default) 
    1 = Force 3D-Secure checks for this transaction if possible and apply rules for authorisation. 
    2 = Do not perform 3D-Secure checks for this transaction and always authorise. 
    3 = Force 3D-Secure checks for this transaction if possible but ALWAYS obtain an auth code, irrespective of rule base.--> 
    <add key="sagepay.kit.apply3dSecure" value="0" /> 


    <!--FORM Protocol Only Settings 

    Set this value to the Encryption password assigned to you by Sage Pay --> 
    <add key="sagepay.kit.form.encryptionPassword.TEST" value="Your password" /> 
    <add key="sagepay.kit.form.encryptionPassword.LIVE" value="Your password" /> 


    <!--The Sage Pay server URLs to which customers will be sent for payment for each environment--> 
    <add key="sagepay.api.formPaymentUrl.LIVE" value="https://live.sagepay.com/gateway/service/vspform-register.vsp" /> 


    <add key="sagepay.api.formPaymentUrl.TEST" value="https://test.sagepay.com/gateway/service/vspform-register.vsp" /> 

    </SagePayConfiguration> 

为了使这更容易管理我只有这个web.config文件在结帐文件夹,所以它是电子商务asy保持更新。

我还创建了以下类来加密和解密数据: - 你可以称它为你想要的,但它需要保存在App_Code文件夹中。

using System; 
using System.Linq; 
using System.Security.Cryptography; 
using System.Text; 
using System.IO; 

public static class EncryptionHelper 
{ 
    private static byte[] keyAndIvBytes; 

    static EncryptionHelper() 
    { 
     // You'll need a more secure way of storing this, I this isn't 
     // a real key 
     keyAndIvBytes = UTF8Encoding.UTF8.GetBytes("123123123123123b"); 
    } 

    public static string ByteArrayToHexString(byte[] ba) 
    { 
     return BitConverter.ToString(ba).Replace("-", ""); 
    } 

    public static byte[] StringToByteArray(string hex) 
    { 
     return Enumerable.Range(0, hex.Length) 
         .Where(x => x % 2 == 0) 
         .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) 
         .ToArray(); 
    } 

    public static string DecodeAndDecrypt(string cipherText) 
    { 
     string DecodeAndDecrypt = AesDecrypt(StringToByteArray(cipherText)); 
     return (DecodeAndDecrypt); 
    } 

    public static string EncryptAndEncode(string plaintext) 
    { 
     return ByteArrayToHexString(AesEncrypt(plaintext)); 
    } 

    public static string AesDecrypt(Byte[] inputBytes) 
    { 
     Byte[] outputBytes = inputBytes; 

     string plaintext = string.Empty; 

     using (MemoryStream memoryStream = new MemoryStream(outputBytes)) 
     { 
      using (CryptoStream cryptoStream = new CryptoStream(memoryStream, GetCryptoAlgorithm().CreateDecryptor(keyAndIvBytes, keyAndIvBytes), CryptoStreamMode.Read)) 
      { 
       using (StreamReader srDecrypt = new StreamReader(cryptoStream)) 
       { 
        plaintext = srDecrypt.ReadToEnd(); 
       } 
      } 
     } 

     return plaintext; 
    } 

    public static byte[] AesEncrypt(string inputText) 
    { 
     byte[] inputBytes = UTF8Encoding.UTF8.GetBytes(inputText);//AbHLlc5uLone0D1q 

     byte[] result = null; 
     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      using (CryptoStream cryptoStream = new CryptoStream(memoryStream, GetCryptoAlgorithm().CreateEncryptor(keyAndIvBytes, keyAndIvBytes), CryptoStreamMode.Write)) 
      { 
       cryptoStream.Write(inputBytes, 0, inputBytes.Length); 
       cryptoStream.FlushFinalBlock(); 

       result = memoryStream.ToArray(); 
      } 
     } 

     return result; 
    } 


    private static RijndaelManaged GetCryptoAlgorithm() 
    { 
     RijndaelManaged algorithm = new RijndaelManaged(); 
     //set the mode, padding and block size 
     algorithm.Padding = PaddingMode.PKCS7; 
     algorithm.Mode = CipherMode.CBC; 
     algorithm.KeySize = 128; 
     algorithm.BlockSize = 128; 
     return algorithm; 
    } 
} 

我调用这个类,如下所示: -

string crypt = "blahblahblah"; 
string EncryptAndEncode = EncryptionHelper.EncryptAndEncode(crypt); 
string DecodeAndDecrypt = EncryptionHelper.DecodeAndDecrypt(EncryptAndEncode); 

当交易完成后,我得到这个代码地穴: -

IFormPaymentResult PaymentStatusResult = new DataObject(); 

     if (Request.QueryString["crypt"] != null && !string.IsNullOrEmpty(Request.QueryString["crypt"])) 
     { 
      SagePayFormIntegration sagePayFormIntegration = new SagePayFormIntegration(); 
      PaymentStatusResult = sagePayFormIntegration.ProcessResult(Request.QueryString["crypt"]); 
     } 

,你可以调用所需从这样的信息像

if (PaymentStatusResult.Status == ResponseStatus.NOTAUTHED) 
    {reason = "You payment was declined by the bank. This could be due to insufficient funds, or incorrect card details.";} 

您可以看到SagePay模板的Result.aspx中的所有字段。