iOS集成Braintree, 支持credit card, PayPal支付(sandbox环境)

如果客户端只支持Paypal,那么需要import PayPal Mobile SDKs,但在v.zero以后(https://developer.paypal.com/docs/bt-vzero-overview/),可以集成多种支付,不需要分别import各自的SDK,就像是统一了行业标准,对开发者来说是件好事情,而且如果使用drop-in SDK自带的UI,开发起来会很省心,不需要自己写界面,一个底部弹出框包含所有支付内容。所以,趁我还没酒精过量,赶快写下v.zero的工作原理,还有Server和Client联调的demo。

看到官方文档(https://developers.braintreepayments.com/start/overview),首先先讲两个重要的点:1.Client token,2.Payment method nonce

Client token

是服务端通过Braintree的SDK生成的,比如我要用Rails5来开发,服务端,那么我需要的SDK是(gem “braintree”, “~> 2.72.0”),用它来生成token
这三个参数是生成token的依据,当你注册一个新的账户(https://www.braintreepayments.com/en-ca/sandbox)
给下截图,Account->My User->View Authorizations->API Keys->view,注意那三个参数,mark等下server会用到。


Rails配置代码:

记下以后继续,然后客户端会依据这个client token直接和Braintree的服务器通信,所以这是一个认证令牌(These should not be reused; a new client token should be generated for each request that’s sent to Braintree.)而且为了安全,每次客户端和Braintree服务器的直接通信都需要新的token,对应于每一个支付request。就像APNs当中,注册token,然后拿着token直接和apple服务器通信,一个道理,只不过一个是OS级别的,一个是第三方服务,那OS级别的无非是依赖于Apple ID这个统一的账户系统,本质是一样的对吧。

Payment method nonce
直接翻译叫做:支付方法随机数。其实就是一个字符串,代表一次支付方法的调用,然后服务端,获取这个字符串,通过Server的SDK,对Braintree服务器发起新的事务请求
这个东西其实在客户端的callback方法中有,是Braintree服务器直接下发的,我们的服务器不管这个类型。附上解释原理的那张经典图片:

看下overview的文档,图片下的5个steps,讲得很清楚
以上原理,现在到实践

先讲下,信用卡支付吧

好了我们现在简单写个服务器,用Rails5, 这个是崭新的Rails版本,之前这个架构只在Web App的开发中有优势,现在默认继承了gem: rails-api 写JSON接口也是很快的。不信你看,跟我来,5分钟的事情

环境:Ruby-2.3.3, Rails-5.0.1

1. cd到工程目录,rails new braintree_api –api -T, 说明:–api告诉Rails我只要API应用没有界面元素,-T就是不要使用Minitest默认的测试工具,正常情况下会使用RSpec来替代测试,但我这里连model都没有,更没有涉及到数据库,直接在内存中执行,测试就不写了

2. 更新gem file:

完了bundle install

3. touch /app/controllers/concerns/response.rb:

4. application_controller.rb:

5. rails g controller BraintreeAction,

6. touch config/initializers/braintree.rb, 配置文件,写入刚才的三个参数

7. config/routes.rb,代码:

8. 验证是否有效,我这里用httpie,你用curl也行,brew install httpie, rails s 开启服务,另一个终端界面http get :3000/client_token,看图片这是对的情况:

后面的checkout验证需要客户端的配合

所以我们开始写客户端。使用cocoapods,这是Podfile

我这里偷懒了,一次都加完了,照理说是用什么加什么的…… 完了pod install,继续,打开新的xcworkspace,开始配置,都写在VC里面了,demo嘛,给个gist链接吧

https://gist.github.com/anonymous/e0825fd399a57bbc518f5eb9d7c949f1

流程是这样的,先拿client token->show dropin UI->post nonce to server, (还有另外一种是走TokenizationKey,等下讲)注意一点,测试环境的测试账户是固定的,不要自己造,无效!(https://developers.braintreepayments.com/reference/general/testing/ruby),我们就用4111111111111111这张visa卡片吧,nonce是”fake-valid-nonce”作为常量写在客户端,正常情况下应该是result.paymentMethod中的返回结果

打开浏览器,登陆到沙河环境下的Braintree控制台,Documents->Merchant Statement,等下我们支付完成以后刷新这个页面,看看是否有变化,我这里是服务端给出常量交易额度为10美刀,成功以后会看到这样的变化,这是我们想要的结果,现在还没配置完成,先预览下:

再回到服务端,要开启SSL,也就是https,所以我们找到config/environments/production.rb, 开启 config.force_ssl = true,
然后记得推到heroku的线上环境才是有效的,正常情况下我们的本地仓库对应两个远程仓库,一个origin我放在bitbucket上免费私有的git服务,一个直接推送到heroku,我这里假设heroku的本地环境都已经配置好了,不知道的怎么弄google下,很简单的。
cd到工程目录,heroku create,git add -A,git commit -m “init repo”,git push origin master, git push heroku master,部署到线上环境:

看到最后https就是地址,填充到iOS客户端,替代那个URL(https://cryptic-citadel-99786.herokuapp.com,这是我的地址)我们开始测试吧。

等下,貌似还忘记了很重要的一件事情,连接paypal测试账户和braintree沙河环境,看下(https://developer.paypal.com/docs/accept-payments/express-checkout/ec-vzero/get-started/)Credentials这一栏,有点麻烦,我讲下吧。这个是paypal的开发者控制台,首先创建测试用的买家,卖家账户,看图左边Accounts目录下,然后再到My Apps & Credentials目录下,Express Checkout via Braintree SDK – Test Accounts连接Braintree和paypal,回到Accounts目录,打开卖家Profile,看到API Credentials,看到app name里面有braintree的测试账户,说明连接成功:

好了,终于可以开始测试了,有点麻烦对吧,我也是这么认为的,希望以后能再简单点,现在的沙河环境,限制也是非常多的。

输入4111111111111111,过期时间随便选,这里就测试结算-settlement,刷新交易页面,看下43变成53,加了10美刀,成功了,这就是信用卡支付,其实还有其他状态比如settlement_comfirmed,记得测试用例不能随便写,必须是test页面里面的账户。



控制台看到返回的交易事务的ID,当然这些参数可以自定义

以上信用卡支付,再讲PayPal支付

首先分清楚两种支付模式Vault和Checkout(https://developers.braintreepayments.com/guides/paypal/overview/ios/v4#vault-vs.-checkout)我就不翻译了,前者适用于多次支付信息复用,后者一次性支付。

这次我们用TokenizationKey,与Client Token不同,这是一个静态的key,不和自己的Server做交互,直接与Braintree的服务器通信,不支持较早版本的SDK是一个问题(If you’re using our iOS SDK v4 or Android SDK v2, you may also use a tokenization key instead.),但是对于客户端来说更加简单了,想一下其实本质和导入fabric框架是一样的对吧。退一步说,如果还是要走自己的服务器,那么还是client token的流程,服务器的代码看到paypal_checkout这个方法,统一作为Braintree的Transaction处理,正如之前讲的我们的服务端不关心payment_method_nonce的具体类型。可以自己测试下,结果也是可行的。

好了,现在走TokenizationKey的流程,首先我们要一个TokenizationKey,在这里打开braintreegateway->Account-My User->View Authorizations->Tokenization Keys这一栏,没有的创建一个。客户端这边,Podfile 增加

如果之前和我一样偷懒全部导入了,请忽略,完了pod install,
再看(https://developers.braintreepayments.com/guides/paypal/client-side/ios/v4),schema跳转的配置,自定义按钮,打开setupPayPalUI的注释,同时让fetchClientToken失效,我这里就是个左上角绿色的按钮,点击以后验证这个账户,看图:

好吧,这个页面是个大坑,写着按我能跳,其实是不能跳转的,不支持端对端测试,更加细节的调试,必须要有生产环境,
看资料和文档:
http://stackoverflow.com/questions/41261073/how-to-test-paypal-payment-using-braintree-sandbox
https://developers.braintreepayments.com/guides/paypal/testing-go-live/ruby#end-to-end-testing

所以在sandbox环境下,我们最远就是走到这里,沙河环境限制很多,希望以后能更加方便吧,最后那个问题我调试了很久,主要是在应用中没有任何提示……

支付流程看上去复杂,本质上是一系列的安全措施,证明我的服务器是我的服务器,和Braintree的服务器通信,如果是直接通信那么用TokenizationKey更加方便,如果需要走自己的服务,那么client token是有必要的,尽量每次session都更新,但起码每次应用重启的时候更新一次吧。That’s all, thanks



发表评论

电子邮件地址不会被公开。 必填项已用*标注