2016-08-22 79 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中的所有字段。