Cybersource をクレジット カード処理会社として使用するアプリケーションを継承しました。現在、CyberSource API を使用しており、ホストされている注文ページ、特にサイレント オーダー ポスト メソッドを使用するように変換しようとしています。それを実行するための CyberSource の例は次のとおりです。
<form action="https://orderpagetest.ic3.com/hop/ProcessOrder.do" method="POST">
<% insertSignature3("10", "USD", "sale"); %>
<h2>Payment Information</h2>
Card Type: <select name="card_cardType"><br>
<option value="">
<option value="001">Visa
<option value="002">MasterCard
<option value="003">American Express
</select><br>
Card Number: <input type="text" name="card_accountNumber"><br>
Expiration Month: <input type="text" name="card_expirationMonth"> (mm)<br>
Expiration Year: <input type="text" name="card_expirationYear"> (yyyy)<br><br>
<h2>Ready to Check Out!</h2>
<input type="submit" name="submit" value="Buy Now">
</form>
insertSignature メソッドのコードは次のとおりです。
public void insertSignature3( String amount, String currency, String orderPage_transactionType )
{
try
{
TimeSpan timeSpanTime = DateTime.UtcNow - new DateTime( 1970, 1, 1 );
String[] arrayTime = timeSpanTime.TotalMilliseconds.ToString().Split( '.' );
String time = arrayTime[0];
String merchantID = GetMerchantID();
if ( merchantID.Equals( "" ) )
Response.Write( "<b>Error:</b> <br>The current security script (HOP.cs) doesn't contain your merchant information. Please login to the <a href='https://ebc.cybersource.com/ebc/hop/HOPSecurityLoad.do'>CyberSource Business Center</a> and generate one before proceeding further. Be sure to replace the existing HOP.cs with the newly generated HOP.cs.<br><br>" );
String data = merchantID + amount + currency + time + orderPage_transactionType;
String pub = GetSharedSecret();
String serialNumber = GetSerialNumber();
byte[] byteData = System.Text.Encoding.UTF8.GetBytes( data );
byte[] byteKey = System.Text.Encoding.UTF8.GetBytes( pub );
HMACSHA1 hmac = new HMACSHA1( byteKey );
String publicDigest = Convert.ToBase64String( hmac.ComputeHash( byteData ) );
publicDigest = publicDigest.Replace( "\n", "" );
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append( "<input type=\"hidden\" name=\"amount\" value=\"" );
sb.Append( amount );
sb.Append( "\">\n<input type=\"hidden\" name=\"currency\" value=\"" );
sb.Append( currency );
sb.Append( "\">\n<input type=\"hidden\" name=\"orderPage_timestamp\" value=\"" );
sb.Append( time );
sb.Append( "\">\n<input type=\"hidden\" name=\"merchantID\" value=\"" );
sb.Append( merchantID );
sb.Append( "\">\n<input type=\"hidden\" name=\"orderPage_transactionType\" value=\"" );
sb.Append( orderPage_transactionType );
sb.Append( "\">\n<input type=\"hidden\" name=\"orderPage_signaturePublic\" value=\"" );
sb.Append( publicDigest );
sb.Append( "\">\n<input type=\"hidden\" name=\"orderPage_version\" value=\"4\">\n" );
sb.Append( "<input type=\"hidden\" name=\"orderPage_serialNumber\" value=\"" );
sb.Append( serialNumber );
sb.Append( "\">\n" );
Response.Write( sb.ToString() );
}
catch ( Exception e )
{
Response.Write( e.StackTrace.ToString() );
}
}
テストアプリケーションで実行すると、すべてが機能します。ただし、マスター ページにはすべてがフォーム タグで囲まれているため、メイン アプリケーションでフォーム タグを使用できません。フォーム タグがネストされてしまいます。フォーム ブロックを iframe に配置しようとしましたが、insertSignature(...) メソッドからの Response.Write 呼び出しを介して追加情報を渡す方法がわかりません。
任意の提案をいただければ幸いです。