时光

时光的时光轴

寄以时间,予以文字
telegram
github
微信公众号

在獨角數卡上配置回調事件

這些天閒來無事搭建了一個小商店,在正式開始之前,如果你不介意的話可以逛逛我的兩米商店🛒

自帶的主題足夠好看,後台功能也能滿足基本的需要,但是配置商品的時候有一個回調事件的配置項在 Wiki 裡面找不到相關說明,也搜不到相關教程;本著功能是有的想法,這篇文章算是一個解決問題的流水帳,當然如果能對你有幫助就太好了。實在懶也可以 “花錢購買我的時間。

在前面的檢索環節中,你需要對PHPLaravel有一些基礎了解,如果你沒有的話就請直接跳到 **“一些例程”** 章節。本文所有代碼均來自dujiaoka倉庫,使用MIT協議開源。

那我們開始吧。

找到功能定義#

你可以很快在代碼中搜索到一條回調事件的註釋,位置在app/Service/OrderProcessService.php

iShot_2023-02-21_21.35.48.png

跟著走找到ApiHook類的定義,位置在app/Jobs/ApiHook.php,然後跟著看類的構造函數。

    public function __construct(Order $order)
    {
        $this->order = $order;
        $this->goodsService = app('Service\GoodsService');
    }

這裡傳遞了$order變量,然後引入了一個服務。後面的dispatch是 Laravel 提供的隊列系統,使得回調事件可以加入隊列來執行。

那我們稍微看一下goodsService,在app/Service/GoodsService.php,是一些商品處理的基本函數,那就直接看事件裡的handle

public function handle()
    {
        $goodInfo = $this->goodsService->detail($this->order->goods_id);
        // 判斷是否有配置支付回調
        if(empty($goodInfo->api_hook)){
            return;
        }
        $postdata = [
            'title' => $this->order->title,
            'order_sn' => $this->order->order_sn,
            'email' => $this->order->email,
            'actual_price' => $this->order->actual_price,
            'order_info' => $this->order->info,
            'good_id' => $goodInfo->id,
            'gd_name' => $goodInfo->gd_name

        ];

        
        $opts = [
            'http' => [
                'method'  => 'POST',
                'header'  => 'Content-type: application/json',
                'content' => json_encode($postdata,JSON_UNESCAPED_UNICODE)
            ]
        ];
        $context  = stream_context_create($opts);
        file_get_contents($goodInfo->api_hook, false, $context);
    }

你會發現其實回調事件沒什麼玄乎,就是將處理好的商品信息請求到你填寫的回調事件,可以是一個 URL。

發送了什麼#

那我們要先搞清楚,在回調的時候,系統向我們的目標地址發送了什麼。
根據postData

$postdata = [
            'title' => $this->order->title,
            'order_sn' => $this->order->order_sn,
            'email' => $this->order->email,
            'actual_price' => $this->order->actual_price,
            'order_info' => $this->order->info,
            'good_id' => $goodInfo->id,
            'gd_name' => $goodInfo->gd_name

        ];

發送了,訂單標題訂單編號購買者的郵箱實際支付的價格訂單信息商品ID商品標題

這裡的訂單標題商品標題目前我發現的區別就是訂單標題會帶下單的數量,格式一般為商品標題 x 數量

這裡的訂單信息是你商品裡的其他輸入框配置,根據app/Service/OrderService.php:185可知,輸出格式為

key1:value1
key2:value2
...

通過這裡的數據,可以實現在頁面上填寫一些帳號信息,實現自動充值之類的,或者自動下發優惠券。

根據環境參數,我們可以得知其他幾個信息:

$opts = [
            'http' => [
                'method'  => 'POST',
                'header'  => 'Content-type: application/json',
                'content' => json_encode($postdata,JSON_UNESCAPED_UNICODE)
            ]
        ];
  • 請求方式為 POST
  • 請求的內容經過 JSON 編碼
  • JSON 中的中文等特殊字符不會被 Unicode 編碼

根據上述信息,我相信有一定基礎的你已經可以試著實現一些邏輯來利用回調事件了,不過讓我們再進一步,舉點例子。

一些例程#

以下例程都是我瞎編的,不保證任何功能可行性,不保證任何代碼安全。

接收傳遞來的數據並存入數組#

<?php
try {
	$data = json_decode(file_get_contents('php://input'), true);
}
catch (JsonException $e) {
	http_response_code(400);
	exit("Not valid data.");
}

將傳遞來的自定義字段存入數組#

$customs = [];
$custom_lines = explode(PHP_EOL, $data['order_info']);
array_pop($custom_lines);
foreach ($custom_lines as $line) {
	list($key, $value) = explode(":", $line);
	$customs[$key] = $value;
}

假裝為用戶充個值#

假設你有一個很酷的 API,能直接為用戶充值 R 幣,你在頁面的自定義字段為rr。並且你的商品名稱是代充10R幣,那麼你可以這樣做:

$base = 10;
$num = intval(explode(" x ",$data['title']));
file_get_contents("你很酷的API?rr=".$customs['rr']."&num=".($base*$num));

這樣就完成了。

祝你玩得開心。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。