Day 15 - PHP SDK: 用 Pure PHP 建立购物网 (下)

今天是示范使用 Pure PHP 建立购物网站的下集,本来想要录影片,不过发现这里没办法直接播影片,所以制作了 GIF 示范图,展示整个购物流程。

图 15-1
图 15-1: Terry's 商店 - 实际购买

由於在本机的虚拟网域 sinopac.php.sdk,并没有 SSL,因此在後段填完卡号送出後,从收款平台转页到本机的虚拟网域时,浏览器有问一下是否继续,是浏览器的安全机制哦。

示范网站

图 15-1 的示范网站可经由以下方法安装。

安装

这个示范网站以非常简易的语法编写,读者们可以直接从 Composer 安装,或直接到 GitHub 下载实际操作看看。

Composer 安装指令:

composer create-project terrylinooo/sinopac-php-demo demo

设定

由於铁人赛後,笔者的测试帐号会失效,届时会无法成功送单,因此在您申请了永丰金收款平台的帐号後,请修改成自己的资料喔。这些资料包括 ShopNo 还有四组 Hash Key,设定以下档案。

app/config.php

图 15-2
图 15-2: config.php 内容

QPAY_RETURN_URL 一栏请把 sinopac.php.sdk 修改成您自己的测试网域即可。

流程说明

我们接续 Day 14 的流程,开始进行填单结帐。

结帐

图 15-3
图 15-3: 结帐页面

在这个结帐页面的填写收件人表单,以及送出建立订单的逻辑都写在这支 controller 中。

app/controllers/checkout_controller.php

第 8-23 行 是结帐网页。其中第 11 行checkout_handler() 处理送出表单後的动作。

图 15-4
图 15-4: checkout_controller.php

第 39-41 行 读取商品资料,带出要送给 API 建单的栏位。
第 44-46 行 收货人资讯是属於物流的部分,和收款的 API 无关。
第 48-55 行 准备要建立付款订单,喂给 API 的资料,回顾 Day 8 建立订单一文,有更详细的说明。

第 57 行 把订单资料存成 JSON 档案放到 storage/orders 目录中。
第 58 行 取得 QPay 物件。
第 61 行 传送 API 请求,建立付款订单。
第 62 行 把 API 回传的结果分析,取得 第 78 行CardPayURL,然後转址到永丰金收款平台的刷卡页面。
第 63 行 当 PHP SDK 在遇到资料丢到 API 一定会回错建单失败的情况下,预设丢出 QPayException,可以 try-catch 起来做错误处理。

购买完成

刷卡完成会转回到购买完成页面 (thank-you page)。

图 15-5
图 15-5: 购买完成

在永丰金收款平台填写完卡号进行付款後,会 POST 资料回来,为两个栏位,分别是 ShopNo 以及 PayToken。我们收到 Token 之後,用它来查询订单,查看看订单的付款状况是成功还是失败。这一整个逻辑都在以下这个 controller 中。

app/controllers/order_controller.php

第 10 行 从全域变数 $_POST 取得 ShopNo。
第 11 行 从全域变数 $_POST 取得 PayToken。

图 15-6
图 15-6: order_controller.php

第 16-18 行 验证 ShopNo 是我们在 config.php 设定的那组以及有 Token,使用 PHP SDK 的 queryOrderByToken 方法来查询订单付款状态。

第 23 行 比较要注意的是,详细资料是在 TSResultContent 中,而不是直接在 Message 下。

第 25-28 行 就是我们在购买完成页显示的交易编号、订单编号、付款时间以及付款金额了。比较要注意的地方在金额,必须除以 100 才是真正金额,还记得 API 文件的说明吧?那两个位数是小数两位,因此我们送单要乘以 100,显示结果要除以 100。

流程总结

以上就是使用 Pure PHP 做一个简易的示范网站,藉着 Sinopac PHP SDK,轻松就完成刷卡付款的动作罗。

接着,正式进入 WooCommerce 电商的世界,我们明天见 ^^

注:示范网站的原始码可能会再改善,而让程序码和本篇文章不同。以上网址为铁人赛文章的进度程序码可以参考。


本文更新於笔者的 TerryL 部落格,Day 15 - PHP SDK: 用 Pure PHP 建立购物网 (下),有兴趣可前往阅读及讨论。


<<:  [Day14] React Native - Redux Saga

>>:  Day17 - 安装自己开发的套件

学习javascript前...HTML2

有些功能性的标签不需要内文,写法如下: < b >粗体字< /b > b 标...

error CS0246: 找不到类型或命名空间名称 'NewsPaper'

该文件的头加入: using System; 既可以识别了; ...

Day 4 Odoo 资料库栏位建立

Odoo模组开发实战 目录 基础栏位建立 第一章 基础栏位建立 1.设定名称 2.至models/m...

【Day15】浅谈系统入侵System Hacking(二)

哈罗~ 昨天我们介绍了系统入侵的流程, 并且讲解微软提供给Window系统的验证机制。 今天想对系统...

[Android Studio] 每日小技巧 - 在 Android Studio 中快速向 Google 作关键字搜索

身为开发时程紧凑的工程师 遇到问题或是疑惑时必须要能快速的排除 通常在专案中遇到不熟悉的物件,想到 ...