Stripe

前言

现在越来越多民众喜欢透过网路付款,在网路付款中很重要的环节就是需要进行线上刷卡,提到网路付款和刷卡就和金流脱不了关系,听起来需要非常复杂的工作? 我们需要什麽具备什麽技能或知识才能实践它?
Stripe为提供个人或公司在网际网路上接受付款服务的支付服务提供商,其包含了在网上接受付款所需的技术、避免信用卡诈骗技术及银行基础设施.也在币值的和付款的方式也提供多元的方法,如:支付宝,PayPal还有一些有得没有.此外,大家熟悉的Uber,Instagram和亚马逊也是仰赖它的服务.题外话,Stripe在2014年时有提供比特币进行交易,不过在2018年时暂停服务了,不过公司近期好像有打算回头支援虚拟货币的动作.
20岁创业,30岁身价百亿
2021年三月,市场估值上看950亿美元

Stripe基本使用

超棒的Stripe api文件

在呼叫任何api时,请记得把Secret key的值encode64後,,并用以下值:Basic {{Token}},带到Header的Authorization里
https://ithelp.ithome.com.tw/upload/images/20211206/20144476g1mg3Z0OGi.jpg

Customer

可以透过此api建立一个客户资讯
api url:https://api.stripe.com/v1/customers method:POST
注意事项:无必填项目 不过建议填写一些资本的资讯,例如:email name description,若未来如果有需要联络时,会比较方便

Product

可以透过此api建立一个产品项目
api url:https://api.stripe.com/v1/products method:POST
注意事项:name 必填 description 个人建议填一下

Price

可以透过此api建立一个基於Product的价格(方案)
api url:https://api.stripe.com/v1/prices method:POST
注意事项:currency unit_amount product 必填,unit_amount的单位是小数点後两位,description个人建议可以填一下,可以增加可读性
如果是一次性的付款 填完金额,币别就可以不用在填写其他资讯了,不过如果想做周期性付款的方案,就必须填写recurring.interval
recurring.interval 可以选频率种类,包含了:day,week,month or year
recurring.interval_count:配合 interval 使用 可以达到每x周的用法,在不填写的情况下预设值为1,不过建议还是完整的填写

上面的逻辑是,先建产品名称再建立价格资讯和产品绑在一起 But Why ??????
一个产品底下有多种价格种类 可以做不同的方案,例如:Netflix 方案基本:270,标准:330,高级:390 或是 年缴费用<月缴费用*12 之类的状况

Quotes

step 1:Create Quotes

是建立一笔报价单的草稿,并非正式给客户的报价单
api url:https://api.stripe.com/v1/quotes method:POST
建立时无必填栏位,但建议 customer,line_items[0][price],line_items[0][quantity]在这个阶段就填好,否则无法执行finalize. 如果真的没填,还是可以再透过update的api处理(如果有填price,不填写quantity时,quantity预设值为 1)
在一个 Quotes 里,如果想要有两笔 price 就用 line_items[1][price],line_items[1][quantity]

  • Quotes建立限制
    information_source: 需要注意的是不能使用周期不一样的 interval 制成一个quotes,如:week+month.此外,一次性付款+interval 是可以的

step 2:finalize Quotes

制作报价单的初稿,通常是跟客户讨价还价完後,确定制成报价单才执行它
api url:https://api.stripe.com/v1/quotes/:id/finalize method:POST

step 2.5:download Quotes pdf

下载报价单pdf档,如果还没finalize无法执行这步,此步骤并非必要执行的项目,如果想省略下载pdf寄给客户的流程,可以直接执行step 3,以系统面来说并不会有任何问题
为了寄出PDF给客户,确认报价单的内容,透过这个api下载pdf档
api url:https://files.stripe.com/v1/quotes/:id/pdf method:GET

  • 如果是用 postman测试时 记得用 save file

step 3:Accept Quotes

双方确认报价单内容,通常是客户确认完 step 2.5 的档案才执行它,执行後如果这笔Quotes有包含interval时则会建立一个subscription和invoices(状态为Scheduled),否则只会建立invoices(状态是Draft)
api url:https://api.stripe.com/v1/quotes/:id/accept method:POST

一次性付款流程

Invoice

invoice 是付款通知,会包含厂商名称,商品清单及应付款项,在执行完finalize invoice後会产生请对方付款的网址hosted_invoice_url和pdf档invoice_pdf,分别是付款连结和付款通知的pdf档
invoice 和 receipt是什麽?

step 1:finalize invoice

原本到此步骤为执行前invoice的状态还是Draft,此步骤表示对invoice进行确认,状态变为Open
api url:https://api.stripe.com/v1/invoice/:id/finalize method:POST

执行完後,状态会从Draft变成Open,会建立一个payment_intent(状态是Incomplete)并回传一些重要的资讯
1.payment_intent:为新建立payment_intent的id
2.hosted_invoice_url:付款连结,打开连结会开启网页,内容如下图所示
https://ithelp.ithome.com.tw/upload/images/20211203/20144476QrznFGpe0N.png
3.invoice_pdf:invoice的pdf档案,档案内容如下图所示(pdf内也会包含hosted_invoice_url的付款连结)
https://ithelp.ithome.com.tw/upload/images/20211203/20144476SFNILqNVz4.png

step 2:查询payment_intent和制作表单

payment_intent里面都包含和付款相关的资讯,如金额,币别,invoice的id以及很重要的client_secret
api url:https://api.stripe.com/v1/payment_intents/:id method:GET
payment_intent会有client_secret,可以将它的值贴到以下为官网范例中的CLIENT_SECRET

import {Elements} from '@stripe/react-stripe-js';
import {loadStripe} from '@stripe/stripe-js';

// Make sure to call `loadStripe` outside of a component’s render to avoid
// recreating the `Stripe` object on every render.
const stripePromise = loadStripe('pk_test_51IVSdRAD0tKSURJ2p8ZQSOGoNcPMXBlUyAdvh13E1AIQyHbw9MSDW3FmKwTN6TN0VjtL96lntmlV6MmQTSLfcQQJ00jEHp49QD');

function App() {
  const options = {
    // passing the client secret obtained from the server
    clientSecret: '{{CLIENT_SECRET}}',
  };

  return (
    <Elements stripe={stripePromise} options={options}>
      <CheckoutForm />
    </Elements>
  );
};

可以看官网范例做一个内嵌付款资讯的表单

  • 容易误会的事项
    stripePromise里面的虽然是Publishable key的内容,但clientSecret并非Secret key,如果使用它表单一辈子都跑不出来(js也会显示clientSecret错误的讯息)
    clientSecret的format皆为pi_xxx_secret_xxx,我产生的参考范例:pi_3JuppIAD0tKSURJ20SAVeTP1_secret_o4nmDAzqusFG4NkwUE9paEVvH
    https://ithelp.ithome.com.tw/upload/images/20211203/20144476hXtjjqFu4b.jpg

随便做了一个爆干丑的表单,不过主要想呈现的是可以把付款表单嵌到自己的网页上进行付款,不一定要另开一个Stripe的分页进行付款(前端安装:yarn add @stripe/react-stripe-js @stripe/stripe-js)
https://ithelp.ithome.com.tw/upload/images/20211203/20144476yZYIAHh3VT.png

  • 测试信用卡卡号
    No authentication (default U.S. card): 4242 4242 4242 4242.(个人都使用这个)
    Authentication required: 4000 0027 6000 3184(不太确定使用场合跟时机)

step 3:receipt(收据,发票)

付款完成後会产生receipt,通常会把这份档案给客户,表示我司有收到对方的付款,也方便会计(内部)作业
api url:https://api.stripe.com/v1/payment_intents/:id method:GET
里面的 receipt_url开启後,下载收据後的pdf内容如下
https://ithelp.ithome.com.tw/upload/images/20211203/20144476P4wLimPkO3.png

订阅介绍

Subscription

subscription 是基於quotes建立的订阅,在Accept Quotes执行後产生,在第一次付款之後,在未来会依照周期规则重复循环的使用第一次付款的信用卡进行自动刷卡

订阅流程付款

step 1:finalize invoice

此步骤表示对invoice进行确认,在Accept Quotes执行成功後,依照流程的话这边的status状态为scheduled,把滑鼠移过去会显示:This draft invoice was generated by a subscription. It can be edited until it's automatically finalized in 1 hour.表示可以摆个一小时左右等待系统帮我们执行,不过也可以手动执行,执行完成後状态会变为Open,在网页上显示Payment will be retried in 1 hour
api url:https://api.stripe.com/v1/invoice/:id/finalize method:POST
https://ithelp.ithome.com.tw/upload/images/20211203/201444766659QyBxnp.png
再过一小时後状态会从变为Retrying,会变成Payment failed,Payment will be retried in 5 days,不过仍然可以付款(再五天继续不付钱又变成Payment will be retried in 4 days,没试过继续不付款会怎样)
https://ithelp.ithome.com.tw/upload/images/20211203/20144476JVgUKE9QOJ.png

执行完後,会从Scheduled变成Open,会建立一个payment_intent(状态是Incomplete)并回传一些重要的资讯
1.payment_intent:为新建立payment_intent的id
2.hosted_invoice_url:付款连结,打开连结会开启网页,内容如下图所示
https://ithelp.ithome.com.tw/upload/images/20211203/20144476UAzm0yZswn.png
4.3.invoice_pdf:invoice的pdf档案,档案内容如下图所示(pdf内也会包含hosted_invoice_url的付款连结)
https://ithelp.ithome.com.tw/upload/images/20211203/20144476KRuj0vciK5.png

step 2:查询payment_intent和制作表单

payment_intent里面都包含和付款相关的资讯,如金额,币别,invoice的id以及很重要的client_secret
api url:https://api.stripe.com/v1/payment_intents/:id method:GET
payment_intent会有client_secret,可以将它的值贴到以下为官网范例中的CLIENT_SECRET

import {Elements} from '@stripe/react-stripe-js';
import {loadStripe} from '@stripe/stripe-js';

// Make sure to call `loadStripe` outside of a component’s render to avoid
// recreating the `Stripe` object on every render.
const stripePromise = loadStripe('pk_test_51IVSdRAD0tKSURJ2p8ZQSOGoNcPMXBlUyAdvh13E1AIQyHbw9MSDW3FmKwTN6TN0VjtL96lntmlV6MmQTSLfcQQJ00jEHp49QD');

function App() {
  const options = {
    // passing the client secret obtained from the server
    clientSecret: '{{CLIENT_SECRET}}',
  };

  return (
    <Elements stripe={stripePromise} options={options}>
      <CheckoutForm />
    </Elements>
  );
};

可以看官网范例做一个内嵌付款资讯的表单

  • 容易误会的事项
    stripePromise里面的虽然是Publishable key的内容,但clientSecret并非Secret key,如果使用它表单一辈子都跑不出来(js也会显示clientSecret错误的讯息)
    clientSecret的format皆为pi_xxx_secret_xxx,我产生的参考范例:pi_3JuppIAD0tKSURJ20SAVeTP1_secret_o4nmDAzqusFG4NkwUE9paEVvH
    https://ithelp.ithome.com.tw/upload/images/20211203/20144476xQoNIsn5D9.jpg

随便做了一个爆干丑的表单,不过主要想呈现的是可以把付款表单嵌到自己的网页上进行付款,不一定要另开一个Stripe的分页进行付款(前端安装:yarn add @stripe/react-stripe-js @stripe/stripe-js)
https://ithelp.ithome.com.tw/upload/images/20211203/2014447671Adv76k6Q.png

  • 测试信用卡卡号
    No authentication (default U.S. card): 4242 4242 4242 4242.(个人都使用这个)
    Authentication required: 4000 0027 6000 3184(不太确定使用场合跟时机)

step 3:receipt(收据,发票)

付款完成後会产生receipt,通常会把这份档案给客户,表示我司有收到对方的付款,也方便会计(内部)作业
api url:https://api.stripe.com/v1/payment_intents/:id method:GET
找到里面的receipt_url就会有连结可以下载pdf档案
https://ithelp.ithome.com.tw/upload/images/20211203/201444760BU69EWVvD.png

结语

线上付款虽然方便,不过付款前还是要再次确认金额和品项还有币值.


<<:  【Vue】Vue Devtools 开发工具

>>:  Python爬虫,真的很简单

【後转前要多久】# Day26 JS - 事件、监听

e - event HTML <body> <input type="b...

Day07:【TypeScript 学起来】原始资料型别 Primitive Types

Q: 软件工程师最常说的谎言有哪些? A: //TODO 连假结束 wednesday blue ...

【DAY 18】数据分析没有这麽难,透过 Microsoft Power BI ,让你事半功倍!

哈罗大家好~ 在这个数据为王的时代,很多人都知道数据的重要性,但除了数据蒐集,视觉化呈现并进行分析,...

新新新手阅读 Angular 文件 - Component - ngOnDestroy(1) - Day25

本文内容 本文内容为阅读有关 Angular 的元件的 lifecycle hook - ngOnD...

Day 11 - Subscribe 订阅盘中报价资讯(Futures)

本篇重点 订阅期货盘中tick资讯 订阅期货盘中bidask资讯 官方说明文件:https://si...