
Google Pay 一次跑通的落地路径google-api-php-client 接入全记录【免费下载链接】google-api-php-clientA PHP client library for accessing Google APIs项目地址: https://gitcode.com/gh_mirrors/go/google-api-php-client周五下午产品催着要一份支付回调的演示接的活是PHP 后端发起 Google Pay 请求并接住可信的回调通知。我走的是 google-api-php-client 接入这篇是整个过程的实际记录配置、请求、回调校验都能照抄。为什么用 google-api-php-client 接 Google Pay手写 curl 的话服务账号 JWT 签名、access token 获取、401 过期后重试全要自己做而且每样都容易做错。这个库把这一段包掉了Google\Client负责整条认证链路服务端的资源类来自 composer.json 里声明的google/apiclient-services依赖按 API 生成好方法签名你只管调用。还有两点值得一提认证相关代码集中在 src/ 下服务账号、OAuth、ID token 校验各自独立成模块出问题好定位docs/auth.md 里列了各认证方式的入口底层是 Guzzle Monolog日志和 HTTP 行为跟 PHP 生态其他项目一致不用学一套新的用法。对后端本来就是 PHP 的团队来说这是接入成本最低的路线。服务账号密钥的两种放法与首个请求跑通先装依赖composer require google/apiclient一条命令装好。⚠️ 注意当前 composer.json 要求 PHP ≥ 8.1老环境先升级再动手。密钥是第一道坎。库里官方给了两种放法examples/service-account.php 里两种都有$client new Google\Client(); // 方式一直接指向密钥文件 $client-setAuthConfig(/var/credentials/service-account.json); // 方式二走环境变量 应用默认凭证生产推荐 $client-useApplicationDefaultCredentials();方式一开发期省事生产建议配GOOGLE_APPLICATION_CREDENTIALS环境变量密钥文件放在 web 目录之外避免被直接下载。然后发第一个请求$client-setApplicationName(Order_Service); $client-addScope(https://www.googleapis.com/auth/payments); $service new Google\Service\Payments($client); $order new Google\Service\Payments\Order(); $order-setMerchantReferenceId(ORDER_ . uniqid()); $response $service-orders-create($order);订单号用前缀加uniqid()生成后面查问题能全链路对得上。几个容易踩的点⚠️ 对应的 API 没在 Cloud 控制台启用时会直接 403跟密钥文件没关系排查时别往错方向走Google\Service\Payments这类名字对应 apiclient-services 生成的服务类换别的 API 就换对应的类名请求出错时结构化明细在Google\Service\Exception::getErrors()里参考 src/Service/Exception.php里面每个错误项带 domain、reason、location定位比看 message 快。怎么让回调签名与幂等真正可信回调校验是 demo 和生产差距最大的地方。先澄清一点库里的Google\AccessToken\Verify见 src/AccessToken/Verify.php负责校验 ID token即 JWT 签名内部走 Google 官方公钥端点支付回调的签名校验业界通行做法是拿共享密钥做 HMAC这部分要自己写$body json_decode(file_get_contents(php://input), true); $sign hash_hmac(sha256, $body[raw], $_ENV[PAYMENT_WEBHOOK_SECRET]); // 恒定时间比较防时序攻击 if (!hash_equals($sign, $_SERVER[HTTP_X_SIGNATURE])) { http_response_code(401); exit; }⚠️hash_equals是恒定时间比较别图省事换成签名有被时序猜解的风险。校验只是前半后半是幂等。网络抖动会让同一条通知重复到达用唯一索引把重复拦下来$id $body[notificationId]; $ok $pdo-prepare(INSERT IGNORE INTO notified(id) VALUES (?)) -execute([$id]); if ($ok) { updateOrderStatus($body[orderId], $body[status]); }第一次插入成功才走业务重复通知被唯一索引挡住直接丢弃别用内存变量去重进程一重启就失效。网络层面的抖动库里有现成的重试组件 src/Task/Runner.php按条件重发请求不用自己手写循环。支付错误排查与上线前自查清单生产上最常碰到的三类状态码错误码常见原因处理办法401凭证过期或文件不可读查文件权限必要时重建密钥403API 未启用或 scope 不足控制台启用 API核对 scope500请求参数错误打开日志看具体字段日志直接给客户端挂 Monolog 实例库本身已声明 monolog 依赖$client-setLogger(new \Monolog\Logger(google-api)); try { $service-orders-create($order); } catch (\Google\Service\Exception $e) { error_log(json_encode($e-getErrors())); }getErrors()拿到的是 Google 返回的结构化明细排障时比单行 message 有用得多。上线前我会过一遍这个清单密钥文件在 web 目录外权限收敛到服务账号可读回调做过重放测试同一条通知发两次第二次无任何副作用401 和 403 在告警里能区分开两者指向不同的处理人5xx 有重试策略瞬时故障不会直接打爆页面跑通之后的下一步可以看看批量请求 src/Http/Batch.php 和媒体文件上传 src/Http/MediaFileUpload.php对账单导出、发票附件这些需求不换技术栈就能扩出来。【免费下载链接】google-api-php-clientA PHP client library for accessing Google APIs项目地址: https://gitcode.com/gh_mirrors/go/google-api-php-client创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考