文件
xionggeshop/addons/shopro_wechat_trade/library/WxTradeClient.php

74 行
2.5 KiB
PHP

<?php
namespace addons\shopro_wechat_trade\library;
use addons\shopro\library\Wechat;
use fast\Http;
use think\Log;
class WxTradeClient
{
protected $wechat;
public function __construct()
{
$this->wechat = new Wechat('wxMiniProgram');
}
public function getAccessToken()
{
$token = $this->wechat->getAccessToken();
if (is_array($token) && !empty($token['access_token'])) {
return $token['access_token'];
}
if (is_string($token)) {
return $token;
}
throw new \RuntimeException('无法获取小程序 access_token');
}
public function postJson($path, array $body)
{
$token = $this->getAccessToken();
$url = 'https://api.weixin.qq.com' . $path . '?access_token=' . urlencode($token);
$headers = ['Content-Type: application/json'];
$options = [CURLOPT_HTTPHEADER => $headers];
$result = Http::sendRequest($url, json_encode($body, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), 'POST', $options);
if (!isset($result['ret']) || !$result['ret']) {
throw new \RuntimeException('微信 API 请求失败: ' . ($result['msg'] ?? 'unknown'));
}
$decoded = json_decode($result['msg'], true);
if (!is_array($decoded)) {
throw new \RuntimeException('微信 API 响应解析失败');
}
return $decoded;
}
public function getJson($path, array $query = [])
{
$token = $this->getAccessToken();
$query['access_token'] = $token;
$url = 'https://api.weixin.qq.com' . $path . '?' . http_build_query($query);
$result = Http::sendRequest($url, [], 'GET');
if (!isset($result['ret']) || !$result['ret']) {
throw new \RuntimeException('微信 API 请求失败: ' . ($result['msg'] ?? 'unknown'));
}
$decoded = json_decode($result['msg'], true);
if (!is_array($decoded)) {
throw new \RuntimeException('微信 API 响应解析失败');
}
return $decoded;
}
public function callOrThrow(array $response, $action = '微信接口')
{
$errcode = intval($response['errcode'] ?? 0);
if ($errcode !== 0) {
$msg = ($response['errmsg'] ?? 'unknown') . ' (' . $errcode . ')';
Log::write('[shopro_wechat_trade] ' . $action . ' fail: ' . $msg);
throw new \RuntimeException($action . '失败: ' . $msg);
}
return $response;
}
}