首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 微信小店 API 二次開發完整類庫:商品、訂單、物流、發貨

     編輯:PHP 綜合知識

微信小店 API 概覽

微信小店提供商品管理、訂單處理、物流設置等接口,基於 Access Token 認證,HTTPS POST JSON 交互。

核心類實現:WXD

class WXD {
    public $AppID = "";
    public $AppSecret = "";
    public $AccessToken = "";
    private $tokenFile;
    private $logisticsMap = [];

    public function __construct($shopId = '0') {
        $this->tokenFile = $_SERVER['DOCUMENT_ROOT'] . "/json_file/access_token_{$shopId}.json";
        $this->initLogistics();
    }

    // 初始化物流公司映射
    private function initLogistics() {
        $this->logisticsMap = [
            'Fsearch_code' => '郵政EMS',
            '002shentong'  => '申通快遞',
            '066zhongtong' => '中通速遞',
            '056yuantong'  => '圓通速遞',
            '042tiantian'  => '天天快遞',
            '003shunfeng'  => '順豐速運',
            '059Yunda'     => '韻達快運',
            '064zhaijisong'=> '宅急送',
            '020huitong'   => '匯通快運',
            'zj001yixun'   => '易迅快遞',
        ];
    }

    // 通用 cURL 請求
    private function curlRequest($url, $data = null) {
        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => !empty($data),
            CURLOPT_POSTFIELDS => $data,
        ]);
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
    }

    // 獲取 Access Token (帶緩存)
    public function getAccessToken() {
        $data = $this->loadToken();
        if ($data['expire_time'] < time()) {
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->AppID}&secret={$this->AppSecret}";
            $result = json_decode($this->curlRequest($url), true);
            if (isset($result['access_token'])) {
                $this->saveToken($result['access_token']);
                return $result['access_token'];
            }
            throw new Exception("獲取 Token 失敗: " . json_encode($result));
        }
        return $data['access_token'];
    }

    private function loadToken() {
        if (!file_exists($this->tokenFile)) return ['expire_time'=>0, 'access_token'=>''];
        return json_decode(file_get_contents($this->tokenFile), true);
    }

    private function saveToken($token) {
        $data = ['expire_time' => time() + 7000, 'access_token' => $token];
        file_put_contents($this->tokenFile, json_encode($data));
    }

    // ========== 商品相關 ==========
    // 獲取商品列表 (按狀態)
    public function getProducts($status = 0) {
        $url = "https://api.weixin.qq.com/merchant/getbystatus?access_token=" . $this->getAccessToken();
        return json_decode($this->curlRequest($url, '{"status":' . $status . '}'), true);
    }

    // 獲取單個商品詳情
    public function getProduct($productId) {
        $url = "https://api.weixin.qq.com/merchant/get?access_token=" . $this->getAccessToken();
        return json_decode($this->curlRequest($url, '{"product_id":"' . $productId . '"}'), true);
    }

    // ========== 訂單相關 ==========
    // 獲取訂單詳情
    public function getOrder($orderId) {
        $url = "https://api.weixin.qq.com/merchant/order/getbyid?access_token=" . $this->getAccessToken();
        return json_decode($this->curlRequest($url, '{"order_id":"' . $orderId . '"}'), true);
    }

    // 獲取訂單列表 (按時間/狀態篩選)
    public function getOrders($filter = []) {
        $url = "https://api.weixin.qq.com/merchant/order/getbyfilter?access_token=" . $this->getAccessToken();
        if (empty($filter)) {
            $firstDay = strtotime(date('Y-m-01'));
            $filter = ['begintime' => $firstDay, 'endtime' => strtotime("+1 month -1 day", $firstDay)];
        }
        return json_decode($this->curlRequest($url, json_encode($filter)), true);
    }

    // ========== 發貨/關單 ==========
    // 設置發貨信息
    public function setDelivery($orderId, $companyCode, $trackNo, $needDelivery = 1) {
        $url = "https://api.weixin.qq.com/merchant/order/setdelivery?access_token=" . $this->getAccessToken();
        $data = [
            'order_id' => $orderId,
            'need_delivery' => $needDelivery,
            'delivery_company' => $companyCode,
            'delivery_track_no' => $trackNo,
        ];
        return json_decode($this->curlRequest($url, json_encode($data)), true);
    }

    // 關閉訂單
    public function closeOrder($orderId) {
        $url = "https://api.weixin.qq.com/merchant/order/close?access_token=" . $this->getAccessToken();
        return json_decode($this->curlRequest($url, '{"order_id":"' . $orderId . '"}'), true);
    }

    // 獲取物流公司代碼
    public function getLogisticsCode($name) {
        return array_search($name, $this->logisticsMap);
    }
}

使用示例

require_once 'WXD.php';

$wxd = new WXD();
$wxd->AppID = "your_appid";
$wxd->AppSecret = "your_secret";

echo "
";

// 1. 獲取所有上架商品
print_r($wxd->getProducts(0));

// 2. 獲取單個商品
print_r($wxd->getProduct('pP3K2s25zDRY50n3nLCKqZvPzINM'));

// 3. 獲取本月訂單
print_r($wxd->getOrders());

// 4. 發貨
$wxd->setDelivery(
    '12963133879983600667',
    '059Yunda', // 韻達代碼
    '1000464090326'
);

// 5. 關閉訂單
print_r($wxd->closeOrder('12963133879983600740'));

echo "
";

關鍵技術點總結

模塊關鍵點
Token 管理文件緩存 7000 秒,自動刷新,避免頻繁請求被限流
HTTPS 請求關閉 SSL 驗證 (測試環境),生產需配置 CA 證書
JSON 交互請求/響應均為 JSON,注意字符串拼接轉義
物流映射維護微信規範的物流公司代碼表
錯誤處理檢查 errcode/errmsg,記錄日誌便於排查

生產環境優化建議

  1. Redis 緩存 Token:多進程/分佈式部署共享,替代文件
  2. 異步處理回調:訂單狀態變更推入隊列,快速響應微信
  3. 請求重試:網絡波動時指數退避重試 3 次
  4. 簽名驗證:回調通知驗證簽名防偽造
  5. 監控告警:API 失敗率、延遲、Token 刷新失敗告警

總結

封裝 WXD 類實現微信小店核心功能:Token 自動管理、商品查詢、訂單全生命周期、物流發貨。代碼結構清晰,易於擴展新接口。生產部署時注意 Token 共享存儲、HTTPS 證書配置、異步解耦、全鏈路監控。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved