时光

时光的时光轴

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

独角獣のカードにコールバックイベントを設定する

これらの日々、暇な時に小さな店を立ち上げました。正式に始める前に、もしよければ私の2m ショップ🛒を見て回ってください。

デフォルトのテーマは十分に魅力的で、バックエンドの機能も基本的なニーズを満たすことができますが、商品の設定時には 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;
}

ユーザーにチャージするフリをする#

あなたが直接ユーザーに R コインをチャージするクールな API を持っていると仮定しましょう。ページのカスタムフィールドはrrです。そして、商品名は代充10R币です。次のようにすることができます:

$base = 10;
$num = intval(explode(" x ",$data['title']));
file_get_contents("あなたのクールなAPI?rr=".$customs['rr']."&num=".($base*$num));

これで完了です。

楽しんでください。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。