我正在开发一个非盈利捐赠平台,我第一次使用MVC。我大部分时间都掌握了它,但现在我遇到了一个我不知道如何解决的问题。我正在使用AthorizeNet.Helpers类,当我从expamples添加代码时,它大部分都有效,除了它采用表单并将其放在标签上,但它将表单字段放在正确的位置。我正在试图弄清楚如何在正确的位置渲染标记。
@using AuthorizeNet.Helpers;
@using (Html.BeginSIMForm("http://127.0.0.1:4768", 1.99M, "xxx_key", "yyy_key", true))
{
@Html.Raw(Html.CheckoutFormInputs(true))
@Html.Hidden("order_id", "1234")
<input type = "submit" value = "Pay" />
}
这是它在HTML输出中的外观:
<form action = 'https://test.authorize.net/gateway/transact.dll' method = 'post'>
<input type = 'hidden' name = 'x_fp_hash' value = '6bef386eaa89944efd62b47b86042910' \>
<input type = 'hidden' name = 'x_fp_sequence' value = '117'\>
<input type = 'hidden' name = 'x_fp_timestamp' value = 'xxx_key' \>
<input type = 'hidden' name = 'x_login' value = 'yyy_key' \>
<input type = 'hidden' name = 'x_amount' value = '1.99' \>
<input type = 'hidden' name = 'x_relay_url' value = 'http://127.0.0.1:4768' \>
<input type = 'hidden' name = 'x_relay_response' value = 'TRUE' \>
</form><!DOCTYPE html>
<html>
<body>
<h2>Payment Information</h2>
<div style = 'border: 1px solid #990000; padding:12px; margin-bottom:24px; background-color:#ffffcc;width:300px'>Test Mode</div>
<div style = 'float:left;width:250px;'>
<label>Credit Card Number</label>
<div id = 'CreditCardNumber'>
<input type = 'text' size = '28' name = 'x_card_num' value = '4111111111111111' id = 'x_card_num'/>
</div>
</div>
<div style = 'float:left;width:70px;'>
<label>Exp.</label>
<div id = 'CreditCardExpiration'>
<input type = 'text' size = '5' maxlength = '5' name = 'x_exp_date' value = '0116' id = 'x_exp_date'/>
</div>
</div>
<div style = 'float:left;width:70px;'>
<label>CCV</label>
<div id = 'CCV'>
<input type = 'text' size = '5' maxlength = '5' name = 'x_card_code' id = 'x_card_code' value = '123' />
</div>
</div><input id="order_id" name="order_id" type="hidden" value="1234" /> <input type = "submit" value = "Pay" />
答案 0 :(得分:12)
这是我修复它的方式。
如你所说,在Html.CheckoutFormInputs(true)附近添加@ Html.Raw()
要做的另一个更改是
namespace AuthorizeNet.Helpers -> CheckoutFormBuilders.cs
添加
的使用using System.IO;
更改
HttpResponseBase to TextWriter
我在三个地方做到了这一点。
HttpResponseBase _response; to TextWriter _response;
public SIMForm(TextWriter response, string returnUrl, decimal amount,
string apiLogin, string transactionKey)
:this(response,returnUrl,amount,apiLogin,transactionKey,true){}
public SIMForm(TextWriter response, string returnUrl, decimal amount,
string apiLogin, string transactionKey, bool isTest) {
_response = response;
_amount = amount;
_apiLogin = apiLogin;
_transactionkey = transactionKey;
_returnUrl = returnUrl;
_isTest = isTest;
OpenForm();
}
还剩下两个更改
按照tpeczek的回答,您需要更改
helper.ViewContext.HttpContext.Response
到
helper.ViewContext.Writer
这看起来像
public static SIMForm BeginSIMForm(this HtmlHelper helper, string returnUrl,
decimal amount, string apiLogin,
string transactionKey) {
return new SIMForm(helper.ViewContext.Writer,
returnUrl,amount,apiLogin,
transactionKey,true);}
public static SIMForm BeginSIMForm(this HtmlHelper helper, string returnUrl,
decimal amount, string apiLogin,
string transactionKey, bool isTest) {
return new SIMForm(helper.ViewContext.Writer,
returnUrl, amount, apiLogin,
transactionKey,isTest);}
答案 1 :(得分:5)
这种问题通常发生在为ASP.NET MVC 1编写直接写入输出流的帮助程序时(并且使用中包含的帮助程序大多数时间直接写入输出流)。在ASP.NET MVC 1中,您可以使用以下命令写入输出流:
htmlHelper.ViewContext.HttpContext.Response.Output
在以后的ASP.NET MVC版本中,你应该使用它:
htmlHelper.ViewContext.Writer
确保Razor兼容性。如果您可以访问AuthorizeNet.Helpers源代码,则可以自行修复,如果不是,则必须联系作者进行修复。
答案 2 :(得分:1)
AuthorizeNet的帮助程序可能无法正确编写以与Razor一起使用。如果没有真正查看其装配的来源,很难说是否是这种情况。您可能想尝试与他们的客户支持联系。
答案 3 :(得分:1)
使用上面的EpicThreeDev示例,我能够正确显示html表单。然而,Pay按钮并置在ccv字段上方,因此为了在Index.cshtml代码库上修复它,我将HTML更改为
<br />
<input type = "submit" value = "Pay" style="position:relative; top:35px;" />
一旦我这样做,我就可以发布表单,但是在这之后我得到了邮件中解决的错误。
答案 4 :(得分:0)
这是我的解决方案。它只打印Authorize.net隐藏字段,因此您可以编写自己的表单标记。使用相关的AppSettings值填写web.config。通过这种方式,您可以轻松地在开发和生产之间进行切换。
public static class MyAuthNetHelper
{
public const string TEST_URL = "https://test.authorize.net/gateway/transact.dll";
public const string LIVE_URL = "https://secure.authorize.net/gateway/transact.dll";
public static string ApiLogin
{
get { return ConfigurationManager.AppSettings["AuthNetAPILogin"]; }
}
public static string TransactionKey
{
get { return ConfigurationManager.AppSettings["AuthNetAPITransactionKey"]; }
}
public static string ReturnUrl
{
get { return ConfigurationManager.AppSettings["AuthNetReturnUrl"]; }
}
public static string ThanksUrl
{
get { return ConfigurationManager.AppSettings["AuthNetThanksUrl"]; }
}
public static bool TestMode
{
get { return bool.Parse(ConfigurationManager.AppSettings["AuthNetTestMode"]); }
}
public static string GatewayUrl
{
get { return TestMode ? TEST_URL : LIVE_URL; }
}
public static MvcHtmlString AuthNetDirectPostFields(this HtmlHelper helper, decimal amount)
{
var seq = Crypto.GenerateSequence();
var stamp = Crypto.GenerateTimestamp();
var fingerPrint = Crypto.GenerateFingerprint(TransactionKey,
ApiLogin, amount, seq.ToString(), stamp.ToString());
var str = new StringBuilder();
str.Append(helper.Hidden("x_fp_hash", fingerPrint));
str.Append(helper.Hidden("x_fp_sequence", seq));
str.Append(helper.Hidden("x_fp_timestamp", stamp));
str.Append(helper.Hidden("x_login", ApiLogin));
str.Append(helper.Hidden("x_amount", amount));
str.Append(helper.Hidden("x_relay_url", ReturnUrl));
str.Append(helper.Hidden("x_relay_response", "TRUE"));
return MvcHtmlString.Create(str.ToString());
}
}
CSHTML:
<form id="paymentForm" method="POST" action="@MyAuthNetHelper.GatewayUrl" class="form-horizontal offset1">
@Html.AuthNetDirectPostFields(PutYourAmountHere)
...
</form>
在您的操作中使用ThanksUrl来处理Authorize.net的响应。请查看此内容以获取更多信息:http://developer.authorize.net/integration/fifteenminutes/csharp/