0

Sage Pay のフォーム統合を自分の Web サイトで使用しようとしています。かなり簡単だと思っていましたが、それほど遠くないことが証明されていません。私は .NET で作業しているので、サポート ページから .NET Integration Kit をダウンロードしました。

残念ながら、サンプル キットはその内容に対して複雑すぎます。それらは、完全ではなく、うまくカプセル化されたソリューションではなく、仕組みを明確に理解できる非常に単純なプロジェクトでなければなりません。Web.Config ファイルに格納されている値を使用する他のいくつかのメソッドを呼び出すメソッドが 1 つのコード ファイルにある場合、非常に複雑です。 -設定値が明示的に宣言された 1 つのファイルで渡します。もちろん、それはきれいではありませんし、まともな開発者がそのような不器用なアプローチを複製しないことを願っていますが、何が起こっているのかを簡単に確認できるようになります!

とにかく暴言を吐く。私の問題は、データを Sage Pay に送信するとエラーが発生することです

"5068: The encryption method is not supported by this protocol version"

暗号化を行うために、SagePay.IntegrationKit.DotNet.DLL ファイルをプロジェクトに追加し、SagePay.IntegrationKit.Cryptography.EncryptAndEncodeメソッドを呼び出しました。これにより、Web サイトの実際の例で生成されたものと同じように見える暗号化された文字列が生成されます。残念ながら、文字列を Sage Pay のサーバーに送信すると、前述のエラーが表示されます。

4

2 に答える 2

4

私は反対票を投じませんでしたが、それを説明する可能性のある質問(ソースなど)で続けることはあまりありません。ただし、暗号化を行うために、このコードを使用してこれを機能させました。

public string SagePayEncryptAndEncode(string inputText, string key)
{
    using (var AES = new RijndaelManaged())
    {

        // Set the mode, padding and block size for the key
        AES.Padding = PaddingMode.PKCS7;
        AES.Mode = CipherMode.CBC;
        AES.KeySize = 128;
        AES.BlockSize = 128;

        // Convert key and input text into byte arrays
        Byte[] keyAndIvBytes = UTF8Encoding.UTF8.GetBytes(key);
        Byte[] inputBytes = UTF8Encoding.UTF8.GetBytes(inputText);

        // Create streams and encryptor object
        using (var memoryStream = new MemoryStream())
        using (var cryptoStream = new CryptoStream(memoryStream, AES.CreateEncryptor(keyAndIvBytes, keyAndIvBytes), CryptoStreamMode.Write))
        {

            // Perform encryption
            cryptoStream.Write(inputBytes, 0, inputBytes.Length);
            cryptoStream.FlushFinalBlock();

            // Get encrypted stream into byte array
            var outBytes = memoryStream.ToArray();

            // Manually close streams
            memoryStream.Close();
            cryptoStream.Close();
            AES.Clear();

            //return Convert.ToBase64String(outBytes);

            return BitConverter.ToString(outBytes).Replace("-", String.Empty);
        }
    }
}

次に、結果の値を非表示の「Crypt」フィールドに保存し、「@」を先頭に追加する必要があります。

<input name='Crypt' type='hidden' value='@<InsertResultHere>' />

ドキュメントが示唆するように、Base64エンコーディングではなく、Hexエンコーディングを使用してのみ機能するようです。

お役に立てれば!

于 2013-11-13T10:00:47.810 に答える
2

フォーム v3.00 暗号文字列は、AES/CBC/PCKS#5 アルゴリズムと事前登録された暗号化パスワード (テスト アカウントとライブ アカウントの両方で異なります) を使用して暗号化され、次に Base64 エンコードされて、HTML フォームで安全に転送できるようにする必要があります。エラー 5068 を防ぐために、上記のように AES を使用してください。

V2.23 は XOR もサポートしました。

セージペイサポート

于 2013-11-26T13:59:34.083 に答える