Day 23 - WooCommerce: 建立信用卡付款订单 (上)

图 23-1
图 23-1: 设定页面

昨天已经完成了永丰金流信用卡收款 API 所需要的设定选项页面,并填入 Shop No 及四组 Hash key,启用沙盒模式之後,就要来开始建立信用卡付款的 WooCommerce 订单罗!

图 23-2
图 23-2: 储存设定

改一下付款方式的标题,顺便测试一下储存。确认设定值储存成功後,开始写付款的程序。

处理付款

还记得 Day 20 建立付款闸道的文章吗?里头提到的 Payment Gateway API 有一个方法 (method) 堪称重点中的重点,它就是 process_payment。用法可以参考文件传送门

这个方法在 WooCommerce 中被执行於:

[...]/woocommerce/includes/class-wc-checkout.php

档案内容如下图。

图 23-3
图 23-3: process_over_payment (method)

从 WooCommerce 的核心档案 class-wc-checkout.php 中,上图 第 19 行 可以看到,经过处理後取得结果後,再进行转址。

当顾客在您的商店结帐页按下结帐按纽,接下来 process_payment 这个方法就会被执行。因此在这里面写要和金流串接的相关程序码来处理付款。

图 23-4
图 23-4: process_payment (method)

在 Day 20 时我们建立的程序范例包含了这一段。

第 10 行 使用 wc_get_order 函式取得 WC_Order 类别的实例。
第 13 行 购买了,我们先预扣这个订单内的商品库存。
第 16 行 购买了,所以要清空购物车,以免让顾客误以为结帐流程没走完。
第 19-21 行 这个类别方法的制式回传格式,是一个阵列,包含了 result 及 redirect 两个栏位。以个这范例来看,会转址到感谢页面 (thank-you page)

接下来要开始导入 Sinopac PHP SDK 来帮助我们建立订单。

导入 Sinopac PHP SDK

在这个流程中,笔者会将Day 15 使用 Pure PHP 建立购物网站一文的范例程序码直接复制过来,做一点点小修改。

实例化 QPay 类别

图 23-5
图 23-5: helper.php

设计一个专门实例化的帮助函式来实例化 QPay 类别。考量到另外一种付款方式「虚拟帐号」ATM 付款也是采用同样的设定选项,因此拉出来放在 helper.php。

第 17 行 在设定页面中的 Shop No。
第 21-24 行 在设定页面中的四个 Hash key 栏位。
第 27 行 在设定页面中的沙盒模式选项。
第 28 行 在设定页面中,沙盒模式使用的 Shop No。
第 32-35 行 在设定页面中,沙盒模式使用的四个 Hash key 栏位。

这样只要在这个函式的参数注入继承 WC_Payment_Gateway 的实例,就可以自动取得实例化的 QPay。

改写 process_payment

图 23-6
图 23-6: process_payment (method)

第 9 行 取得 QPay 实例。
第 13-14 行 取得商品名称。订单中可能有多笔,取第一笔当代表就好。
第 17-23 行 组成要给永丰金流收款 API 的讯息内文结构。
第 27 行 送出建立信用卡订单的请求到给永丰 API。
第 28 行 分析永丰 API 的回覆。
第 30-32 行 有错误直接丢出 Exception 没关系,WooCommerce 会补捉它并在 AJAX 跑完後显示红色错误讯息在页面上。
第 34-42 行 永丰 API 给我们成功的回覆,先预扣库存、清空购物车,接着转址到刷卡页面。
第 44 行 会走到这一行代表 API 回覆错误讯息,存 log,准备侦错。
第 59-80 行 分析讯息回覆,取得刷卡介面的网址。

流程总结

改写 process_payment第 22 行,我们要建立一个接收永丰金流收款平台 POST 回来的讯息值,取得 PayToken 才能知道此笔是刷卡成功还是失败。

明天,就来完成这种个刷卡流程吧。


<<:  【Day 22】Go 基础小笔记 III :method / interface

>>:  JavaScript Day22 - setTimeout、setInterval

反射光

大家好,我是西瓜,你现在看到的是 2021 iThome 铁人赛『如何在网页中绘制 3D 场景?从 ...

【求职用词】求职相关缩写与用词解释

对於新鲜人,一开始求职可能会看不太懂的用词 / 英文缩写大杂烩。 常见职位 RD:研发设计工程师。就...

[Day23] Tableau 轻松学 - TabPy 安装与连线

前言 对 TabPy 有一定程度的认识之後,便能开始学习 TabPy 安装与使用,这篇文章会分享如何...

[Day 10] 简单的单元测试实作(四)-关於程序的问题,一律建议重构

为了要让程序码更简洁、更容易懂、及更容易维护, 我们今天要开始将之前的测试程序重构,(虽然好像才刚开...

【Day23】参数

参数 首先我们先看一个范例 function fn(para){ console.log(para,...