Vin*_*one 3 c# asp.net braintree visual-studio-2012
所以我现在一直在调查Braintree Payments几天.我喜欢这个架构,概念等.在浏览了文档和.NET演练之后,我注意到.NET的所有示例都在MVC3中.我正在尝试使用常规Web表单将Braintree集成到我当前的.NET Web应用程序中.
我的目标是将正常的Web表单发回到支付页面,同时包含客户数据和卡数据.卡数据应使用他们的Braintree.js加密.这样我就可以将所有内容发送到Braintree进行处理,包括加密的卡片数据.
表单看起来像这样:
<p>
<label>Card Number</label>
<asp:TextBox ID="number" AutoCompleteType="Disabled" MaxLength="20" Width="150" data-encrypted-name="number" runat="server" />
</p>
<p>
<label>CVV</label>
<asp:TextBox ID="cvv" AutoCompleteType="Disabled" MaxLength="4" Width="50" data-encrypted-name="cvv" runat="server" />
</p>
<p>
<label>Expiration (MM/YYYY)</label>
<asp:TextBox ID="month" AutoCompleteType="Disabled" MaxLength="2" data-encrypted-name="month" runat="server" />
/
<asp:TextBox ID="year" AutoCompleteType="Disabled" MaxLength="4" data-encrypted-name="year" runat="server" />
</p>
<asp:Button ID="btnSubmit" Text="SUBMIT" runat="server" />
<script type="text/javascript" src="https://js.braintreegateway.com/v1/braintree.js"></script>
<script type="text/javascript">
var braintree = Braintree.create("MyClientSideKey");
braintree.onSubmitEncryptForm('braintree-payment-form');
</script>
Run Code Online (Sandbox Code Playgroud)
然后在代码隐藏中,我将设置Form.Action,Form.Method和Form.ID,如下所示:
protected void Page_Load(object sender, EventArgs e)
{
Form.Action = "CreateTransaction()";
Form.Method = "POST";
Form.ID = "braintree-payment-form";
}
Run Code Online (Sandbox Code Playgroud)
因此,希望当用户提交表单时,它会点击"CreateTransaction()"成员以及"collection"参数中的加密卡数据,如下所示:
[HttpPost]
public ActionResult CreateTransaction(FormCollection collection)
{
TransactionRequest request = new TransactionRequest
{
Amount = 1000.0M,
CreditCard = new TransactionCreditCardRequest
{
Number = collection["number"],
CVV = collection["cvv"],
ExpirationMonth = collection["month"],
ExpirationYear = collection["year"]
},
Options = new TransactionOptionsRequest
{
SubmitForSettlement = true
}
};
Result<Transaction> result = Constants.Gateway.Transaction.Sale(request);
return null;
}
Run Code Online (Sandbox Code Playgroud)
当我采用这种方法时,表单永远不会回发到"CreateTransaction()"成员.我错过了什么?这可以使用常规的旧网页表单来完成吗?
好的,所以经过一段时间的实验和在黑暗中拍摄后我能够得到这个Braintree.js来加密数据,然后再将它传递给我的服务器.从那里我可以使用代码来处理付款处理.
这是我正在使用的ASP.NET Web表单:
卡号
<p>
<label>CVV</label>
<asp:TextBox ID="txtCVV" AutoCompleteType="Disabled" MaxLength="4" Width="50" data-encrypted-name="cvv" runat="server" />
</p>
<p>
<label>Expiration (MM/YYYY)</label>
<asp:TextBox ID="txtMonth" AutoCompleteType="Disabled" MaxLength="2" data-encrypted-name="month" runat="server" />
/
<asp:TextBox ID="txtYear" AutoCompleteType="Disabled" MaxLength="4" data-encrypted-name="year" runat="server" />
</p>
<asp:Button ID="btnSubmit" Text="SUBMIT" runat="server" />
<script type="text/javascript" src="https://js.braintreegateway.com/v1/braintree.js"></script>
<script type="text/javascript">
var braintree = Braintree.create("YOURKEYHERE");
braintree.onSubmitEncryptForm('braintree-payment-form');
</script>
Run Code Online (Sandbox Code Playgroud)
请注意以下几个关键细节:
我正在使用服务器控件.不是简单的HTML标签.
braintree.js将加密具有" data-encrypted-name "属性的任何字段.
"数据加密-name"属性也不要需要是一样的控件的ID属性.
该braintree.js脚本发布到" 布伦特里支付形式 "的形式.
因此,当我单击" 提交"按钮时,此表单将自然发回.我正在使用的特定表单有一个母版页,所以我需要更改Page_Load中的Form.ID:
protected void Page_Load(object sender, EventArgs e)
{
//Adjust the properties of the form itself as this
//form has a master page.
Form.ID = "braintree-payment-form";
//Wire up the click event
btnSubmit.Click += btnSubmit_Click;
}
Run Code Online (Sandbox Code Playgroud)
在click事件处理程序中,我可以从Request.Form对象中提取加密值,然后将事务请求提交给Braintree Gateway:
void btnSubmit_Click(object sender, EventArgs e)
{
//--------------------------------------------------------------------------------------------------
//Extract encrypted values from the Request.Form object
//braintree.js has encrypted these values before placing them in
//the Request object.
//--------------------------------------------------------------------------------------------------
string number = Request.Form["number"].ToString();
string cvv = Request.Form["cvv"].ToString();
string month = Request.Form["month"].ToString();
string year = Request.Form["year"].ToString();
//--------------------------------------------------------------------------------------------------
//Gateway
//This is the Braintree Gateway that we will use to post the transaction
//to. This is included here in the example but should be extracted out
//into some static class somewhere. Possibly in another layer.
//--------------------------------------------------------------------------------------------------
BraintreeGateway Gateway = new BraintreeGateway
{
Environment = Braintree.Environment.SANDBOX,
PublicKey = "YOURPUBLICKEYHERE",
PrivateKey = "YOURPRIVATEKEYHERE",
MerchantId = "YOURMERCHANTIDHERE"
};
//--------------------------------------------------------------------------------------------------
//Transaction Request
//This is the actual transaction request that we are posting to the
//Braintree gateway. The values for number, cvv, month and year have
//been encrypted above using the braintree.js. If you were to put a
//watch on the actual server controls their ".Text" property is blank
//at this point in the process.
//--------------------------------------------------------------------------------------------------
TransactionRequest transactionRequest = new TransactionRequest
{
Amount = 100.00M,
CreditCard = new TransactionCreditCardRequest
{
Number = number,
CVV = cvv,
ExpirationMonth = month,
ExpirationYear = year,
}
};
//--------------------------------------------------------------------------------------------------
//Transaction Result
//Here we are going to post our information, including the encrypted
//values to Braintree.
//--------------------------------------------------------------------------------------------------
Result<Transaction> result = Gateway.Transaction.Sale(transactionRequest);
}
Run Code Online (Sandbox Code Playgroud)
好的,所以这是如何将事务发布到Braintree的一个非常基本的例子.然而,它解决了我在卡数据到达我的服务器之前加密的第一大障碍.希望这可以帮助...