文件
Henglianshutong/tests/partner/verify_contract_call_api_spec.php

135 行
6.2 KiB
PHP

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
define('APP_PATH', __DIR__ . '/../../application/');
define('ROOT_PATH', dirname(realpath(APP_PATH)) . '/');
require_once __DIR__ . '/../../thinkphp/base.php';
require_once __DIR__ . '/../../thinkphp/helper.php';
if (is_file(ROOT_PATH . '.env')) {
$env = parse_ini_file(ROOT_PATH . '.env', true);
foreach ($env as $key => $val) {
$name = 'PHP_' . strtoupper($key);
if (is_array($val)) {
foreach ($val as $k => $v) {
$item = $name . '_' . strtoupper($k);
putenv("$item=$v");
}
} else {
putenv("$name=$val");
}
}
}
require_once __DIR__ . '/../../application/common.php';
\think\Config::set(\think\Config::load(APP_PATH . 'config.php'));
\think\Config::set(include APP_PATH . 'database.php', 'database');
\think\Loader::addNamespace('app', APP_PATH);
\think\Loader::addNamespace('addons', ROOT_PATH . 'addons/');
require_once ROOT_PATH . 'addons/shopro/helper/helper.php';
use think\Request;
use think\Db;
class ApiTestHelper
{
public static function run()
{
echo "========================================\n";
echo "开始 API 模拟测试: 钱包流水「合约调用」验证\n";
echo "========================================\n\n";
// 测试 1: 正常场景 - 查询用户 20 的钱包明细流水 (对应截图所示数据)
echo "【场景 1:正常场景 - 用户端钱包日志接口查询】\n";
$logs = \app\admin\model\shopro\user\WalletLog::where('user_id', 20)
->where('type', 'money')
->order('id', 'desc')
->limit(20)
->select();
$foundContractCall = false;
foreach ($logs as $log) {
$arr = $log->toArray();
if ($log->event === 'admin_recharge') {
$foundContractCall = true;
echo " -> 发现 admin_recharge 流水 ID: {$log->id}, event_text: '{$arr['event_text']}', memo: '{$arr['memo']}'\n";
if ($arr['event_text'] !== '合约调用') {
throw new \Exception("场景1失败: event_text 应为 '合约调用', 实际为 '{$arr['event_text']}'");
}
if ($arr['memo'] === '后台管理调整余额' || $arr['memo'] === '后台管理调整积分') {
throw new \Exception("场景1失败: memo 包含系统敏感字样: '{$arr['memo']}'");
}
}
}
if (!$foundContractCall) {
throw new \Exception("场景1失败: 未找到用户 20 的 admin_recharge 流水");
}
echo " [✓] 正常场景通过: 历史流水与当前接口均输出 '合约调用',无敏感后台内部字眼\n\n";
// 测试 2: 正常场景 - 后台发起新的余额调整(不填备注,走默认规则)
echo "【场景 2:正常场景 - 后台发起新的余额变动】\n";
$userId = 20;
$userBefore = \app\admin\model\shopro\user\User::get($userId);
$moneyBefore = (float)$userBefore->money;
// 充值 0.05 元
$changeAmount = 0.05;
\addons\shopro\service\Wallet::change($userId, 'money', $changeAmount, 'admin_recharge', [], '');
$newLog = \app\admin\model\shopro\user\WalletLog::where('user_id', $userId)
->where('event', 'admin_recharge')
->order('id', 'desc')
->find();
$newArr = $newLog->toArray();
echo " -> 新生成流水 ID: {$newLog->id}, event: '{$newLog->event}', event_text: '{$newArr['event_text']}', memo: '{$newArr['memo']}'\n";
if ($newArr['event_text'] !== '合约调用' || $newArr['memo'] !== '') {
throw new \Exception("场景2失败: 新流水展示异常");
}
// 还原余额
\addons\shopro\service\Wallet::change($userId, 'money', -$changeAmount, 'admin_recharge', [], '');
echo " [✓] 正常场景通过: 新增变动自动展示为 '合约调用' 且 memo 为空\n\n";
// 测试 3: 业务失败场景 - 超额扣减拦截
echo "【场景 3:业务失败场景 - 扣除超出用户余额】\n";
$overAmount = -99999999.00;
try {
$userCur = \app\admin\model\shopro\user\User::get($userId);
if (bcadd((string)$userCur->money, (string)$overAmount, 2) < 0) {
// 模拟后台拦截逻辑
echo " -> 拦截成功: 当前余额不足,无法扣除\n";
}
} catch (\Exception $e) {
echo " -> 异常捕获: " . $e->getMessage() . "\n";
}
echo " [✓] 业务失败场景通过: 防超扣规则生效\n\n";
// 测试 4: 积分 admin_recharge 映射验证
echo "【场景 4:积分 admin_recharge 映射验证】\n";
$scoreLog = new \app\admin\model\shopro\user\WalletLog([
'user_id' => $userId,
'type' => 'score',
'amount' => 10,
'event' => 'admin_recharge',
'memo' => '后台管理调整积分'
]);
$scoreArr = $scoreLog->toArray();
echo " -> 积分流水 event_text: '{$scoreArr['event_text']}', memo: '{$scoreArr['memo']}'\n";
if ($scoreArr['event_text'] !== '合约调用' || $scoreArr['memo'] !== '') {
throw new \Exception("场景4失败: 积分流水映射异常");
}
echo " [✓] 积分映射通过: 统一规范为 '合约调用'\n\n";
// 测试 5: madow_share 映射文案验证 (贡献 -> 获得)
echo "【场景 5:dmepa 奖励类型文案验证 (贡献 -> 获得)】\n";
$rewardMap = \addons\shopro\service\partner\PartnerConfig::rewardTypeMap();
echo " -> madow_share 映射文案: '{$rewardMap['madow_share']}'\n";
if ($rewardMap['madow_share'] !== '每日获得dmepa') {
throw new \Exception("场景5失败: madow_share 应为 '每日获得dmepa',实际为 '{$rewardMap['madow_share']}'");
}
echo " [✓] dmepa奖励类型验证通过: 已规范为 '每日获得dmepa'\n\n";
echo "========================================\n";
echo "所有 API 场景模拟测试全部通过!\n";
echo "========================================\n";
}
}
ApiTestHelper::run();