payment_provider_catalog.php 4.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <?php
  2. // 无需 Laravel 或数据库:php tests/Regression/payment_provider_catalog.php
  3. require_once __DIR__ . '/../../app/Services/Payment/PaymentProviderCatalog.php';
  4. use App\Services\Payment\PaymentProviderCatalog;
  5. $fixture = require __DIR__ . '/../fixtures/payment_provider_channels.php';
  6. $catalog = new PaymentProviderCatalog();
  7. $checks = 0;
  8. $check = static function ($expected, $actual, string $scenario) use (&$checks): void {
  9. if ($expected !== $actual) throw new RuntimeException($scenario . ': ' . json_encode($actual, JSON_UNESCAPED_UNICODE));
  10. $checks++;
  11. };
  12. $options = static fn (array $filters = []) => $catalog->options($fixture['channels'], $fixture['groups'], $filters);
  13. $deposit = $options(['kind' => 'deposit']);
  14. $withdraw = $options(['kind' => 'withdraw']);
  15. $check(['sanjin', 'jd', 'no', 'zimu'], array_column($deposit['payment_companies'], 'value'), '空商户表也有四家存款公司');
  16. $check(['qianbao', 'jd', 'no', 'zimu'], array_column($withdraw['payment_companies'], 'value'), '提现公司按已实现方向返回');
  17. $check([false, false, false, false], array_column($deposit['payment_companies'], 'disabled'), '实际数据四家均有可选通道');
  18. $check([false, false, false, false], array_column($withdraw['payment_companies'], 'disabled'), '实际数据四家提现均有可选通道');
  19. $check('environment', $deposit['credential_source'], '不把保存配置冒充运行时凭据');
  20. $allChannels = array_column($options()['recharge_channels'], null, 'id');
  21. foreach ([1, 15, 16, 20, 21, 22, 23] as $id) {
  22. $check(null, $allChannels[$id]['provider_code'], 'USDT/人工/活动不归入第三方公司 ' . $id);
  23. }
  24. foreach ([2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] as $id) {
  25. $check('sanjin', $allChannels[$id]['provider_code'], '三斤通道映射 ' . $id);
  26. $check([1], $allChannels[$id]['available_group_ids'], '三斤不属于线下组合 ' . $id);
  27. }
  28. foreach ([24, 25, 26, 27, 28, 29, 30] as $id) {
  29. $check([1, 2], $allChannels[$id]['available_group_ids'], 'JD/NO/808支持两个组合 ' . $id);
  30. }
  31. foreach ([17, 18, 19] as $id) {
  32. $check('qianbao', $allChannels[$id]['provider_code'], '钱宝提现映射 ' . $id);
  33. $check([1], $allChannels[$id]['available_group_ids'], '钱宝提现不属于线下组合 ' . $id);
  34. }
  35. $check(false, $allChannels[31]['selectable'], 'ZIMUcash停用不可选');
  36. $check([], $allChannels[31]['available_group_ids'], 'ZIMUcash无所属组合');
  37. $check('0.2000', $allChannels[25]['fee_rate'], 'JD提现原始费率转换为百分比');
  38. $check('9.5000', $allChannels[2]['fee_rate'], '微信费率转换为百分比');
  39. $check(['945', '988', '990'], $allChannels[10]['fixed_amounts'], '固额金额保留');
  40. $filtered = $options(['kind' => 'deposit', 'payment_company' => 'sanjin', 'payment_method' => 'zfbsm']);
  41. $check([6, 7, 8, 9], array_column($filtered['recharge_channels'], 'id'), '支付宝扫码保留全部四个额度通道');
  42. $check(7, count($filtered['payment_methods']), '选方式不截断公司方式下拉');
  43. $no = $options(['kind' => 'collection_scan', 'provider_name' => 'no']);
  44. $check(['NOpay12', 'NOpay13'], array_column($no['collection_methods'], 'value'), '代收NO方式联动');
  45. $check([26, 27], array_column($no['recharge_channels'], 'id'), '代收NO通道联动');
  46. $check('SHA256', array_column($deposit['payment_companies'], null, 'value')['no']['signature_algorithm'], 'NO不标成MD5');
  47. $check([25], array_column($options(['kind' => 'withdraw', 'payment_company' => 'jd'])['recharge_channels'], 'id'), '同名JD type按充值提现分开');
  48. $check(true, array_column($options(['kind' => 'withdraw', 'payment_company' => 'zimu'])['payment_methods'], null, 'value')['ZIMUcash']['disabled'], '禁用方式仍可见但不能选择');
  49. $empty = $catalog->options([], [], ['kind' => 'deposit']);
  50. $check(4, count($empty['payment_companies']), '没有通道时目录仍存在');
  51. $check([true, true, true, true], array_column($empty['payment_companies'], 'disabled'), '没有通道不伪造可用');
  52. $unknown = $fixture['channels'][0];
  53. $unknown['from'] = 1;
  54. $unknown['type'] = 'unimplemented';
  55. $check(null, PaymentProviderCatalog::channelIdentity($unknown), '未知通道不默认发给三斤');
  56. $raw = array_column($fixture['channels'], null, 'id');
  57. PaymentProviderCatalog::validateSelection($raw[2], 'sanjin', 'wxsm', 1);
  58. foreach ([[$raw[2], 'jd', 'wxsm', 1], [$raw[2], 'sanjin', 'zfbsm', 1], [$raw[24], 'jd', 'JDpay', 2], [$raw[15], 'sanjin', 'rgcz', 1]] as $args) {
  59. $rejected = false;
  60. try { PaymentProviderCatalog::validateSelection(...$args); } catch (InvalidArgumentException $e) { $rejected = true; }
  61. $check(true, $rejected, '保存拒绝跨公司/跨方向/手填方式/人工充值');
  62. }
  63. echo "Payment provider catalog: {$checks} checks passed.\n";