java实现Stripe信用卡支付

标签: stripe支付  stripe  java

Stripe实现信用卡支付

不做介绍stripe支付介绍,就讲讲逻辑和实现和代码,要看stripe介绍自己百度一大堆。
ssm三层架构实现。小白还望指教,谢谢大佬们。

屁话少说 逻辑

1.讲讲逻辑: 点击商品然后下单创建订单,把订单号封装成自定义参数传给stripe在调起支付,所有东西都有stripe实现。最后使用webhook挂钩实现回调操作拿到自定义参数处理你的业务逻辑;

实现

2.前端实现:初始化页面,找到官网案例图(https://stripe.com/docs/payments/integration-builder)根据下面图下载。这是stripe测试的,如果想调起支付就得把自己key和秘钥换上去。 stripe 官网都实现了前端,样式根据自己需求去调,这里我讲讲js实现。

// 直贴关键代码
var stripe_pk = "pk_livex9FxxxxhI9Yj2";//这是你的pk_key ,去开发模块里面找key和秘钥 
var stripe = Stripe(stripe_pk);//初始化stripe  

//这个不是调起支付 而是初始化这个页面 ,也可以说你可以不用管调起支付, stripe会帮你调起,用户只要输入卡号就行
fetch("/create-payment-intent", {//打开html 页面就会去请求 你的‘/create-payment-intent’后台 
 method: "POST",
 headers: {
   "Content-Type": "application/json"
 },
//传过去的参数 price 价格最低0.5美元 单位分 , 邮箱 ,订单号 ,其他
 body: JSON.stringify({"price":money,"order_no":order_no,"email":email,"title":title})
})
//支付成功后调取 自己根据需求改
var orderComplete = function(paymentIntentId) {
 loading(false);
 document
   .querySelector(".result-message a")
   .setAttribute(
     "href",
     "./order?paymentIntentId=" + paymentIntentId //成功调取地址 
   );
 document.querySelector(".result-message").classList.remove("hidden");
 document.querySelector("button").disabled = true;
};

在这里插入图片描述
3.后端实现:初始化页面

	//xml 包 
	
	// 控制层
    @ResponseBody
    @RequestMapping(value = {"/create-payment-intent"}, method = RequestMethod.POST)
    public String paymentOrder(@RequestBody Map<String, String> map,
                               HttpServletRequest request, HttpServletResponse response) throws StripeException {
        return service.payments(map,request,response);
    }
    //service业务处理
    public String payments(Map<String, String> map,HttpServletRequest request, HttpServletResponse response) throws StripeException {
        staticFiles.externalLocation(Paths.get("").toAbsolutePath().toString());
        Stripe.apiKey = "sk_live_51HZCAR00sBFiQi4h";//自己sk_key 开发里面有自己找
        PaymentIntentCreateParams createParams = new PaymentIntentCreateParams.Builder()
                .setAmount(Long.decode(map.get("price")))//设置金额
                .setCurrency("twd")//设置货币
                .setDescription("购买"+map.get("title")+",订单号:"+ map.get("order_no"))//描述
                .putMetadata("order_id", map.get("order_no"))//自定义参数
                .putMetadata("money", map.get("price"))//自定义参数
                .addPaymentMethodType("card")
                .setReceiptEmail(map.get("email"))//通知这个邮箱
                .build();//还有很多参数 自己看中文文档去
        PaymentIntent intent = PaymentIntent.create(createParams);
        CreatePaymentResponse paymentResponse = new CreatePaymentResponse(intent.getClientSecret());
        return gson.toJson(paymentResponse);
    }

4.webhook挂钩回调
首先你要在stripe找到开发者下面webhook 配置你的回调地址
我这里已经加过了还是给你们添加端点。看图二
保存后点击去里面有个**签名点击显示复制回调要用到。
在这里插入图片描述

	//控制层 回调不用返回 能走得通就是成功
	@ResponseBody
    @RequestMapping(value = {"/stripe_events"}, method = RequestMethod.POST)
    public void stripe_events(HttpServletRequest request, HttpServletResponse response) {
        service.stripe_events(request,response);
    }
    //service
    public void stripe_events(HttpServletRequest request, HttpServletResponse response) {
        try {
            String endpointSecret = "whsec_xxxgx92OjXdBf1lc2c";//webhook秘钥签名
            InputStream inputStream = request.getInputStream();
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024*4];
            int n = 0;
            while (-1 != (n = inputStream.read(buffer))) {
                output.write(buffer, 0, n);
            }
            byte[] bytes = output.toByteArray();
            String payload = new String(bytes, "UTF-8");
            String sigHeader = request.getHeader("Stripe-Signature");
            Event event = Webhook.constructEvent(payload, sigHeader, endpointSecret);//验签,并获取事件
            PaymentIntent intent = (PaymentIntent) event
                    .getDataObjectDeserializer()
                    .getObject()
                    .get();
            switch(event.getType()) {
                case "payment_intent.created"://创建订单 这里事件就是图二选着的事件
                    break;
                case "payment_intent.canceled"://取消订单
                    break;
                case "payment_intent.succeeded"://支付成功
                    if(intent.getStatus().equals("succeeded")) {
                        Map<String,String> metaData = intent.getMetadata();//自定义传入的参数
                        String order_id = metaData.get("order_id");//自定义订单号
                        /*********** 根据订单号从数据库中找到订单,并将状态置为成功 *********/
                    }
                    break;
                case "payment_intent.payment_failed"://支付失败
                    System.out.println("Failed: " + intent.getId());
                    break;
                default:
                    break;
            }
        } catch (Exception e) {
            System.out.println("stripe异步通知(webhook事件)"+e);
        }
    }

stripe 我也是头次接触也不太懂,错了还望大家指出错误。

最后讲讲:遇到的bug
1.stripe 需要安全支付,就是如果你用域名或者发布到线上,必须是https否则报错调不起来当时我也找了半天。无赖把改成http改成https,在配置完https安全证书的访问一直访问不了,也不是访问不行,讲域名和证书不匹配,我又找半天,心态爆炸。最后发现是sdn多配置 了点东西,比如 xxx.cn,被解析成 xxx.cn.tw.com这样,把这个删掉就ok。
2.回调那一块犯了个不小心错误:我是找错了回调事件,如果配置了多个回调地址,别的回调地址也会走你的回调地址,所以当时还以为自定义的参数会变,当场懵逼,最后发现找错事件 害。

版权声明:本文为qq_36837143原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36837143/article/details/109623509

智能推荐

人脸识别之疲劳检测(二)阈值法、KNN分类和K-means聚类

Table of Contents 1、均值法 2、中值法 3、KNN 4、K-means 结合上一节在获得人眼特征点后需要对睁眼闭眼状态做出判断,方法的选择需要经验结合公平的评价方法,使用大量测试集得到不同方法下的精确度并做出比较: 1、均值法 50帧睁眼数据取均值,得到不同阈值下精确度。 2、中值法 50帧睁眼数据取中值,得到不同阈值下精确度。 3、KNN KNN是一种ML常用分类算法,通过测...

CodeForce Tic-Tac-Toe

Two bears are playing tic-tac-toe via mail. It's boring for them to play usual tic-tac-toe game, so they are a playing modified version of this game. Here are its rules. The game is played on the foll...

Python雾里看花-抽象类ABC (abstract base class)

首先认识模块 abc,python中没有提供抽象类与抽象方法,然而提供了内置模块abc来模拟实现抽象类,例如提供泛映射类型的抽象类 abc.MutableMapping 继承abc.MutableMapping构造一个泛映射类型(类似python中的dict) 当然继承abc.Mapping 也可以,毕竟MutableMapping是其子类 dict是python中典型的映射类型数据结构,其接口的...

python 文件操作

2, with open (‘xx.txt’,‘w’,encoding=‘utf-8’) as f: f.write(‘文件内容或对象’)...

【Python基础】使用统计函数绘制简单图形

机器学习算法与自然语言处理出品 @公众号原创专栏作者 冯夏冲 学校 | 哈工大SCIR实验室在读博士生 2.1 函数bar 用于绘制柱状图 2.2 函数barh 用于绘制条形图 2.3 函数hist 用于绘制直方图 直方图与柱状图的区别 函数pie 用于绘制饼图 2.5 函数polor 用于绘制极线图 极线图是在极坐标系上绘出的一种图。在极坐标系中,要确定一个点,需要指明这个点距原点的角...

猜你喜欢

css:顶部按钮固定,上面内容滑动

这种需求我们平时见到很多的,实现方法也多的参差不齐,下面我说一种简单的。如图: 可以看到只有红线部分滚动,底下按钮是固定的。 代码...

环形公路堵车概率模型(含详细解析)

文章目录 基础理论 代码实现 图形分析 基础理论 路面上有n辆车,以不同的速度向前行驶, 模拟堵车问题。 有以下假设: 假设某辆车的当前速度是v。 若前方可见范围内没车,则它在下一秒的车速提高到v+1,直到达到规定的最高限速。 若前方有车,前车的距离为d,且d < v,则它下 一秒的车速降低到d-1 。 每辆车会以概率p随机减速v-1。、 代码实现 图形分析 图形中颜色越重的地方,说明很多车...

JavaScript事件处理的例题

知道的越多,所不知道的越多。如果带给你帮助,点赞支持一下。 JavaScript事件处理的例题 1、表单验证 2、验证数字输入 3、利用document对象的bgColor属性改变背景色,添加鼠标悬停事件 4.附加题(选做) 1、表单验证 要求:用户名不少于2位,并且用户名第一个字符需为字母! 密码长度必须在6~15之间。 2、验证数字输入 如果输入的值 x 不是数字或者小于 1 或者大于 10,...

arduino操作光照传感器BH1750(数字型,I2C接口)

BH1750传感器,用于检测环境光光照强度。 BH1750FVI是日本罗姆(ROHM)半导体生产的数字式环境光传感IC。其主要特性有: I2C数字接口,支持速率最大400Kbps 输出量为光照度(Illuminance) 测量范围1~65535 lux,分辨率最小到1lux 低功耗(Power down)功能 屏蔽50/60Hz市电频率引起的光照变化干扰 支持两个I2C地址,通过ADDR引脚选择 ...

10.31 数组算法学习-冒泡、选择、二分法

  冒泡排序:   冒泡排序 https://blog.csdn.net/kelinfeng16/article/details/84034386 原文地址:https://github.com/hustcc/JS-Sorting-Algorithm/blob/master/2.selectionSort.md 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重...