最近一个国外的电商项目,须要对接支付功能,国内的支付通常使用微信支付、支付宝、银联等等,但国际上通常使用Paypal、Skrill、BrainTree、Stripe等,通过内部综合考量因此最后选择使用 Stripe支付。javascript
Stripe的对接相对仍是比较简单的,只是相关的文档是英文的,且国内和国外的思想不同,看文档不是很方便。html
作为技术人员这里我将对接中所遇到的问题和解决方法汇总,但愿能对开发人员有所帮助。前端
一:Stripe支付介绍
Stripe支付国际支付仍是很是有名气的,具体的介绍下面的一些说明:java
- 中文官网:https://stripe.com/zh-cn-us
- Stripe国际支付简介:点击打开
- Stripe支付对接仍是很是方便的。
- Stripe支付功能也仍是很强大的包括支付、帐单、订阅等等。
二:Stripe技术对接
- 对接前的准备工做
- 须要去官网申请一个帐号,好像是国内的银行卡很差申请。具体如何申请还请百度搜索下,我这里就不赘述了。
- 申请好之后在后台拿到测试的公钥和私钥。
- 须要申请HTTPS证书,这个异步通知的接口须要提供HTTPS的域名。
- 官网接口文档,共区分后端、前端、ios和安卓。
- 其它的一些使用文档:点击查看
- 支付对接方式说明:共有2中方式。
- 方式一:使用Stripe的支付页面进行支付(官方名称:CheckOut)。
- 这种分2种状况:
- 跳转到Stripe的支付页面进行支付,这种相似于支付宝的对接,须要跳转到支付宝的支付页面。Stripe的支付页面效果图以下。

- 本身的页面构建一个Stripe的支付,这种相似于微信公众号的支付。
- 方式二:本身作支付页面,经过接口的方式进行支付。
- 官网给出了不少HTML示例效果,可下载后本身修改下。点击查看示例效果
- 采用这种方式,输入信用卡等信息是Stripe经过js控制的,咱们是拿不到用户输入的相关信息的,为了安全。
- 不论是使用方式一和方式二,咱们都没法获取用户输入的信用卡等信息。
- 推荐使用方式一对接,有如下几点:
- 用户在Stripe输入银行卡信息,用户感受要更加安全。
- 减小没必要要的开发工做,由于本身作的收银页面无法和Stripe的比较。
- 下面全部的流程主要是使用跳转到Stripe支付页面支付。
- 简单的流程说明
- 用户点击页面上的“支付”按钮。
- 经过js调用后台的接口,接口中要调用Stripe的接口建立支付的会话(Session),调用Stripe接口以前须要设置一些数据,包括支付金额、支付方式等等,这个后面说明。调用接口成功则Stripe会返回一个SessionId,将该值返会给前端。
- 前端拿到SessionId之后,带上改参数跳转到Stripe的支付页面。
- 用户若是取消支付或支付成功,则跳转到建立Session配置的取消地址和支付成功跳转地址。
- 支付成功或其余的一些事件,Stripe会异步通知咱们支付结果。
- 上面这几步骤是大体的流程,还请有多的细节问题。
- 下面咱们根据上面简单的流程进行一步步详细的说明。
- 下面的演示代码是:.NET MVC
三:发起支付
- 官网有个快速开始支付的说明文档,点击查看
- 作一个HTML页面,页面上须要引用Stripe的js文件和点击跳转到支付按钮。固然支付的页面上还有不少其余的一些东西,好比收货地址、商品信息等等。
-
-
-
-
-
<meta charset=
"utf-8" />
-
-
<script src=
"~/js/jquery-1.12.4.min.js"></script>
-
<script src=
"http://js.stripe.com/v3/"></script>
-
-
-
-
-
<button id=
"checkout-button">去付款</button>
-
-
<script type=
"text/javascript">
-
-
-
var stripe = Stripe('pk_test_xxx');
-
var checkoutButton = document.getElementById('checkout-button');
-
-
-
checkoutButton.addEventListener(
'click', function () {
-
-
-
fetch(
'/home/CreateCheckoutSession', {
-
-
-
.then(function (response) {
-
-
-
.then(function (session) {
-
-
return stripe.redirectToCheckout({ sessionId: session.id });
-
-
.then(function (result) {
-
-
-
alert(result.error.message);
-
-
-
.
catch(function (error) {
-
console.error(
'Error:', error);
-
-
-
-
-
-
-
-
-
- 上面的页面中须要一个后台调用Stripe来产生SessionId。
- 后端代码,VS上先在NuGet上引用第三方的包,名称:Stripe.net。
- 后端提供SessionId的代码以下
-
-
-
-
-
-
-
public ActionResult CreateCheckoutSession()
-
-
-
-
-
StripeConfiguration.ApiKey =
"sk_test_xx";
-
-
-
-
var options = new SessionCreateOptions
-
-
PaymentMethodTypes =
new List<string>
-
-
-
-
BillingAddressCollection=
"required",
-
-
LineItems =
new List<SessionLineItemOptions>
-
-
new SessionLineItemOptions
-
-
PriceData =
new SessionLineItemPriceDataOptions
-
-
-
-
ProductData =
new SessionLineItemPriceDataProductDataOptions
-
-
Name =
"支付的显示名称,或者是商品名称",
-
Images=
new List<string>(){"http://www.angelasp.com/images/angellogo.gif" },
-
Description=
"支付的描述信息,能够是商品的描述等信息"
-
-
-
-
-
-
-
-
SuccessUrl =
"https://example.com/success",
-
CancelUrl =
"https://example.com/cancel",
-
-
-
options.PaymentIntentData =
new SessionPaymentIntentDataOptions();
-
options.PaymentIntentData.Metadata =
new Dictionary<string, string>
-
-
{
"sn", "6735" }, { "attachmentValue", "6735" },
-
-
-
var service = new SessionService();
-
Session session = service.Create(options);
-
-
return Json(new { id = session.Id });
-
-
-
-
-
-
- 上面前端HTML和后端的接口都处理好之后,点击页面上的那个去付款的按钮,则会跳转到Stripe的收银台页面(下图)。

- Stripe的测试也很是方便,官方提供了不少测试的卡号,下面表格是我收集整理的一些。
-
卡号jquery |
品牌ios |
CVCgit |
年月json |
4242424242424242windows |
Visa后端 |
任意3位数字 |
大于当前时间的年月 |
4000056655665556 |
Visa (debit) |
任意3位数字 |
大于当前时间的年月 |
5555555555554444 |
Mastercard |
任意3位数字 |
大于当前时间的年月 |
2223003122003222 |
Mastercard (2-series) |
任意3位数字 |
大于当前时间的年月 |
5200828282828210 |
Mastercard (debit) |
任意3位数字 |
大于当前时间的年月 |
5105105105105100 |
Mastercard (prepaid) |
任意3位数字 |
大于当前时间的年月 |
378282246310005 |
American Express |
任意4位数字 |
大于当前时间的年月 |
371449635398431 |
American Express |
任意4位数字 |
大于当前时间的年月 |
6011111111111117 |
Discover |
任意3位数字 |
大于当前时间的年月 |
6011000990139424 |
Discover |
任意3位数字 |
大于当前时间的年月 |
3056930009020004 |
Diners Club |
任意3位数字 |
大于当前时间的年月 |
36227206271667 |
Diners Club (14 digit card) |
任意3位数字 |
大于当前时间的年月 |
3566002020360505 |
JCB |
任意3位数字 |
大于当前时间的年月 |
6200000000000005 |
UnionPay |
任意3位数字 |
大于当前时间的年月 |
信用卡的年月,填写大于当前时间的年月便可。

- 在Stripe的支付页面填写好相关信息之后点击支付,若是没有问题的话就会支付成功。
- 支付成功之后可在Stripe的后台看到付款的金额和一些日志,日志包括事件、接口请求日志、订单数据等等。由于是测试的数据因此要先开启可查看测试数据,否则是看不到的,如何开启看下图。

- 完成上面的步骤之后,则发起支付收款简单的流程没有问题下,下面说下如何接受Stripe异步通知。
四:接受异步通知
- Stripe支持不少事件的通知,例如Session建立完成、订单付款完成、退款等等,详见官网说明。事件类型说明
- 须要一个HTTPS的接口,若是没有证书可去阿里云等申请免费的证书。
- 在Stripe后台添加一个端点(接受通知的配置)见下图

- 事件类型很是多,目前咱们是作跳转支付,支付成功了通知咱们,则选择:payment_intent.succeeded 事件
- 拿到验证端点的密钥,每一个端点有独立的密钥,见下图

- 编写接受通知的接口代码,官网有英文的说明代码,下面我把代码整理了贴出来。
-
-
-
-
-
-
-
-
-
-
-
-
public ActionResult Notify()
-
-
-
-
var json = new StreamReader(HttpContext.Request.InputStream).ReadToEndAsync().Result;
-
-
-
-
-
-
-
-
string endpointSecret = "whsec_XXXXX";
-
-
var stripeEvent = EventUtility.ConstructEvent(json, Request.Headers["Stripe-Signature"], endpointSecret);
-
-
-
-
-
-
if (stripeEvent.Type == Events.PaymentIntentSucceeded)
-
-
-
-
-
-
var payModel = stripeEvent.Data.Object as PaymentIntent;
-
-
-
-
decimal payAmount = payModel.Amount / 100M;
-
-
string payPaySN = payModel.Id;
-
-
string payCurrency = payModel.Currency;
-
-
-
-
-
-
var billing = payModel.Charges.Data[0].BillingDetails;
-
-
string billingName = billing.Name;
-
-
string billingEmail = billing.Email;
-
-
string billingPhone = billing.Phone;
-
-
string billingCity = billing.Address.City;
-
-
string billingCountry = billing.Address.Country;
-
-
string billingLine1 = billing.Address.Line1;
-
-
string billingLine2 = billing.Address.Line2;
-
-
string billingPostalCode = billing.Address.PostalCode;
-
-
string billingState = billing.Address.State;
-
-
-
-
-
-
string orderSN = payModel.Metadata["sn"];
-
-
string attachmentValue = payModel.Metadata["attachmentValue"];
-
-
-
-
-
-
-
-
-
-
-
-
else if (stripeEvent.Type == Events.PaymentMethodAttached)
-
-
-
-
var paymentMethod = stripeEvent.Data.Object as PaymentMethod;
-
-
Console.WriteLine(
"PaymentMethod was attached to a Customer!");
-
-
-
-
-
-
-
-
Console.WriteLine(
"Unhandled event type: {0}", stripeEvent.Type);
-
-
-
-
-
-
return Json(new { id = 1});
-
-
-
-
-
-
-
return Json(new { id =2 });
-
-
-
-
- 完成上面的步骤,就能够测试发起支付了和接受支付结果了。
- Stripe后台能够看到请求的日志记录,能够针对端点发送测试数据,这些对于调试程序仍是很方便的,具体如何使用我就很少说了,都有中文的你们用心看下就懂了。
- 上线的时候须要将相关配置参数换成正式环境的。
以上只是我在研究Stripe支付的一点简单的总结,时间仓促不少细节还未深刻详细说明。以上若有不正之处还望见谅,可给我留言讨论,谢谢!