分享 申请以及集成 Stripe 的 Alipay 支付方案

martin91 · 2015年03月29日 · 最后由 martin91 回复于 2019年06月10日 · 17277 次阅读
本帖已被管理员设置为精华贴

        最近在一个项目需要支持人民币支付,并且客户要求希望能够收完款后的结算是用美元,所以就想到了去年 Stripe 宣布已经跟支付宝达成合作意向,所以经过一番咨询跟集成,终于把 Stripe 集成进来,并且启用了支付宝收款。这篇文章介绍功能申请以及集成的完整过程。

功能申请

  1. 注册 Stripe 账号
  2. 加入 beta 用户组,电子邮箱跟注册的 Stripe 账号保持一致;
  3. 联系 Stripe 员工
    发送邮件到 [email protected],声明你需要在你的 Stripe 账号中启用 Alipay 的支付功能,并且提供你的 Stripe 账号。然后,等待回复就是,一般当天都能收到回复的。

集成

0. 时序图 (可结合后边代码一起理解)

Stripe 支付时序图

1. 引入 stripe.js 以及初始化脚本

假设支付页面上有个开始支付按钮,其 html 代码为:

<button id='pay'>支付</button>

请在 html 代码里合适的地方(比如<body>标签的底部)加载 stripe.js:

<script src="https://checkout.stripe.com/checkout.js"></script>

在脚本中初始化 stripe.js,并且注册支付按钮的事件监听函数:

$(function(){
  var stripeHandler = StripeCheckout.configure({
    key: 'pk_test_xxxxxxxxxxxxxxxxxxxxx',  // 可以查看 https://dashboard.stripe.com/account/apikeys
    image: 'https://placehold.it/200x200',    // 显示在支付对话框的图片,可自己指定
    alipay: true,                             // 启用支付宝支付
    token: function(token){                   // 用户填写完资料并且 Stripe 校验成功后的回调函数
      // 此时应该提交 token.id 到后台,比如 http://example.com/orders/1?stripeToken={token.id}
    }
  })

  $('#pay').click(function(){
    stripeHandler.open({
      name: 'Business Name',                  // 收款方或商家名称,比如 Beansmile
      description: "商品描述内容",              // 待支付商品的描述
      amount: 50 * 100,                       // 支付金额,单位是“分”
      opened: function(){                     // 支付对话框打开后的回调函数
        // Do something
      }
    });
  });
});

2. 通过 token 请求收款

服务器端是 Ruby on Rails 实现,所以在 Gemfile 中引入 Stripe 官方的 Ruby SDK(具体配置方法请自行查阅其 README):

# Gemfile
# Stripe Ruby bindings
# https://github.com/stripe/stripe-ruby
gem "stripe", "~> 1.20.1"

然后在 Controller action 中添加处理逻辑:

# app/controllers/orders_controller.rb
class OrdersController < ApplicationController
  # PUT /orders/:id
  #
  # params:
  #   id: 订单的 id
  #   stripeToken: 客户端完成支付流程,在脚本的回调函数中会得到 `token.id`,
  #                将其上传到 `stripeToken` 参数,服务器端用此 token 请求收款
  #
  def pay
    response = Stripe::Charge.create  amount: order.amount_in_cents,
                                      currency: 'USD',
                                      source: params[:stripeToken],
                                      description: "订单描述"
    order.update_attribute :state, :paid
    redirect_to order
  rescue Stripe::InvalidRequestError => error
    flash[:error] = "由于#{error.message},支付失败!"
    redirect_to order
  end
end

3. 效果预览

Stripe 支付流程演示

其他

  1. 关于 Stripe 的沙盒机制
    Stripe 为每个账号都提供了两组 keys,一组 key 用于用于 live 环境,另一组是 test 环境,后者即是沙盒环境,而针对支付宝的沙盒,可用任意合法的邮箱账号进行测试,但验证码是固定的 123456,而身份证后 5 位是固定的 12345;
  2. 在功能申请过程中,一定要记得完成步骤 3——联系 Stripe 开通 Alipay 支付功能。否则,会在支付的时候出现错误,错误信息示例为:There is no token with ID atok_xxxxxxxxxxxxxxxxxxxxxxxx
  3. 实际开发中,请结合考虑用 stripe 提供的 webhook 处理支付状态变迁;
  4. 此支付机制中,付款人可用人民币支付,但是 Stripe 会用美元跟商家(收款方)进行结算;
  5. 我总结了工作中集成过的其他几款支付网关,横向对比了各家的异同点,有兴趣的请戳:讲稿网:Payment Gateways

参考链接

  1. Stripe: Alipay 首页
  2. Stripe: Alipay FAQ
  3. Stripe: Alipay 集成文档
  4. Stripe: Checkout,这部分的文档虽然没有提及 Alipay, 但是针对 Alipay 的集成,依旧适用。

好文果断第一个顶! 大神请带上我~

#1 楼 @justin 大神别闹。。。

但是正式使用的话,还是得需要支持国家的银行和 ID 信息的吧?

我就是来同前面三位大神合影的!

我就是来同前面 4 位大神合影的!

#3 楼 @Tony612 正式的话,支付宝会负责下发短信验证,另外有个框就是填身份证后 5 位的,这个应该是要求付款人在支付宝那边有完成实名认证的。

前面五位大神好!

8 楼 已删除

#6 楼 @Martin91 嗯,我是说收款。用户付款是全球都可以的,但收款的账号是限制的。之前看过注册什么的,好像如果要收款的话,必须有支持国家的银行卡和 ID,比如美国的银行卡和身份证。也就是说,现在中国的商家想用他来收款应该是不行的

#5 楼 @hooooopo 炮哥你别这样 😢

#9 楼 @Tony612 对的,目前不支持中国。而且 Stripe + Alipyay 的目标是那些想要赚中国人的钱的外国用户。Stripe 目前支持的国家或者地区列表还是比较有限的,不支持中国大陆,支持香港。

#9 楼 @Tony612 貌似可以通过开美国公司,然后开美国公司帐号。这样理论上是不需要 SSN 的。

#12 楼 @chunlea 不过开个美国公司并不是那么容易的吧,特别是一些小的业务

#14 楼 @Tony612 LLC 不难的。

ps,我是来和诸位大神合影的。

#15 楼 @leondu 你在暗示 Beansmile 美国分公司吗?

#14 楼 @Tony612 研究过一段时间,开 LLC 是不困难的。维护费用一年需要 100 多美金,不过可能需要每年都去上报一些文件,还有每个州的法律不一样,内华达州貌似不错。正在筹备回头看看开个玩……用来收钱。

#17 楼 @chunlea 成功了要分享一下啊。

#19 楼 @Rei 一定一定,忙完毕设就去研究下。

#17 楼 @chunlea 内华达州是最简单的,当然如果你在美国有人帮手,那就更简单了。

#16 楼 @Martin91 其实去年就已经有了 ;-)

关注过 stripe,关键是中国公司不能收款,直接就 pass 了。

感谢你那个 PPT,让我认识一个新的支付网关:pin payments。试用中。

更新:貌似 pin payments 只支持澳大利亚的商户……

#22 楼 @tylerlong Stripe 目前不支持中国商户。Pin Payment 是澳大利亚的服务商,我只注册过普通账号用于开发测试,线上的收款账号是澳大利亚客户提供的,所以我也不确定是不是真的只支持澳大利亚的商户。

#23 楼 @Martin91 Pin Payment 应该是只支持澳大利亚,因为填资料的地方很多东西都是澳大利亚特有的,比如你的公司在澳大利亚哪个省……

如果商户在中国,又想国内收款,又想国际首款,貌似支付网关唯有 Paypal 可用。

#24 楼 @tylerlong 嗯嗯,感谢提供信息!

看来各位都有支付经验,我想在项目中加支付宝收款,目前什么方法好呢

#26 楼 @sde007 如果商家是在中国,那就还是按照支付宝的文档集成吧。Stripe + Alipay 只适合那些想要赚中国人的钱的外国企业。商业主体得是国外的。

@Martin91 嗯,在国内的。支付宝好像没有 ruby 的集成,看来得自己弄了

我们目前使用的是 https://pingxx.com/

#29 楼 @greatghoul 这套是偏 mobile 的吧,如果是传统 web 站点,不一定适合。anyway,只是猜测,没用过。

看来这还是个往国外转移资金的好办法。cool

34 楼 已删除

使用场景:海外公司运营微信公众号,想要使用支付功能是不是也可以考虑这种方案?

#35 楼 @wikimo 理论上可以,就是不知道会不会遭到封杀。

保持队形!

我是和前面 36 位大神合影的。(PS:没有去重,呵呵)

不错,学习了。感觉应该场景比较多。

stripe 现在是不支持支付宝了吗?https://stripe.com/docs/alipay#using-alipay-in-checkout "Alipay in Checkout is not currently available to new users."

gaotongfei 回复

应该是,已经好久没关注了

感觉楼主这个方式挺麻烦的,可以试试 BufPay.com 支付平台,个人开发者微信支付宝即时到账收款接口,不用审核备案,接入也非常简单。

bufpay 回复

请慎重打广告!

@Rei @huacnlee @jasl 43 楼这位哥算不算打广告,上个月才注册的号,在社区回帖都是清一色的回答?

这个文章的背景过去已经比较久,内容可能已经和现在的方案相去甚远,就此结帖,不再讨论。内容仅供参考!

martin91 关闭了讨论。 06月10日 14:23
需要 登录 后方可回复, 如果你还没有账号请 注册新账号