.NET CORE 集成Stripe总结

目前PayPal与Stripe占据绝大数的海外支付渠道。为了帮助小白,快速集成,

主要介绍使用.NET CORE 集成的一些重要步骤,欢迎拍砖,交流,本人v:152¥5658$1861 注意去掉符号即可,是号码。

第一步:https://stripe.com/ 申请一个测试账户,开发人员使用自己的邮箱一些信息,即可注册,门槛不是很高。

第二步:进入https://dashboard.stripe.com/test/dashboard 看url 就知道是测试面板

第三步:进入左导航栏开发者选项,拿到可发布的密钥与密钥,如下图


第四步:重点来了,看公司给的api 文档,如下图点击浏览文档进去,选择接受信用卡付款




第五步:大致你看了文档之后,总结下来,前后端需要做什么

前端:1. 需要根据pk_test_...那个开头的密钥,初始化js sdk

            2.告诉后端根据本系统订单ID ,创建一个Stripe的订单,好让用户支付对应的金额

            3.后端根据第二步,会产生一个Stripe的订单,这个时候前端需要使用Stripe订单对象的 ClientSecret

    4.扩展:当用户支付成功或者失败的时候,前端会收到此消息,可以调用后端接口,做支付成功后,商品业务逻辑的处       理。当然前端也可以不做,Stripe为我们提供了WebHook 当产生订单状态更改后,会自动调用客户的api

后端:1.提供为前端提供pk_test_...那个开头的密钥接口

           2.根据本系统订单金额,数据一些情况,创建对应Stripe 订单

           3.做一个支付成功后,变更商品业务逻辑的接口。

           4.根据前端4,自己可以做一个接口,接受Stripe 事件回调接口。

第六步:下面贴出来,自己写的一些简单代码,不含业务逻辑。

public class OrderData  

    {

        /// <summary>

        /// 自己本系统的订单ID 

        /// </summary>

        public string OrderId { get; set; }

    }

public class TestData

    {

        /// <summary>

        /// js 初始化密钥

        /// </summary>

        public string PublishableKey { get; set; }

        /// <summary>

        /// Stripe订单的密钥

        /// </summary>

        public string ClientSecret { get; set; }

    }

[ApiController]

    [Route("[controller]/[action]")]

    public class StripeController : ControllerBase

    {

        private PaymentIntentService service;

        public StripeController()

        {

            StripeConfiguration.ApiKey = "sk_test_。。自己的密钥";

            service = new PaymentIntentService();

        }

        public Dictionary<string, string> Parms = new Dictionary<string, string>();

        /// <summary>

        /// 前端获取初始化密钥,与订单的ClientSecret

        /// </summary>

        /// <param name="orderData"></param>

        /// <returns></returns>

        [HttpPost]

        public TestData Get( OrderData orderData)

        {

            StripeConfiguration.ApiKey = "sk_test_。。自己的密钥";

            Parms.Clear();

            Parms.Add("OrderID","1234");

            var options = new PaymentIntentCreateOptions

            {

                Amount = 10000,//单位是分

                Currency = "hkd",//各个国家或地区的货币代码,参考iso国际标准

                PaymentMethodTypes = new List<string> { "card" },//信用卡付款

                StatementDescriptor = "order id 1234 。。。。自己写一些简单的说明", Metadata = Parms //绑定自己系统订单ID ,做数据校验

            };

            var intent = service.Create(options);

            TestData data = new TestData();

            data.PublishableKey = "pk_test_..自己的密钥";

            data.ClientSecret = intent.ClientSecret;

            return data;

        }


        /// <summary>

        /// 前端拿到支付成功状态的时候,调用的接口

        /// </summary>

        /// <param name="id"></param>

        /// <returns></returns>

        [HttpGet]

        public bool Complete(string id)

        {

            var intent = service.Get(id);

            if (intent.Status== "succeeded")

            {

                //业务逻辑,校验本地的订单是否状态已经更改,防止重复调用,还有校验订单是否匹配,订单的状态等

                return true;

            }

            return false;

        }

    }

第八步,接口提供完成后,就可以完成跑起来了。自己可以通过下图,看到api交互的情况


第九步,再订单完成的时候,上面是前端告诉自己后端,其实也可以使用webhook ,通过订阅Stripe的事件达到类似的效果

如下图


[Route("api/[controller]")]

    public class StripeWebHookController: Controller

    {

        const string endpointSecret = "whsec_。。。。";//事件的密钥,

        [HttpPost]

        public async Task<IActionResult> Index()

        {

            try

            {

                var json = await new StreamReader(HttpContext.Request.Body).ReadToEndAsync();

                var stripeEvent = EventUtility.ConstructEvent(json,

                    Request.Headers["Stripe-Signature"], endpointSecret,throwOnApiVersionMismatch:false);

                //throwOnApiVersionMismatch 这个指定为false,因为api 版本的问题,官方给不含这个参数,

                //跑不起来。除非自己调用创建订阅事件,但是麻烦,故使用这个爽

                // Handle the event

                if (stripeEvent.Type == Events.PaymentIntentSucceeded)

                {

                    var paymentIntent = stripeEvent.Data.Object as PaymentIntent;

                    Console.WriteLine("PaymentIntent was successful!");//订单成功后的业务逻辑

                }

                else if (stripeEvent.Type == Events.PaymentMethodAttached)

                {

                    var paymentMethod = stripeEvent.Data.Object as PaymentMethod;

                    Console.WriteLine("PaymentMethod was attached to a Customer!");

                }

                // ... handle other event types

                else

                {

                    // Unexpected event type

                    return BadRequest();

                }

                return Ok();

            }

            catch (StripeException e)

            {

                MySqlHelper.updateStoreByID("test...e"+ e.Message.ToString());

                return BadRequest();

            }

        }

    }

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。