有没有人使用过Sage Pay和asp.net网页

时间:2016-08-22 16:20:51

标签: asp.net razor sagepay

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

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

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

1 个答案:

答案 0 :(得分: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>

为了使这更容易管理,我在checkout文件夹中有这个web.config文件,因此很容易保持更新。

我还创建了以下类来加密和解密数据: - 您可以随意调用它,但需要将其保存在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"]);
        } 

然后你就可以从calss中调用所需的信息

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中看到所有字段。