Stripe支付介绍在asp.net mvc中开发对接,图文加代码说明

最近一个国外的电商项目,需要对接支付功能,国内的支付一般使用微信支付、支付宝、银联等等,但国际上一般使用Paypal、Skrill、BrainTree、Stripe等,经过内部综合考量所以最后选择使用 Stripe支付。

Stripe的对接相对还是比较简单的,只是相关的文档是英文的,且国内和国外的思想不一样,看文档不是很方便。

做为技术人员这里我将对接中所遇到的问题和解决方法汇总,希望能对开发人员有所帮助。

一:Stripe支付介绍

Stripe支付国际支付还是非常有名气的,具体的介绍下面的一些说明:

  1. 中文官网:https://stripe.com/zh-cn-us
  2. Stripe国际支付简介:点击打开
  3. Stripe支付对接还是非常方便的。
  4. Stripe支付功能也还是很强大的包括支付、账单、订阅等等。

二:Stripe技术对接

  1. 对接前的准备工作
  2. 需要去官网申请一个账号,好像是国内的银行卡不好申请。具体如何申请还请百度搜索下,我这里就不赘述了。
  3. 申请好以后在后台拿到测试的公钥和私钥。
  4. 需要申请HTTPS证书,这个异步通知的接口需要提供HTTPS的域名。
  5. 官网接口文档,共区分后端、前端、ios和安卓。
  6. 其它的一些使用文档:点击查看
  7. 支付对接方式说明:共有2中方式。
  8. 方式一:使用Stripe的支付页面进行支付(官方名称:CheckOut)。
    • 这种分2种情况:
    • 跳转到Stripe的支付页面进行支付,这种类似于支付宝的对接,需要跳转到支付宝的支付页面。Stripe的支付页面效果图如下。
    • 自己的页面构建一个Stripe的支付,这种类似于微信公众号的支付。
  9. 方式二:自己做支付页面,通过接口的方式进行支付。
    • 官网给出了很多HTML示例效果,可下载后自己修改下。点击查看示例效果
    • 采用这种方式,输入信用卡等信息是Stripe通过js控制的,我们是拿不到用户输入的相关信息的,为了安全。
  10. 不管是使用方式一和方式二,我们都无法获取用户输入的信用卡等信息。
  11. 推荐使用方式一对接,有以下几点:
    • 用户在Stripe输入银行卡信息,用户感觉要更加安全。
    • 减少不必要的开发工作,因为自己做的收银页面没法和Stripe的比较。
  12. 下面所有的流程主要是使用跳转到Stripe支付页面支付。
  13. 简单的流程说明
  14. 用户点击页面上的”支付”按钮。
  15. 通过js调用后台的接口,接口中要调用Stripe的接口创建支付的会话(Session),调用Stripe接口之前需要设置一些数据,包括支付金额、支付方式等等,这个后面说明。调用接口成功则Stripe会返回一个SessionId,将该值返会给前端。
  16. 前端拿到SessionId以后,带上改参数跳转到Stripe的支付页面。
  17. 用户如果取消支付或支付成功,则跳转到创建Session配置的取消地址和支付成功跳转地址。
  18. 支付成功或其他的一些事件,Stripe会异步通知我们支付结果。
  19. 上面这几步骤是大致的流程,还请有多的细节问题。
  20. 下面我们根据上面简单的流程进行一步步详细的说明。
  21. 下面的演示代码是:.NET MVC

三:发起支付

  1. 官网有个快速开始支付的说明文档,点击查看
  2. 做一个HTML页面,页面上需要引用Stripe的js文件和点击跳转到支付按钮。当然支付的页面上还有很多其他的一些东西,比如收货地址、商品信息等等。
    3.

  3. “utf-8” />
    2.

3.

4.

5.

  1. //创建一个stripe,里面的参数则是stripe申请的公钥,在后台能查看到,pk_开通的,加test表示是测试的
  2. var stripe = Stripe(‘pk_test_xxx’); //输入自己的pk_test
  3. var checkoutButton = document.getElementById(‘checkout-button’);
  4. //支付按钮点击事件
  5. checkoutButton.addEventListener(‘click’, function () {
  6. //调用后端的接口
  7. fetch(‘/home/CreateCheckoutSession’, {
  8. method: ‘POST’,
  9. })
  10. .then(function (response) {
  11. return response.json();
  12. })
  13. .then(function (session) {
  14. //调用后端接口成功,得到sessionId,页面会在函数里面进行跳转
  15. return stripe.redirectToCheckout({ sessionId: session.id });
  16. })
  17. .then(function (result) {
  18. if (result.error) {
  19. alert(result.error.message);
  20. }
  21. })
  22. .catch(function (error) {
  23. console.error(‘Error:’, error);
  24. });
  25. });
  26. 上面的页面中需要一个后台调用Stripe来产生SessionId。
  27. 后端代码,VS上先在NuGet上引用第三方的包,名称:Stripe.net。
  28. 后端提供SessionId的代码如下
    7.

  29. ///

  30. /// 调用stripe创建支付的会话,成功则返回会话的Id,用于页面跳转
  31. ///
  32. ///
  33. [HttpPost]
  34. public ActionResult CreateCheckoutSession()
  35. {
  36. try
  37. {
  38. // Stripe的私钥,在 Stripe后台能看到 sk开头的,_test则表示是用于测试环境的。
  39. StripeConfiguration.ApiKey = “sk_test_xx”; //sk_test_xxx 这里需要修改
  40. //封装支付请求的数据,
  41. //字段说明详见官网:https://stripe.com/docs/api/checkout/sessions/object
  42. var options = new SessionCreateOptions
  43. {
  44. PaymentMethodTypes = new List
  45. {
  46. “card” ,”alipay” //支持的付款方式
  47. },
  48. BillingAddressCollection= “required”,//是否要收集帐单地址信息
  49. LineItems = new List
  50. {
  51. new SessionLineItemOptions
  52. {
  53. PriceData = new SessionLineItemPriceDataOptions
  54. {
  55. UnitAmount = 2000, //需要支付的金额
  56. Currency = “usd”,//支持的货币简写,具体见官网
  57. ProductData = new SessionLineItemPriceDataProductDataOptions
  58. {
  59. Name = “支付的显示名称,或者是商品名称”,
  60. Images= new List(){“http://www.angelasp.com/images/angellogo.gif” },
  61. Description=”支付的描述信息,可以是商品的描述等信息”
  62. },
  63. },
  64. Quantity = 1,
  65. },
  66. },
  67. Mode = “payment”,
  68. SuccessUrl = “https://example.com/success”, //支付成功以后跳转的URL地址
  69. CancelUrl = “https://example.com/cancel”,//用户取消支付以后跳转的URL地址
  70. };
  71. options.PaymentIntentData = new SessionPaymentIntentDataOptions();
  72. options.PaymentIntentData.Metadata = new Dictionary
  73. {
  74. { “sn”, “6735” }, { “attachmentValue”, “6735” }, //传递的自定义参数,回调通知的时候会原样返回
  75. };
  76. var service = new SessionService();
  77. Session session = service.Create(options);
  78. return Json(new { id = session.Id });
  79. }
  80. catch (Exception ex)
  81. {
  82. throw ex;
  83. }
  84. }
    Stripe支付介绍在asp.net mvc中开发对接,图文加代码说明
  85. Stripe的测试也非常方便,官方提供了很多测试的卡号,下面表格是我收集整理的一些。
  86. 卡号 品牌 CVC 年月 4242424242424242 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支付介绍在asp.net mvc中开发对接,图文加代码说明
  87. 在Stripe的支付页面填写好相关信息以后点击支付,如果没有问题的话就会支付成功。
  88. 支付成功以后可在Stripe的后台看到付款的金额和一些日志,日志包括事件、接口请求日志、订单数据等等。因为是测试的数据所以要先开启可查看测试数据,不然是看不到的,如何开启看下图。
  89. 完成上面的步骤以后,则发起支付收款简单的流程没有问题下,下面说下如何接受Stripe异步通知。

四:接受异步通知

  1. Stripe支持很多事件的通知,例如Session创建完成、订单付款完成、退款等等,详见官网说明。事件类型说明
  2. 需要一个HTTPS的接口,如果没有证书可去阿里云等申请免费的证书。
  3. 在Stripe后台添加一个端点(接受通知的配置)见下图
  4. 事件类型非常多,目前我们是做跳转支付,支付成功了通知我们,则选择:payment_intent.succeeded 事件
    Stripe支付介绍在asp.net mvc中开发对接,图文加代码说明
  5. 编写接受通知的接口代码,官网有英文的说明代码,下面我把代码整理了贴出来。
    7.

  6. ///

  7. /// 支付成功的异步通知接口
  8. ///
  9. ///
  10. [HttpPost]
  11. public ActionResult Notify()
  12. {
  13. var json = new StreamReader(HttpContext.Request.InputStream).ReadToEndAsync().Result;
  14. try
  15. {
  16. //验证数据的来源
  17. string endpointSecret = “whsec_XXXXX”;//后台创建的端点签名密钥
  18. var stripeEvent = EventUtility.ConstructEvent(json, Request.Headers[“Stripe-Signature”], endpointSecret);
  19. //stripeEvent.Type 则是不同的事件,具体则看你配置端点的时候,这个接口设置了那些事件
  20. if (stripeEvent.Type == Events.PaymentIntentSucceeded)
  21. {
  22. //支付成功的业务处理
  23. var payModel = stripeEvent.Data.Object as PaymentIntent;
  24. decimal payAmount = payModel.Amount / 100M; //支付的金额
  25. string payPaySN = payModel.Id;//支付方的唯一订单号
  26. string payCurrency = payModel.Currency;//支付的货币
  27. //账单信息,如果创建Session的时候设置收集账单信息,则这里可以获取到
  28. var billing = payModel.Charges.Data[0].BillingDetails;
  29. string billingName = billing.Name;
  30. string billingEmail = billing.Email;
  31. string billingPhone = billing.Phone;
  32. string billingCity = billing.Address.City;
  33. string billingCountry = billing.Address.Country;
  34. string billingLine1 = billing.Address.Line1;
  35. string billingLine2 = billing.Address.Line2;
  36. string billingPostalCode = billing.Address.PostalCode;
  37. string billingState = billing.Address.State;
  38. //发起支付创建的自定义参数,这里具体根据自己的业务来
  39. string orderSN = payModel.Metadata[“sn”];
  40. string attachmentValue = payModel.Metadata[“attachmentValue”];
  41. //其它的一些业务处理,比如更新订单状态等等
  42. }
  43. else if (stripeEvent.Type == Events.PaymentMethodAttached)
  44. {
  45. var paymentMethod = stripeEvent.Data.Object as PaymentMethod;
  46. Console.WriteLine(“PaymentMethod was attached to a Customer!”);
  47. }
  48. else
  49. {
  50. Console.WriteLine(“Unhandled event type: {0}”, stripeEvent.Type);
  51. }
  52. return Json(new { id = 1});
  53. }
  54. catch (StripeException)
  55. {
  56. return Json(new { id =2 });
  57. }
  58. }
  59. 完成上面的步骤,就可以测试发起支付了和接受支付结果了。
  60. Stripe后台可以看到请求的日志记录,可以针对端点发送测试数据,这些对于调试程序还是很方便的,具体如何使用我就不多说了,都有中文的大家用心看下就懂了。
  61. 上线的时候需要将相关配置参数换成正式环境的。

以上只是我在研究Stripe支付的一点简单的总结,时间仓促很多细节还未深入详细说明。以上如有不正之处还望见谅,可给我留言讨论,谢谢!

Original: https://www.cnblogs.com/angelasp/p/14133598.html
Author: Angelasp
Title: Stripe支付介绍在asp.net mvc中开发对接,图文加代码说明

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612363/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 2022-08-19 PreparedStatement

    PreparedStatement接口是 Statement的子接口,它表示一条预编译过的SQL语句 什么是SQL注入 SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,…

    数据库 2023年6月14日
    075
  • redis 从安装到实现远程连接–centos7下

    Java 端配置 上面的配置完成后,我们可以创建一个普通的 JavaSE 工程来测试下了,Java 工程创建成功后,添加 Jedis 依赖,如下 然后我们可以通过如下一个简单的程序…

    数据库 2023年6月16日
    071
  • SpringMvc(二)- 请求处理参数 和 响应数据处理

    1、请求处理参数 1.1 请求参数 @RequestParam 1.1.1 不使用 @RequestParam 注解 请求参数处理, 不使用参数注解:1.如果 请求参数名和请求处理…

    数据库 2023年6月16日
    071
  • MySQL实战45讲 11

    11 | 怎么给字符串字段加索引? Q:如何在邮箱这样的字段上建立合理的索引? 用户表的定义: create table SUser( ID bigint unsigned pri…

    数据库 2023年6月16日
    075
  • 【StoneDB技术解析】验证相关数据包是否需要解压缩

    在StoneDB中,数据包分为以下几类: 通过对数据包的划分,知识网格技术过滤掉不相关的数据包,读取相关的数据包和可疑的数据包。其中相关的数据包不需要解压缩,只读取元数据,不会发生…

    数据库 2023年5月24日
    069
  • histogram的类型详解

    采样点 每隔指定的时间会采集并上报一次数据,称为采样点。 请注意这里采集的是当前瞬间的数据 count 对采样点的 次数累计和(count) bucket 对采样点的 次数进行统计…

    数据库 2023年6月9日
    0155
  • Qt 保持窗口顶层显示最简单方法

    情景: 当前存在两个窗口或以上,先初始化的窗口会被后初始化的窗口覆盖,从而置于底层, 这时一个最简单的方案就是给需要置于顶层的窗口配置事件过滤器,监听窗口状态,当窗口不属于顶层窗口…

    数据库 2023年6月16日
    0113
  • 多版本并发控制 MVCC

    介绍多版本并发控制 多版本并发控制技术(Multiversion Concurrency Control,MVCC) 技术是为了解决问题而生的,通过 MVCC 我们可以解决以下几个…

    数据库 2023年6月11日
    0127
  • 使用MobaXterm发布服务器项目文件

    注:笔记旨在记录 一、使用MobaXterm登录服务器 二、后端发布 三、前端发布 一、使用MobaXterm登录服务器 打开MobaXterm,点击左上角Session->…

    数据库 2023年6月16日
    0100
  • MySQL 回表

    MySQL 回表 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。 一、简述 回表,顾名思义就是回到表中,也就是先通过普通索引扫描出数据所在的行,再通过行主键ID 取出索引中未包含…

    数据库 2023年5月24日
    080
  • 总监让我当小组长,我不愿意,理由竟是…

    来源:BiggerBoy作者:北哥原文链接:https://mp.weixin.qq.com/s/_pkjvDzGQUDTfo9C1bieJw 最近看到一个话题,热度很高:【总监让…

    数据库 2023年6月11日
    066
  • Java并发

    Java并发 JAVA技术交流群:737698533 CAS compare and swap 比较并交换,cas又叫做无锁,自旋锁,乐观锁,轻量级锁 例如下面的代码,如果想在多线…

    数据库 2023年6月16日
    070
  • [Unity]如何解决带刚体的物体在墙角会穿墙的问题

    问题背景 当一个物体在两个带碰撞体的方块组成的墙角时,只要”挤一挤”就可以从墙角穿墙而过: 原因分析 根据【Unity】Rigidbody.velocity…

    数据库 2023年6月16日
    0161
  • MySQL45讲之函数转换导致不使用索引

    本文介绍了由于函数转换而不使用索引的三个问题。请注意,不使用索引意味着不使用树搜索,而是使用全表扫描索引树。 [En] This article introduces three …

    数据库 2023年5月24日
    067
  • 用相对定位实现简单的图片边框阴影效果

    实现阴影效果方法有很多,一般复杂一点的外发光式的阴影都使用png作为背景图片来实现阴影,今天做的这个比较简单,阴影是纯色的,所以可以直接使用背景颜色,图片的位移一下就能使图片产生阴…

    数据库 2023年6月11日
    076
  • 代码更新提交到GIT

    1、先克隆代码到本地做备份(在需要克隆项目的的那个文件夹下使用Git Bash Here可以直接定位到当前目录,不让需要定位cd命令到目录再使用克隆命令) $ git clone …

    数据库 2023年6月11日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球