欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

.NET CORE 集成Stripe总结

程序员文章站 2024-02-05 20:40:16
...

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

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

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

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

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

.NET CORE 集成Stripe总结

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

.NET CORE 集成Stripe总结

.NET CORE 集成Stripe总结

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

前端: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交互的情况

.NET CORE 集成Stripe总结

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

如下图

.NET CORE 集成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();
            }
        }
    }

上面代码的有一个事件的**,再你设置接受端点的时候可以看到。

有问题,欢迎交流啊。

 

 

 

 

相关标签: stripe .net