近几天因为公司的项目中遇到了需要支持给国外本土支付提供支持,经过调研了市面上几款的产品后选择了stripe支付
由于资料比较少没有太多讨论,慢慢查看官方文档以下是我对官方文档梳理和对接过程中的一些经验和理解记录了下来
关于Stripe
Stripe是一家提供给个人或公司在网上接受付款服务的科技公司 ,支持可以在无需开设商家账户的情况下在网上接受付款。Stripe在付款后两天内等候期检查交易所涉及的公司,以防止潜在的诈骗,然后Stripe便会把资金发送到收款人的户口
Stripe的优势
- Stripe接受135类型的货币
- Stripe对所有交易都采用统一费率,这使它透明且易于理解,统一费率是2.9%+ $ 0.30
- api接口便于对接调试,只需要少量代码就可以完成功能
理解
Stripe的支付和操作大部分都掌握在我们自己手里,使用stripe提供的Checkout可以安全的收集和标记卡信息,创建嵌入式支付表单,将表单提交到服务端,然后调用他提供的api就可以完成支付 整个过程非常简洁方便
Stipe不像支付宝和微信支付那样,他不存在订单的概念,只管支付本笔交易操作
但他的设计流程都是大同小异大致情况:
- 客户端通过stripe提供的Checkout插件收集付款所需要的信息
- 将信息传递给服务端,服务端收集整理后请求stripe提供的所需api
- 在stripe官方配置页配置各事件的webhook
- 先验签 通过后根据不同事件先回应stripe 然后在处理我们自己的业务操作
Stripe集成
- 在官方https://stripe.com/申请注册账户 按照官方的提示操作成功页面
2.支付方式采用信用卡支付
当我们遇到一个新东西的时候,仔细的查看官方文档往往可以解决我们80%的问题 ,stripe文档写的还是很有好的,当你注册后,查看官方文档里面给的案列测试代码的时候,所有的变量都是关于你自身的真实数据。
信用卡支付方式
第一步直接在页面里面添加一个form表单,其中一些属性是变量值
<form action="serverApi" method="POST">
<script
src="https://checkout.stripe.com/checkout.js" class="stripe-button"
data-key="pk_test_k7wYXLcKJqGM75Ag25Kiwx"
data-amount="500"
data-name="UVIC Limited"
data-description="Example charge"
data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
data-locale="auto"
data-currency="gbp">
</script>
成功嵌入后我们点击提交会看到这个弹框页面 卡号和信息在官方都有测试信息
第二步直接请求付款接口 (下面是我写的node案例的部分代码)
async createCharges() {
const {ctx} = this
const orderId = ctx.query.order_id
ctx.tryThrow(!orderId, 'orderId miss')
const orderResult = await this.service.emall.order.getOrderDetail(orderId)
ctx.tryThrow(!orderResult, 'order not exist')
const data = _.pick(ctx.request.body, ['stripeToken', 'stripeEmail'])
const result = await stripe(this.config.stripe.key).charges.create({
amount: (orderResult.SKUs[0].price) * 100,
currency: 'gbp',
source: data.stripeToken,
receipt_email: this.config.stripe.receiptEmail,
metadata: {order_id: orderId}
})
ctx.body = result
}
返回的信息有很多每个字段的描述都有详细介绍,当然我们对于其中几个属性还是要重点提出
amount代表的金额是以分为单位
metadata是可以存储一些其他对你以后有用的信息(在hook的时候会把数据在返回给你)敏感信息(个人身份信息,卡详细信 息等不要存储)
status表示的状态
第三步在官网设置事件的webhook https://dashboard.stripe.com/account/webhooks
使用webhooks作用:
- 付款成功后,可以修改业务信息
- 付款失败时向客户发送电子邮件或信息告知
- 支付转账时记录会计分录
- 或者任何修改账户的操作都会告知
注意测试的时候点击View test data查看测试数据不然设置的信息都是正式版
webhook事件有两种选择一种是监听所有事件然后我们自己根据处理一种是可以选择监听
在上一步中我们调用了stripe.charges.create()函数,我们需要监听和charges等一些有关事件
不管stripe.charges.create()函数调用的成功与否都会返回给我们事件,当然我们也不能
盲目的接收,首先要先验证这个请求是不是stripe官方发出还是第三方发出的
验证方式官方也是提供了两种一种官方用法一种是自定义 (当然推荐官方的 省时 省力 省心就对了)
下面的代码片段也是我写的测试案例的代码操作 详细查看官网:https://stripe.com/docs/webhooks/signatures
return async function (ctx, next) {
let sig = ctx.request.header['stripe-signature']
try {
stripe(ctx.app.config.stripe.key).webhooks.constructEvent(Buffer.from(ctx.request.rawBody), sig, ctx.app.config.stripe.endpointSecret)
const eventType = ctx.request.body.type
if (knownEvents[eventType]) {
return knownEvents[eventType](ctx, next)
}
else {
return next()
}
}
catch (err) {
ctx.status = 400
return next()
}
}
stripe.webhooks.constructEvent(req.body, sig, endpointSecret);
注意点:
- 调用这个函数成功就验签通过失败就不通过不需要返回处理
- req.body一定要是原始数据请求体
当我们验证成功之后会收到charge.succeeded事件进行下一步处理,
stripe会调用我们预留的url把信息传递回来 我们来大致看一下body返回的东西
还有一些头或者其他信息可以自己测试的时候打印看下:
我们要先仔细观察下他事件返回的数据结构 其中metadata里面就是我们调用的时候添加的附加信息
在这里会返回很重要的一个属性是type事件类型,我们可以根据这个值做相应处理处理我们自己的业务