我在一个非营利捐赠平台上工作,这是我第一次使用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" />
这就是我修复它的方法。
正如您所说,添加@Html。围绕Html拖动()。CheckoutFormInputs(true)
要做的另一个更改是
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);}
当为ASP编写直接写入输出流的助手时,通常会发生这种问题。NET MVC 1(以及using中包含的助手在大多数情况下直接写入输出流)。在ASP。NET MVC 1中,您可以使用以下内容编写输出流:
htmlHelper.ViewContext.HttpContext.Response.Output
在以后的ASP。NET MVC版本你应该使用这个:
htmlHelper.ViewContext.Writer
这确保了Razor的兼容性。如果您有权访问AuthorizeNet。帮助源代码你可以自己修复它,如果你不这样做,你必须联系作者来修复它。
AuthorizeNet中的帮助程序可能没有正确编写以使用Razor。如果不仔细研究它们组装的来源,很难说是不是这样。您可能需要尝试联系他们的客户支持。
使用上面EpicThreeDev的示例,我能够正确显示表单html。然而,"支付"按钮被并置在ccv字段上方,因此为了在Index.chtml代码库中修复这一问题,我将HTML更改为
<br />
<input type = "submit" value = "Pay" style="position:relative; top:35px;" />
一旦我这样做了,我就可以张贴表格,但在这样做之后,我收到了邮寄的错误。
http://community.developer.authorize.net/t5/Integration-and-Testing/Having-Trouble-setting-up-MVC3-application-with-DPM/m-p/13226
这是我的解决方案。它只打印Authorize.net隐藏字段,这样您就可以编写自己的表单标记。在web.config中填写相关的AppSettings值。通过这种方式,您可以轻松地在开发和生产之间进行更改。
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/