Stripe注册流程是什么?Stripe国际支付简介及API对接
文章目录
(资料图)
一、了解Stripe支付二、Stripe注册流程三、Stripe API 特点3.1 Apikey3.2 Idempotent Requests 幂等请求3.3 两种付款方式 四、Stripe 支付核心API4.1 Token4.2 Customer4.3 Card4.4 Source4.5 charge4.6 PaymentIntents4.7 PaymentMethod 五、完整Stripe支付代码
一、了解Stripe支付
最近公司正在做一个国际版APP,涉及到海外支付,调研过Paypal、Skrill、BrainTree、Stripe(可参考海外移动支付方案对比),最终 选择了Stripe支付。Stripe特点如下:
收费规则简单透明,手续费就是收取订单总额的3.4 % + HK$2.35。没有月费、开户费、退款手续费,撤销付款费用手续费HK$85.00Stripe支持135+种货币创建付款(目前不支持中国大陆,只支持中国香港)。Stripe还支持其他付款方式,包括ACH信用转账、ACH借记转账、支付宝、Android Pay、Apple Pay、Bancontact、Bitcoin(比特币)、银行卡(Visa,Mastercard,American Express,Discover,Diners Club,JCB等)、Giropay、iDEAL、SEPA、SOFORT、微信支付等来自全球的热门支付方式。Stripe的开发文档清晰简单,集成友好。提供了IOS、Android的SDK,以及对各种语言的支持。
二、Stripe注册流程
和其他国内支付平台一样,首先需要注册Stripe账户。官网注册链接: 在注册页面中填写邮箱信息完成注册即可。进入了DashBoard,可以看到账户还没有被激活,在激活账户之前先验证电子邮件,然后点击激活账号:
账户激活的时候,因为Stripe不支持中国,所以要用支持的国家注册商户,而你恰恰有这个国家的公司信息、银行卡信息之类的,最后一定要发送手机号码验证,要不然在调用API的时候,会报错,提示你没有完善信息。 我这是公司账号,使用公司在香港信息完成了账户激活。可以看到,出现了API 密钥的内容提示,说明我们完成激活,可以开始玩了。
三、Stripe API 特点
3.1 Apikey
Stripe.apiKey = "sk_test_*****************************";
Stripe API使用API密钥来验证请求,在控制台有两种密钥:测试密钥和生产密钥
在调用每个API的时候,要在每个请求中发送此密钥。
3.2 Idempotent Requests 幂等请求
Stripe API 支持Idempotentcy 来安全的重试请求,而不会意外的执行两次相同的操作。幂等性密钥是客户端生成的唯一值,服务器使用该值来识别同一个请求的重试。
3.3 两种付款方式
Stripe 现在提供两种方式的支付API:Payment Methods API 和 Tokens and SourcesAPIs
两者的区别在于Sources是通过status属性描述事物状态的。这意味着每个Source对象必须先转换为可收费状态才能用于付款,相反Payment Methods 是无状态的,依赖于PaymentIntent对象来表示给定支付的交易状态
如图所示,官方建议迁移到Payment Methods API
四、Stripe 支付核心API
Stripe 本身提供了大而全的东西,其核心的API,包括以下模块: 官网给出了一个支付过程的说明,只需要六步就能完成操作,收集Card信息、创建用户、支付、计划、订阅,完成支付,基本上第四部和第五步,我们不会使用。简单易上手。
我们自身业务关心的是Payment这块,所以核心的API也是集中在Payment这块儿说明,包括Token、Card、Customer、PaymentIntent、PaymentMethod、Source、Charge等,我们都使用创建API来挨个来了解一下。
4.1 Token
Token是Stripe用来客户收集敏感卡或者银行账户信息的过程,当用户填写了银行卡的卡号、过期年月、CVC等信息后,Stripe会生成过一个包含这些信息的Token,这样在传输过程中,确保没有敏感的卡数据和我们自己的服务器交互,降低客户真实信息丢失率。我们自身的服务器,取到token,进行支付即可 。
Token不能多次存储和使用,要存储卡的信息供以后使用,可以创建用户。将卡的信息添加给用户。
#创建Token Stripe.apiKey = "sk_test_your_key"; MaptokenParams = new HashMap(); MapcardParams = new HashMap(); cardParams.put("number", "4242424242424242"); cardParams.put("exp_month", 8); cardParams.put("exp_year", 2020); cardParams.put("cvc", "314"); tokenParams.put("card", cardParams); Token.create(tokenParams);
4.2 Customer
Customer 允许执行与同一客户关联的重复费用,并跟踪多个费用。可以创建、删除和更新客户。也可以检索单个客户以及所有客户的列表。
MapcustomerParams = new HashMap(); customerParams.put("description", "Customer for chao"); customerParams.put("source", "tok_**********"); Customer c = null; try { c = Customer.create(customerParams); System.out.println(c); } catch (StripeException e) { e.printStackTrace(); }
4.3 Card
可以在一个客户上存储多张卡,向该客户收费。
Stripe.apiKey = "your_apikey"; Customer customer = Customer.retrieve("cus_FfoCbKMV4SJ7je"); Mapparams = new HashMap(); params.put("source", "tok_mastercard"); customer.getSources().create(params);
4.4 Source
Source代表接收各种付款方式,代表客户的支付工具。创建收费的时候,可以附加到客户。
Stripe.apiKey = "sk_test_1crNbJbtW30srR0CxeJHtFNF003Cuo2uSJ";MapsourceParams = new HashMap();sourceParams.put("type", "ach_credit_transfer");sourceParams.put("currency", "usd");MapownerParams = new HashMap();ownerParams.put("email", "jenny.rosen@example.com");sourceParams.put("owner", ownerParams);Source.create(sourceParams);
4.5 charge
对信用卡或者借记卡收费时,创建一个charge对象
Stripe.apiKey = "your_apikey";MapchargeParams = new HashMap();chargeParams.put("amount", 2000);chargeParams.put("currency", "hkd");chargeParams.put("description", "Charge for jenny.rosen@example.com");chargeParams.put("source", "tok_mastercard");Charge.create(chargeParams);
4.6 PaymentIntents
PaymentIntents 将指导你完成从客户处收款的过程,官方建议为系统中的每一个订单或者客户创建一个PaymentIntent。
Stripe.apiKey = "your_alikey";MappaymentIntentParams = new HashMap<>();paymentIntentParams.put("amount", 2000);paymentIntentParams.put("currency", "hkd");ArrayListpaymentMethodTypes = new ArrayList<>();paymentMethodTypes.add("card");paymentIntentParams.put("payment_method_types", paymentMethodTypes);PaymentIntent.create(paymentIntentParams);
4.7 PaymentMethod
PaymentMethod代表客户的支付工具,和PaymentIntents一起使用 以收取付款或保存到客户对象。
Stripe.apiKey = "your_alikey";MappaymentmethodParams = new HashMap();paymentmethodParams.put("type", "card");MapcardParams = new HashMap();cardParams.put("number", "4242424242424242");cardParams.put("exp_month", 8);cardParams.put("exp_year", 2020);cardParams.put("cvc", "314");paymentmethodParams.put("card", cardParams);PaymentMethod.create(paymentmethodParams);
五、完整Stripe支付代码
网上看了一大圈关于Stripe的支付,资料很少,要么是年代久远,要么是代码不完整。希望我的代码对你有所用。
我们的前端业务流程如图所示: 选择的支付方式是Token and Source API,控制器类StripeController 代码如下:
@Controller@RequestMapping(value = "/stripe")public class StripeController { @Resource private StripePayService stripePayService; private static Logger logger = LoggerFactory.getLogger(StripeController.class); /** * 获取用户卡片列表 * * @return */ @RequestMapping(value = "/getCardList", method = RequestMethod.POST) @ResponseBody public Response getCardList(@RequestBody @Valid StripePayRequestVO stripePayRequestVO, BindingResult result) { return stripePayService.getCardList(stripePayRequestVO); } /** * 添加用户卡片 * @return */ @RequestMapping(value = "/addCard", method = RequestMethod.POST) @ResponseBody public Response addCard(@RequestBody @Valid StripePayRequestVO stripePayRequestVO, BindingResult result) { logger.debug("购买套餐请求参数 {} = ", JsonUtil.INSTANCE.toJson(stripePayRequestVO)); return stripePayService.addCard(stripePayRequestVO); } /** * 发起支付 * @return */ @RequestMapping(value = "/charge", method = RequestMethod.POST) @ResponseBody public Response aliPay(@RequestBody @Valid StripePayRequestVO stripePayRequestVO, BindingResult result) { return stripePayService.charge(stripePayRequestVO); }}
DAO层
public interface StripePayService { Response charge(StripePayRequestVO stripePayRequestVO); Response getCardList(StripePayRequestVO stripePayRequestVO); Response addCard(StripePayRequestVO stripePayRequestVO);}
实现层
@Service("stripePayService")public class StripePayServiceImpl implements StripePayService { @Override public Response charge(StripePayRequestVO request) { try { Stripe.apiKey = "your_apikey"; Mapparams = new HashMap(); params.put("userId", request.getUserId()); User user = this.get("from User where id=:userId", params); if (null == user) { return failure(ResponseEnum.USER_NOT_FOUND_FAILURE); } //无stripe账号,直接返回 if (user.getStripeChargeId() == null || "".equals(user.getStripeChargeId())) { return success(ResponseEnum.USER_BAD_REQUEST_FAILURE); } // 业务订单数据,此处省略 //发起支付 MappayParams = new HashMap<>(); payParams.put("amount", product.getPrice().intValue()); payParams.put("currency", "usd"); payParams.put("description", "Charge for " + user.getEmail()); payParams.put("customer", user.getStripeChargeId()); Charge charge = Charge.create(payParams); //charge 支付是同步通知 if ("succeeded".equals(charge.getStatus())) { //交易成功后,需要更新我们的订单表,修改业务参数,此处省略 return success(ResponseEnum.PAY_SUCCESS.getMessage()); } else { return failure(ResponseEnum.PAY_ALIPAY_FAILURE); } } catch (StripeException e) { e.printStackTrace(); } return failure(ResponseEnum.EVENT_SYSTEM_ERROR_FAILURE); } @Override public Response getCardList(StripePayRequestVO stripePayRequestVO) { Stripe.apiKey = "your_alipay"; Mapparams = new HashMap(); params.put("userId", stripePayRequestVO.getUserId()); User user = this.get("from User where id=:userId", params); if (null == user) { return failure(ResponseEnum.USER_NOT_FOUND_FAILURE); } List list = new ArrayList(); //如果没有这个stripe用户,就返回列表为空 try { MapcardParams = new HashMap(); cardParams.put("limit", 1); cardParams.put("object", "card"); ListcardList = Customer.retrieve(user.getStripeChargeId()).getSources().list(cardParams).getData(); StripeCardVO stripeCardVO = new StripeCardVO(); for (PaymentSource p : cardList) { Card c = (Card) p; stripeCardVO.setLast4(c.getLast4()); stripeCardVO.setExpYear(c.getExpYear()); stripeCardVO.setExpMonth(c.getExpMonth()); list.add(stripeCardVO); } return success(list); } catch (StripeException e) { e.printStackTrace(); } } @Override public Response addCard(StripePayRequestVO stripePayRequestVO) { Stripe.apiKey = "your_alipay"; Mapparams = new HashMap(); params.put("userId", stripePayRequestVO.getUserId()); User user = this.get("from User where id=:userId", params); if (null == user) { return failure(ResponseEnum.USER_NOT_FOUND_FAILURE); } //如果没有这个stripe用户,添加卡片就是创建用户 if (user.getStripeChargeId() == null || "".equals(user.getStripeChargeId())) { MapcustomerParams = new HashMap(); customerParams.put("description", "Customer for test"); customerParams.put("source", stripePayRequestVO.getToken()); Customer c = null; try { c = Customer.create(customerParams); user.setStripeChargeId(c.getId()); this.saveOrUpdate(user); success("添加成功"); } catch (StripeException e) { e.printStackTrace(); } } else { // 有这个用户,就是修改他的唯一一张默认卡 try { Customer c = Customer.retrieve(user.getStripeChargeId()); System.out.println("给客户修改默认卡号"); MaptokenParam = new HashMap(); tokenParam.put("source", stripePayRequestVO.getToken()); c.update(tokenParam); return success("修改成功"); } catch (StripeException e) { System.out.println("异常了"); System.out.println(e); e.printStackTrace(); } } return failure(ResponseEnum.EVENT_SYSTEM_ERROR_FAILURE); }
标签:
相关推荐:
最新新闻:
- 全球观热点:CRC校验原理是什么?如何校验?CRC校验原理与步骤
- 当前快报:为什么说“鲶鱼效应”是一种负激励?鲶鱼效应详情
- Stripe注册流程是什么?Stripe国际支付简介及API对接
- 微软的共享源码公共语言基础——mono|焦点热闻
- 3D打印火箭第二次发射失败_全球快看点
- 环球通讯!多屏方便 桌面显示器支架89元
- 休闲骑游必备 喜德盛平把公路1599元:今日热搜
- 【聚看点】入手立省80元!储侠1TB固态仅需269元
- 全球今日讯!通用汽车开发ChatGPT一样的行驶助理
- 天天热门:《杀手4》开发有点停滞 IO互动当前重心是007游戏
- EA或将公布一个新的竞速游戏
- 【世界播资讯】有钱了再还!ChatGPT老板向硅谷银行受害公司伸援手
- 任天堂仍对Switch充满信心 称其销售强劲
- 《塞尔达传说:王国之泪》不会在PAX East展出
- 当前焦点!《最后的生还者:重制版》PC版为外包 质量令人担忧
- 【全球报资讯】盖乌斯·尤利乌斯·恺撒
- 富春染织(605189):第三届第五次监事会会议决议,12项议案获通过
- 全球看点:配置拉满 华硕ROG冰刃7双屏游戏本上架:顶配首发价54999元
- 《巫师3》4.02版本已上线 修正稳定和优化性能 全球报道
- 谷歌翻译网页版升级 可直接翻译图片中文字
- 环球微资讯!鲁豫成功预测杨紫琼拿奥斯卡奖:去年表现很出色
- 前沿资讯!就看iPhone 15了?苹果市值或将再次站上3万亿美元
- 每日热点:带领四百万人逃离大城市的“北欧李子柒”
- 《巫师3》更新即将上线 PC端大约2GB
- 绝对值,小喆全铝海景房机箱仅需 169 元
- 吉利汽车购置税减半限时 最高补3万元-天天最新
- 国产CPU旗舰笔记本发布:3.3GHz 性能提升4倍|环球关注
- 环球新动态:绝对值,京东京造 JDBook Pro 14寸商务本仅售 1699 元
- 《流浪地球》系列电影连映:69元起
- 哈尔滨“冰雪文化之都”建设谋突破
- ROG冰刃7双屏游戏本上架 起售价29999元
- 传索尼已于去年10月收购CDPR 外媒:可信度不高!
- 郁郁葱葱!Xbox无线手柄“青森绿”开箱图赏
- 分析师:微软收购动视暴雪会伤害索尼 但不会影响玩家:最新
- 3USB充电口!米家智能魔方插排低至49元
- 锐龙 9 7945HX 发布,16 核心,比 i9-13950HX 快 10%
- 全球微资讯!小米13 Ultra确定4月初发布 5月海外开售
- 森歌不锈钢定制家居,畅想自定义人生
- 环球报道:因传感器问题,iPhone 17 Pro 才有屏下 Face ID
- 玩家在《生化危机8:村庄》VR版里戏耍夫人:打完就跑-全球新视野
- 平台解谜游戏《逃离梦境》今日登陆Steam-动态焦点
- 恐怖游戏《无尽轮回》新实机演示:逃离一战无尽梦魇
- 《游灵》正式版现已登陆PC与主机平台,Steam购买更享8折优惠
- 每日速读!苹果大招在 2026 年,iPhone18 Pro上将实现真全面屏
- 27英寸显示器抄底价!仅需699元HKC显示器带回家
- 今亮点!跌穿了!英特尔A380显卡仅799元
- 当前速递!卡普空发行商特卖 《生化8》《怪猎崛起》半价
- 湾区绿金对话|星展银行首席可持续发展官Helge Muenkel:中国可持续金融发展三大关键:政策确定性、创新工具及利弊权衡 世界时快讯
- 动态焦点:魔灵召唤克罗尼柯战记开局人物推荐,克罗尼柯战记初始胎五推荐
- 《生化危机4:重制版》泄露版视频 性感艾达王大战里昂:每日时讯
- 动态焦点:魔灵召唤克罗尼柯战记开局人物推荐,克罗尼柯战记初始胎五推荐
- 《生化危机4:重制版》泄露版视频 性感艾达王大战里昂:每日时讯
- 今日热议:真白菜价了!2TB NVMe M.2固态硬盘低至649元
- 2022年度市场关注,雷柏键盘第一,鼠标第二-全球看热讯
- 盐城移动与启明星辰签署战略合作协议 共绘信息安全行业全景视图_天天速递
- 北京用户专享!LG 27英寸4K显示器1799元入手_全球资讯
- 热讯:Redmi Note 12 4G真机图曝光、后置三摄、5000mAh电池
- 小红书被曝后台私自删除照片 被系统拦截
- 全球要闻:日本第二位诺奖获得者大江健三郎离世 终年88岁
- 第一人称冒险游戏《Shodot》Steam页面上线 支持简中
- 《胜利女神 妮姬》画师分享新作品 采用AI辅助更性感_焦点观察
- 全球即时:森林之子望远镜在哪获得?森林之子望远镜位置图
- 单元测试和集成测试之间的差别在哪里?单元测试和集成测试之间的差别有多大?
- 世界今日报丨最安全、最有效的磁盘分区软件——AcronisSelect
- 怎么防御CC攻击?分布式拒绝服务攻击的危害及防御方法
- 【易语言】验证码短信接口对接DEMO示例:天天精选
- 44岁的郭保新第六次担任“0”号指挥员 曾因压力过大夜夜失眠-天天看热讯
- 全球新资讯:苹果古典音乐月底上线
- 智·行两会 | 智水华夏,共绘安澜,新华三以数智创新赋能水利事业高质量发展
- 惠普笔记本散热器价格是多少?60-100元之间有什么区别?
- 佳能相机5d与6d有什么区别?佳能相机如何使用?
- 【联想服务站】笔记本预装的Windows8系统改装教程
- 怎样制作视频?NERO多媒体软件使用方法介绍 天天新动态
- 暗黑3白金币怎么获取?暗黑3白金币获取方法
- 前沿资讯!如何解决图片转PDF的问题?JPG图片转换成PDF文件的方法
- python中的"%s"用法 你了解多少? 世界看点
- JUL是什么?java原生日志框架JUL源码 环球报资讯
- 快看点丨WEB常见Bug MyEclipse/Eclipse调式技巧详解
- 支付宝小程序是什么?支付宝小程序有哪些特色?-今日看点
- 香奈儿越涨价越好卖 其杭州大厦店2002年全年销售额达18亿
- 公然抄袭《老头环》?开发商回应:Epic商城买的模型|环球百事通
- 尼尔·德鲁克曼:贝拉·拉姆齐还将《最后生还者》第二季出演艾莉 天天亮点
- 【世界新要闻】日服Switch会员新试玩:《FIFA 23传奇版》 3月20日开启
- 每日信息:孕妈妈蕾哈娜献唱《黑豹2》主题曲:表演气场十分强大
- 全球短讯!《守望先锋》副总裁将于3月底离开暴雪