18910140161

Stripe支付平台对接技术方案

顺晟科技

2021-06-16 10:31:25

1347

我接触过的几个支付管理平台包括Adyen、Braintree、PayPal、Stripe。

相比之前的,感觉Stripe更专业,后台管理功能清晰,操作方便,体验好。

开发文档也很清楚。相比我之前接触的支付平台开发文档,Stripe更容易快速了解其所有的API和功能。API参数和参数描述清晰,返回的数据结构合理,对应的API容易返回对应的对象属性。不像PayPal,返回的结果不好用,夹着各种键值对,结构凌乱。

下面我来记录一下整合Stripe支付平台的过程。

前端SDK集成了: Android、IOS、JS

IOS SDK集成(这里只粗略说明前端,PHP后端会详细说明。

建议用豆荚安装SDK。如果不了解Pods,请到CocoaPods了解更多。

在Pods/Podfile文件下添加以下内容:

目标-C

一个

pod 'Stripe ',' 13.0.0 '

然后终端执行该命令

pod更新

然后根据Stripe IOS相关文档写相关代码

在集成过程中,前端SDK需要一个可发布的密钥,该密钥需要向条带帐户注册,登录到条带管理后台,并从仪表板开发人员-应用编程接口密钥模块页面访问。

条带的应用编程接口密钥包括可发布密钥(公钥)和秘密密钥(私钥)

服务器端编程语言(Professional Hypertext Preprocessor的缩写)

一个

//可发布的密钥近似格式

2

测试环境:PK _ test _ * * * * * * * * * * * * * * * * * * * * * * *

官方环境:PK _ live _ * * * * * * * * * * * * * * * * * * * * *。

//密钥近似格式

测试环境:sk _ test _ * * * * * * * * * * * * * * * * * * * * * * *。

官方环境:sk _ live _ * * * * * * * * * * * * * * * * * * * * * * *。

可发布密钥可以在前端代码中公开,由前端SDK使用。前端输入银行卡信息后,需要用可发布密钥和卡信息生成令牌,并发送给后端。由于我公司的PCI认证还在办理中,用户的卡信息无法直接传输到我们的后端服务器。Stripe的SDK符合PCI规范。我们主要通过Stripe的SDK生成一个令牌。后端可以调用Stripe的API进行加卡或支付。前端生成的带有银行卡信息的令牌只能使用一次,两小时内有效。

密钥相当于有权添加、修改和删除您的秘密帐户的数据。所以这个要严格保密的保存在服务器配置文件里。

安卓SDK集成也简单讲了一下

用Android Studio和IntelliJ安装Stripe Android库也差不多。你不需要克隆回购站或者下载任何文件。只需将以下内容添加到项目build.gradle文件中,该文件位于dependencies部分。

爪哇岛

一个

实现' com . stripe : sstrid-Android :6 . 1 . 2 '

Android的前端代码集成逻辑基本相同。最后,通过用户输入的卡信息和可发布密钥生成令牌并传输到后台。

网站js SDK集成也简单讲了一下

卡元素快速启动

使用我们预先构建的用户界面组件的元素来安全地收集敏感卡的详细信息。

元素是Stripe.js的一部分.首先,在你的页面上包含这个脚本——它应该总是直接从https://js.stripe.com加载:

java描述语言

一个

script src=' https://js . stripe.com/v3/'/script

js SDK和App的集成差别很大。详情请参考stripe.jselements。

但最终前端使用卡信息和可发布密钥生成令牌并发送给后台。

Stripe PHP后台集成详细描述(正在编辑中)

1.安装条带式PHP编写器包

首先说明后台环境:nginx服务器,PHP Laravel5.2,mySql5.6

其次,如果您对Composer包有任何疑问,请到Packagist了解更多。

在PHP项目根目录下composer.json的要求下添加:

stripe/stripe-php': '^6.7.1'

然后执行以下命令:

composer更新-无脚本

安装后,PHP项目的供应商下会有Stripe源代码。在使用代码库之前,有必要简单地阅读以下源代码。看完源代码,你会更了解这个代码库有什么,你需要什么。

2.配置条带应用编程接口业务和异常处理类

在项目中创建一个新的XXStripe.php。本课程涉及相关业务部门

服务器端编程语言(专业超文本预处理器的缩写)环境变量配置。包封/包围(动词包围的简写)

在。包封/包围(动词包围的简写)下配置秘钥,就是前面说到的秘密的保存在服务端的私钥。

服务器端编程语言(专业超文本预处理器的缩写)

;条纹支付

2

STRIPE _ API _ KEY=sk _ test _ * * * * * * * * * * * * * * * * * * * * *

配置服务器端编程语言(专业超文本预处理器的缩写)支付相关配置文件payment.php

服务器端编程语言(专业超文本预处理器的缩写)

?服务器端编程语言(专业超文本预处理器的缩写)

2

返回[

3

' PAYMENT_ENV'=env('PAYMENT_ENV ','沙盒'),

5

braintree'=[

6

商品=env(' BRENTREE _ MERCHANT _ ID ',''),

PUblic KeY '=env(' BRENTREE _ PUBLIC _ KeY ',''),

8

PRIVATE KeY '=env(' BRENTREE _ PRIVATE _ KeY ',''),

9

CESkey '=env(' BRENTREE _ CES _ KEY ','')

10

],

11

12

adyen'=[

13

14

app_name'=env('ADYEN_APP_NAME ',''),

15

username'=env('ADYEN_USERNAME ',''),

16

password'=env('ADYEN_PASSWORD ',''),

17

' env'=env('ADYEN_ENV ',''),

18

' MERCHANT _ ACcount '=env(' ADYEN _ MERCHANT _ ACcount ',''),

19

SHOPPER _ INTERACTION '=env(' ADYEN _ SHAPER _ INTERACTION ',''),

20

],

21

22

payPal'=[

23

user'=env('PAYPAL_USER ',''),

24

password'=env('PAYPAL_PASSWORD ',''),

25

SIGNAL '=env(' PAYPAL _ SIGNAL ',''),

26

new_user'=env('NEW_PAYPAL_USER ',''),

27

NEW _ PASSWORD '=env(' NEW _ PAYPAL _ PASSWORD ',''),

28

' NEW _ SIGNATURE '=env(' NEW _ PAYPAL _ SIGNATURE ',''),

29

],

30

31

条纹'=[

32

API _ KeY '=env(' STREAP _ API _ KEY ',' sk_test_*** '),

33

]

34

];

新建XXStripe类处理条纹应用程序接口类参数及返回结果异常处理。

服务器端编程语言(专业超文本预处理器的缩写)

?服务器端编程语言(专业超文本预处理器的缩写)

2

命名空间应用程序\模块\结账\支付\条带;

3

使用碳\碳;

5

使用条纹\卡片;//这里可以看到可以引入种类各种应用程序接口类,用来下面调用。

6

使用条纹\充电;

使用条带\客户;

8

使用条纹\争议;

9

使用条带\错误\基础;

10

使用条纹\退款;

11

使用条带\源;

12

使用条带\条带;

13

14

XXStripe类

15

{

16

17

public function __construct()

18

{

19

//这里取到上面配置里面的配置的种类的私钥配置,初始化到种类对象里面。

20

$ stripe config=config : get(' payment。stripe’);

21

stripe : setakey($ stripe config[' API _ key ']);

22

//更多相关初始化配置阅读种类源码。

23

//stripe : set account d(');

24

}

25

26

公共函数addCard()

27

{

28

//如果顾客已经创造则直接拿之前存客户id,往这个顾客下面添加卡。

29

if($客户付款){//$客户付款用$user_id去自己的业务库查是否创建过条纹顾客的记录,没有则执行其他逻辑

30

$ customer=customer : retrieve($ customer payment-brain tree _ token);

31

$ card=$ customer-sources-create([' source '=$ token]);

32

} else { //如何没有记录则在种类平台上客户:创建

33

$ customer=customer : create([

34

source'=$token,

35

email'=$email,

36

元数据=[' pat _ customer _ id '=$ customerId,' first name '=$ user-customers _ first name,' last name '=$ user-customers _ last name,' phone'=$phone]

37

]);

38

//添加卡后台拿到返回的$卡对象存到对应业务库

39

$ card=current($ customer-sources-data);

40

}

41

42

//你的业务代码,把种类返回$客户,$卡的觉得有用的对象参数存到对应的业务表里。

43

}

44

45

公共函数setDefaultCard()

46

{

47

//$stripeCustomerId需要根据使用者辩证码查到之前创建用户数存的条状定制

48

//stripeCustomerId大概格式:cus_CvpoGuZa0BnJEz

49

$ customer=customer : retrieve($ stripe customerid);

50

$ customer-default _ source=$ CardD;//$ CardD也是之前存的用户的$卡片列表,用户可能选一张卡来做完默认卡,$ cardId大概格式:卡_ 1cww t1 G5 lmxukzdeazo 0 b2e

51

$ customer-save();

52

return $ customer-default _ source;

53

}

54

55

公共函数删除卡片()

56

{

57

//用$stripeCustomerId查找到种类支付的对应用户

58

$ customer=customer : retrieve($ stripe customerid);

59

//删除用户下对应的银行卡

60

$ customer-sources-retrieve($ CardD)-delete();

61

}

62

63

公共职能工资()

64

{

65

尝试{

66

$ charge=charge : create([

67

金额'=$totalPay*100,

六十八

货币'='美元',

六十九

描述'='示例费用',

70

capture'=false,

71

客户'=$ stripecustomerid,//$ stripecustomerid是以前添加卡时保存的

七十二

Source '=$ cardID。//这个参数可以传递,传递了这个参数就用这个指定的卡进行支付。当卡片被添加时$ cardId也被保存。

73

元数据'=['order_id'=$orderId]

74

]);

75

} catch(\ stripe \ error \ base $ e){//catch stripe的API基本不正常

76

//向用户显示一个非常普通的错误,可能会发送

77

//给自己发邮件

七十八

log : info($ e-getStripeCode());

79

log : info($ e-getMessage());

80

}捕获(异常$e){

81

//发生了别的事情,和Stripe完全无关

82

}

83

}

84

八十五

}

3.使用从前端传输的令牌添加条纹客户或直接支付

User_id和令牌通过前端调用后端API传递。

前端通过Stripe SDK生成的令牌可用于调用任何需要令牌参数的Stripe API,也可用于在Stripe后台创建Customer。使用令牌创建客户将自动向该客户添加与令牌相关联的银行卡信息。创建客户将返回创建的客户标识,可用于未来的长期支付。

所以我这里的待遇是拿到代币后不直接付款,因为这个代币只能用一次,两小时内有效。

用于创建客户,并在该客户下自动添加一张银行卡,以获取返回的客户信息,该信息包含Customer _ idcard _ id等信息,可用于未来的长期支付。

服务器端编程语言(Professional Hypertext Preprocessor的缩写)

一个

公共函数addCard($token,$email,$user_id)

2

{

//如果客户已经创建,直接取之前存储的customer_id,在该客户下增加一张卡。

如果($ customer payment){/$ customer payment使用$user_id检查是否创建了条带客户记录,否则执行逻辑

$ customer=customer : retrieve($ customer payment-brain tree _ token);

$ card=$ customer-sources-create([' source '=$ token]);

}否则{//如果没有记录,则在条带平台上创建客户:

$ customer=customer : create([

source'=$token,

10

email'=$email,

11

元数据'=[' pat pat _ customer _ id '=$ customerId,' first name '=$ user-customers _ first name,' last name '=$ user-customers _ last name,' phone'=$phone]

12

]);

13

//添加卡片背景,获取返回的$card对象,保存到对应的业务库中

14

$ card=current($ customer-sources-data);

15

}

16

17

//您的业务代码,将Stripe返回给$customer、$card的有用对象参数保存在对应的业务表中。

18

}

4.条纹默认卡设置,并删除卡

Strip与Adyen和Braintree支付平台有点不同

Strip就是创建一个客户,创建的客户对应你需要付费的用户。卡可以添加到客户条下或源可以添加到客户下。来源是支付来源,如支付宝、微信、贝宝、微软支付等本地化支付。

则客户下的这些卡和来源中只有一个被设置为默认支付方式,如下图所示

''

因此,当业务方调用支付API时,只需传递Customer_id和支付相关金额币种代码中的一个参数就可以完成支付,因为Stripe上的客户已经设置了默认的支付方式

Braintree和Adyen平台是一张长期有效卡对应的支付令牌,授权卡后即可用于支付。

服务器端编程语言(Professional Hypertext Preprocessor的缩写)

一个

公共函数setDefaultCard($userId,$ cardId)

2

{

//$stripeCustomerId需要根据userId查找之前创建的用户数据库的stripeCustomerId

///stripeCustomerId近似格式:cus_CvpoGuZa0BnJEz

$ customer=customer : retrieve($ stripe customerid);

6

$ customer-default _ source=$ CardD;//$ CardD也是之前存的用户的$卡片列表,用户可能选一张卡来做完默认卡,$ cardId大概格式:卡_ 1cww t1 G5 lmxukzdeazo 0 b2e

$ customer-save();

8

return $ customer-default _ source;

9

}

删除卡

服务器端编程语言(专业超文本预处理器的缩写)

公共函数删除卡($stripeCustomerId,$ cardId)

2

{

3

//用$stripeCustomerId查找到对应用户

$ customer=customer : retrieve($ stripe customerid);

5

//删除用户下对应的银行卡

6

$ customer-sources-retrieve($ CardD)-delete();

}

5.使用种类创建的客户标识支付或者指定客户的某张卡支付

种类的费用类用于支付等应用程序接口调用,下面我们看看使用客户编号付款代码

服务器端编程语言(专业超文本预处理器的缩写)

公共职能工资()

2

{

3

尝试{

$ charge=charge : create([

5

金额=$totalPay*100,

6

货币'='美元,

描述'='示例费用,

8

capture'=false,

9

客户=$stripeCustomerId,//$stripeCustomerId是之前添加卡的时候存的

10

source '=$ cardId,//这个参数可不传,传这个参数就会用这个指定的卡片付款,$ cardId也是添加卡的时候存的,

11

元数据=['order_id'=$orderId]

12

]);

13

}捕获(\ Stripe \ Error \ Base $ e){//捕获种类的应用程序接口基本异常

14

//向用户显示一个非常普通的错误,可能会发送

15

//给自己发邮件

16

日志:信息($ e-GetStripeCode());

17

日志:信息($ e-GetMessage());

18

}捕获(异常$e){

19

//发生了别的事情,和种类完全无关

20

}

21

}

调用种类每个应用程序接口都建议试着接住以为种类的错误信息不会在美国石油学会(美国石油学会)结果中放回,条纹的美国石油学会(美国石油学会)一般只返回成功后的对象,错误信息都是通过异常抛出,更多错误信息了解进入条带应用编程接口错误

6.支付交易捕捉(扣款),发布(放弃扣款),退款(扣款后退款)

从上面付款可以看到参数capture'=false,这个参数主要是支付只授权,不立马扣款,给一个时间段给用户取消订单,这个时间段交易未捕捉,交易取消是不扣手续的,如果直接捕获了,用户取消订单,对业务方会产生额外手续费用。所以我们选择支付动作时只授权,不捕捉。一般是批量捕获一次交易。

捕获代码:

服务器端编程语言(专业超文本预处理器的缩写)

公共函数捕获($transactionId)

2

{

3

//$transactionId是在付款美国石油学会收费:创建的时候返回的费用的id,大概格式:ch_1CWgDWGmkmBuczdEnIVX1PXo

尝试{

5

$ charge=charge : retrieve($ transaction id);

6

$ charge=$ charge-capture();

if($ charge-status==' success '){

8

返回['status'=true,' payment _ type '=payment type : stub,' content '=[' brain tree _ transaction _ id '=$ charge-id],' message '=' Settled Succeed!'];

9

} else {

10

返回['status'=false,' payment _ type '=payment type : stub,' content '=[' brain tree _ transaction _ id '=$ charge-id],' message '=' Settled Failure!'];

11

}

12

}捕获(\异常$e) {

13

return ['status'=false,' payment _ type '=payment type : stub,' content '=[' brain tree _ transaction _ id '=$ transaction id],' message '=$ e-GetMessage()];

14

}

15

}

已发布、退款代码是一样的,这个也是种类跟我之前接触的Adyen、Braintree支付平台不一样的地方。

Adyen平台未扣款交易调用取消()API,扣款后调用的是退款()API

布伦特里平台未扣款交易调用的是void() API,扣款后调用的是退款()API

条纹释放、退款代码如下

服务器端编程语言(专业超文本预处理器的缩写)

公共功能退款($transactionId,$amount,$refundId)

2

{

3

//$transactionId是在付款美国石油学会收费:创建的时候返回的费用的id,大概格式:ch_1CWgDWGmkmBuczdEnIVX1PXo

尝试{

5

$ return=REFUND : create([' charge '=$ TransActionID,' amount'=$amount,' metadata '=[' return _ id '=$ REFUNDID]]);

if($退款-状态=='成功'){

return ['status'=true,' payment _ type '=payment type : strip,' content '=[' stripe _ default _ id '=$ default-id],' message'='退款成功!'];

} else {

return ['status'=false,' payment _ type '=payment type : strip,' content '=[' stripe _ default _ id '=$ default-id],' message '=' default Failure!'];

10

}

11

}捕获(\异常$e) {

12

return ['status'=false,' payment _ type '=payment type : stub,' content '=[' brain tree _ transaction _ id '=$ transaction id],' message '=$ e-GetMessage()];

13

}

14

15

}

有关更多stripapi对象的详细信息,请参考stripapi文档。

对应于客户对象的应用编程接口文档,

对应于收费对象的应用编程接口文档,

应用编程接口文档对应于卡对象,

应用编程接口文档对应于退款对象

7.与交易风险控制相关,接收各种条带状态变更通知并更新到数据库

最后,介绍Stripe的Webhooks

Webhooks主要类似于Adyen的通知,通知我们的服务器用户和事务的所有事件状态变化,我们在收到通知的时候会处理不同的情况。

比如Stripe检测到某笔交易是欺诈性的订单时,会通知我们订单状态和信息,我们知道风险控制后就可以进行交易了,后期已经被风险控制规则控制了。

Webhooks配置需要将业务服务器回调utl添加到条带仪表板中的开发人员-Webhooks。

然后,从服务回调url获取通知数据,并将有用的数据存储在服务数据库中。并且可以对相应的特殊类型进行业务逻辑处理。

这样,通过通知数据,您可以轻松地从通知数据中查询任何交易状态更改和客户状态更改。

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航