在当今的Web开发中,如果要创建一个新的复杂Web应用程序,很可能不会选择使用.NET WebForms。相反,可能会倾向于使用MVC框架。然而,有许多旧的电子商务网站是基于WebForms构建的,它们可能希望利用Stripe提供的优秀的支付处理服务。Stripe的官方文档并没有提供太多关于如何在.NET WebForms应用程序中集成其平台的帮助。本文将介绍如何做到这一点。
首先,需要拥有一个Stripe账户。如果还没有Stripe账户,请访问来注册一个。注册后,将获得与Stripe账户关联的API发布密钥和秘密密钥。
接下来,需要在项目中安装Stripe.net库。Stripe.net是一个同步/异步.NET 4.5+客户端,以及一个为stripe.com编写的便携类库,作者是jaymedavis。可以通过以下两种方式之一来安装它:
在创建支付页面时,关键的区别在于不会使用.NET服务器控件作为输入字段。需要使用普通的客户端HTML输入字段。因此,包含卡详细信息输入字段和支付按钮的支付页面部分将类似于以下示例:
<div>
<asp:Label runat="server" Width="180">卡号</asp:Label>
<input type="text" id="txtCardNumber" name="txtCardNumber" />
</div>
<div>
<asp:Label runat="server" Width="180">有效期</asp:Label>
<input type="text" id="txtCardExpiryMonth" name="txtCardExpiryMonth" />
<input type="text" id="txtCardExpiryYear" name="txtCardExpiryYear" />
</div>
<div>
<asp:Label runat="server" Width="180">安全码</asp:Label>
<input type="text" id="txtCardSecurityCode" name="txtCardSecurityCode" />
</div>
<div>
<input type="submit" id="btnPay" name="btnPay" value="立即支付" />
</div>
Stripe使用令牌化系统,卡持有人的信息直接从客户端发送到Stripe,不会经过服务器,这就是使用Stripe可以避免任何PCI合规问题的原因。
需要在页面上的某个地方放置一个隐藏字段,以接受Stripe在成功授权后发送给令牌。然后,当支付完成后,可以在应用程序中进行任何处理时,将此令牌与服务器共享。
<input type="hidden" name="hfStripeToken" id="hfStripeToken" />
该过程使用Stripe提供的JavaScript,包含在支付页面的
部分,如下所示:
<script type="text/javascript" src="https://js.stripe.com/v2/"></script>
然后,也在支付页面的
部分,包含以下JavaScript:
<script type="text/javascript">
$(document).ready(function () {
Stripe.setPublishableKey('your_Stripe_publishable_key');
$('#btnPay').on('click', function (e) {
e.preventDefault();
e.stopPropagation();
Stripe.card.createToken({
number: $('#txtCardNumber').val(),
cvc: $('#txtCardSecurityCode').val(),
exp_month: $('#txtCardExpiryMonth').val(),
exp_year: $('#txtCardExpiryYear').val()
}, stripeResponseHandler);
});
function stripeResponseHandler(status, response) {
var $form = $('#form1');
if (response.error) {
alert(response.error.message);
} else {
var token = response.id;
$('#hfStripeToken').val(token);
$form.get(0).submit();
}
}
});
</script>
这段代码将点击事件附加到支付按钮上,当点击时,它会将卡详细信息字段的内容发送到Stripe以获取令牌,可以稍后使用该令牌进行支付。如果卡输入有任何错误,它将显示一个JavaScript警告,以通知访问者输入有误或不正确。
一旦访问者输入了有效的卡号、有效期和有效的安全码(CSC),这个JavaScript就会从Stripe服务器获取一个令牌,然后将其放置在隐藏字段中,然后(重新)提交表单,这次提交到服务器。
请注意,在示例中,它提交的表单id为"form1",这是WebForms Web页面的默认ASP.NET表单名称,但在项目中可能会有所不同。
通常在.NET中,会使用附加到按钮上的事件来处理点击事件,例如:
protected void btn_Click(object sender, EventArgs e) { // 处理点击 }
然后,随后执行:
protected void Page_PreRender(object sender, EventArgs e) { }
然而,因为没有使用服务器控件作为按钮或输入字段,必须在Page_Load()事件的一开始就处理Stripe的回传:
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
// 处理Stripe支付
NameValueCollection nvc = Request.Form;
string hfStripeToken = nvc["hfStripeToken"];
if (!string.IsNullOrEmpty(hfStripeToken))
{
btnPay_Click(hfStripeToken);
}
}
// 继续常规Page_load()处理...
}
必须区分由支付按钮触发的回传(这些回传是由Stripe发回给)和由支付页面上的任何其他按钮或可点击元素触发的回传。知道,如果Stripe将令牌放入隐藏字段,那么这次回传肯定最初是由支付按钮的点击触发的,这次表单提交是由Stripe触发的。
在调用的btnPay_Click()函数中,使用Stripe发送给令牌来实际进行支付。如果支付由于某种原因失败,例如卡片被拒绝,除了其他响应信息提供的错误详细信息外,Stripe还会返回一个HTML错误代码,因此尝试的收费必须在Try { } Catch { }块中,以捕获"错误"。
private void btnPay_Click(string stripeToken)
{
var myCharge = new StripeChargeCreateOptions
{
// 将£15.95的金额转换为便士,即1595
Amount = (int)(amount_to_charge * 100),
Currency = "gbp",
// 或者处理的任何货币
Description = your_unique_identifier,
// 例如订单ID
SourceTokenOrExistingSourceId = stripeToken
};
var chargeService = new StripeChargeService(your_Stripe_secret_key);
try
{
stripeCharge = chargeService.Create(myCharge);
}
catch (StripeException ex)
{
StripeError stripeError = ex.StripeError;
// 处理错误
return;
}
// 成功授权,在这里做支付后处理...
}
StripeError包含有关失败支付的信息,可能是卡片被拒绝,可以使用此信息将失败的支付详情发送到支付页面,供访问者查看。如果没有发生错误,那么可以假设支付已成功,然后可以处理支付,例如将订单保存到数据库,并显示感谢页面给访问者。
仅在旧的WebForms系统上使用此代码!任何新的重要项目当然应该使用ASP.NET MVC创建。