使用google checkout经验

本文分享了作者研究Google Checkout API的心得与经验,详细介绍了从注册测试账号、嵌入网站到设置回调函数的全过程,并提供了调试建议。

花了几天研究了下google checkout的api实现,这里说下心得经验。

1。什么是google checkout

是google推出的一个支付网关,类似国内的快钱等,目前支持visa,mastercard,以及还有两张不认识的卡。。。付钱时必须要求是其中之一的卡。想体验的可以去picasa或者gmail升级空间就可以看到google的支付方式是他自己的checkout了。另外,这个东东目前不支持中国的(RMB)消费。

基本流程:
买家到网上用信用卡支付
卖家的google checkout单子中会出现一条新记录,此时order stage为reviewing,2分钟左右不能chargeable,此时google在验证信用卡是否可用
状态改变,chargeable,
卖家点击收钱(charge),状态变为charging
收钱成功,状态变为charged
卖家发货(如果需要的话,我是没用到。。)


2。使用前期准备

首先要注册两个帐号,在一个用于支付,一个用于收钱(即商家),这两个都用做测试用。

 http://sandbox.google.com/checkout 创建付钱的帐号

 http://sandbox.google.com/checkout/sell/ 创建商家收钱的帐号

注,以上这都是在sandbox中做的,即测试用的,如果正式使用需要到checkbox.google.com上注册,帐号可以不一样。

创建过程详见http://code.google.com/intl/zh-CN/apis/checkout/developer/index.html#integration_overview



之后,在http://code.google.com/intl/zh-CN/apis/checkout/samplecode.html 下载示例代码。然后可正式开工。

 

3。嵌入网站

以PHP为例,可以参考demo下的cartdemo.php。主要是通过2个类来实现购物车,即GoogleCart和GoogleItem。然后通过$cart把item加进去,最后用cart类的成员函数CheckoutButtonCode()输出按钮,给用户提交。当然这是最简单的方法。

这里遇到个问题,在提交之后到google的订单确认页面,但是因为用的中文的关系,在这个页面显示出乱码。由此发现似乎是google示例代码中的一点小错误。在gc_XMLBuilder类中,使用htmlentities函数时,由于默认第3个参数charset 是ISO-8859-1的,造成UTF-8的中文处理有错,主要是货物名以及货物的描述。直接给函数加上第3个参数,值为UTF-8即可,或者多加个类的属性也可,具体看自己的程序了。

另外使用时还可以随意点,并不是必须用他的html代码,提交给google只需cart和signature参数即可

cart=base64_encode($cart->GetXML())

signature=base64_encode($cart->CalcHmacSha1($cart->GetXML())

之后就可以提交付钱了。付钱就用之前申请的测试付钱帐号。

 

4。回调函数api

那如何知道用户已经付钱,订单状况呢。google有设置回调函数的url。具体位置在,登录到卖家的帐号(sandbox.google.com/checkout),点选my sales->settings->Integration。有个API callback URL,写上你用来处理google返回信息的url地址。下面有对应的选项可以设,注意,如果选上Require notification acknowledgments to specify the serial number of the notification. 那么sample code里需要自己加上serial-number,在googleresponse类,加上个属性serial_number(这个值要自己设),并且在190行左右,具体:

  1. <?php
  2.     function SendAck($die=true) {
  3.       $this->SendOKStatus();     
  4.       $acknowledgment = "<?xml version=/"1.0/" encoding=/"UTF-8/"?>" .
  5.                         "<notification-acknowledgment xmlns=/"" .
  6.                         $this->schema_url . "/" serial-number=/"".$this->serial_number."/" />";
  7.       $this->log->LogResponse($acknowledgment);
  8.       if($die) {
  9.         die($acknowledgment);   
  10.       } else {
  11.         echo $acknowledgment;   
  12.       }
  13.     }
  14. ?>

否则会报握手失败。调试信息可以在my sales->tools>Integration Console看到。最容易出的错就是目录的写权限,因为要写日志,以及serial-number问题(settings中构选的话)。

之后还有包括发送订单状态更改(不用每次卖家都进到google用手点),直接收钱。需要Post数据到google,值得注意的是google示例代码中用的是curl,需要系统上带有curl7以上的版本。

### 实现 Stripe Checkout 订阅支付功能 Stripe Checkout 是一种高效、灵活的订阅支付解决方案,允许开发者通过预构建的支付页面快速集成订阅功能。它支持多种支付方式(如信用卡、Apple Pay、Google Pay),并能够处理复杂的订阅计划管理[^1]。 #### 创建 Stripe 产品和价格 在实现订阅支付前,首先需要定义产品的基本信息及定价策略。Stripe 提供了 API 来创建产品(Product)及其对应的价格(Price)。例如: ```java import com.stripe.model.Product; import com.stripe.model.Price; import com.stripe.param.ProductCreateParams; import com.stripe.param.PriceCreateParams; // 创建产品 ProductCreateParams productParams = ProductCreateParams.builder() .setName("Premium Membership") .setType(ProductCreateParams.Type.SERVICE) .build(); Product product = Product.create(productParams); // 创建价格 PriceCreateParams priceParams = PriceCreateParams.builder() .setProduct(product.getId()) .setUnitAmount(999L) // 单位为分,即 $9.99 .setCurrency("usd") .setRecurring(PriceCreateParams.Recurring.builder() .setInterval(PriceCreateParams.Recurring.Interval.MONTH) .build()) .build(); Price price = Price.create(priceParams); ``` #### 创建 Checkout Session Stripe Checkout 的核心是 `Checkout Session`,它负责将用户引导至 Stripe 提供的支付页面,并完成订阅流程。开发者可以通过后端生成一个会话 ID,并将其传递给前端以启动支付流程。 ```java import com.stripe.model.checkout.Session; import com.stripe.param.checkout.SessionCreateParams; SessionCreateParams params = SessionCreateParams.builder() .setMode(SessionCreateParams.Mode.SUBSCRIPTION) .setSuccessUrl("https://example.com/success") .setCancelUrl("https://example.com/cancel") .addLineItem(SessionCreateParams.LineItem.builder() .setPrice(price.getId()) .setQuantity(1L) .build()) .build(); Session session = Session.create(params); ``` 前端部分可以使用 Stripe.js 初始化支付流程: ```html <script src="https://js.stripe.com/v3/"></script> <script> const stripe = Stripe('pk_test_XXXXXXXXXXXXXX'); stripe.redirectToCheckout({ sessionId: 'cs_test_XXXXXXXXXXXXXXXX' }).then(function (result) { // 处理错误 }); </script> ``` #### 处理订阅事件与 Webhook 为了实时跟踪订阅状态的变化,Stripe 提供了 Webhook 功能。开发者可以监听诸如付款成功、失败、取消等事件,并据此更新系统中的订阅状态。 ```java @PostMapping("/webhook") public ResponseEntity<String> handleWebhook(@RequestBody String payload, @RequestHeader("Stripe-Signature") String sigHeader) { Event event; try { event = Webhook.constructEvent(payload, sigHeader, "whsec_XXXXXXXXXXXXXXXX"); } catch (SignatureVerificationException e) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid signature"); } if ("customer.subscription.deleted".equals(event.getType())) { Subscription deletedSub = (Subscription) event.getDataObjectDeserializer().getObject().get(); // 处理订阅取消逻辑 } return ResponseEntity.ok().build(); } ``` #### 管理订阅生命周期 Stripe 支持对订阅进行暂停、恢复、升级或降级等操作。例如,更新订阅的价格计划: ```java import com.stripe.model.Subscription; import com.stripe.param.SubscriptionUpdateParams; SubscriptionUpdateParams updateParams = SubscriptionUpdateParams.builder() .addItem(SubscriptionUpdateParams.Item.builder() .setId(existingItemId) .setPrice(newPriceId) .build()) .build(); Subscription updatedSub = Subscription.retrieve(subscription.getId()).update(updateParams); ``` 此外,Stripe 还支持多币种、多地区计费以及基于用量的订阅模型,适用于全球范围内的 SaaS 和数字内容平台[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值