App_Task_ConfigUsdtRate.proxy.php 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <?php
  2. namespace App\Task;
  3. use App\Repositories\ConfigRepoistory;
  4. use Hyperf\Crontab\Annotation\Crontab;
  5. use Hyperf\Di\Annotation\Inject;
  6. use Hyperf\Guzzle\ClientFactory;
  7. /**
  8. * @Crontab(name="UsdtRate", rule="00 /1 * * *", callback="execute", memo="usdt汇率")
  9. */
  10. class ConfigUsdtRate
  11. {
  12. use \Hyperf\Di\Aop\ProxyTrait;
  13. use \Hyperf\Di\Aop\PropertyHandlerTrait;
  14. function __construct()
  15. {
  16. $this->__handlePropertyHandler(__CLASS__);
  17. }
  18. /**
  19. * @Inject()
  20. * @var \Hyperf\Contract\StdoutLoggerInterface
  21. */
  22. private $logger;
  23. private $reatUrl = ['http://api.coincap.io/v2/rates/chinese-yuan-renminbi', 'https://v6.exchangerate-api.com/v6/1a45491bb39175ddc4203829/latest/CNY', 'https://api.exchangerate-api.com/v4/latest/CNY'];
  24. public function execute()
  25. {
  26. $confRepo = make(ConfigRepoistory::class);
  27. $config = $confRepo->pickByKeys(['usdt_conf', 'usdt_pick_switch'], 'sys');
  28. if ($config['usdt_pick_switch']['svalue'] != 1) {
  29. return '';
  30. }
  31. $oldUsdtRate = $config['usdt_conf']['svalue'];
  32. foreach ($this->reatUrl as $key => $url) {
  33. try {
  34. $res = $this->curl($url);
  35. if (empty($res)) {
  36. continue;
  37. }
  38. $aRes = json_decode($res, true);
  39. if ($key == 0) {
  40. if (empty($aRes['data']) || $aRes['data']['symbol'] != 'CNY') {
  41. continue;
  42. }
  43. $rateUsd = round($aRes['data']['rateUsd'], 2);
  44. break;
  45. }
  46. if ($key == 1) {
  47. if (empty($aRes['result']) || $aRes['result'] != 'success') {
  48. continue;
  49. }
  50. $rateUsd = round($aRes['conversion_rates']['USD'], 2);
  51. break;
  52. }
  53. if ($key == 2) {
  54. if (empty($aRes['rates'])) {
  55. continue;
  56. }
  57. $rateUsd = round($aRes['rates']['USD'], 2);
  58. break;
  59. }
  60. } catch (\Exception $exception) {
  61. logger($exception->getMessage());
  62. }
  63. }
  64. $usdtRate = round(100 / $rateUsd, 2) / 100;
  65. if ($oldUsdtRate != $usdtRate) {
  66. $confRepo->saveByKeys(['usdt_conf' => $usdtRate + 0.3], 'sys');
  67. $confRepo->updateConfigCache('sys');
  68. }
  69. }
  70. private function curl($url)
  71. {
  72. $options = array(
  73. 'timeout' => 20,
  74. // 超时,单位秒.
  75. 'verify' => false,
  76. // 是否校验SSL证书.
  77. 'http_errors' => false,
  78. // 如果跟随http异常头部是否中断.
  79. 'debug' => false,
  80. // 是否启用调试模式.
  81. 'allow_redirects' => true,
  82. );
  83. $client = make(ClientFactory::class)->create($options);
  84. $params = ['headers' => ['Content-Type' => 'application/json']];
  85. $result = $client->get($url, $params);
  86. $code = $result->getStatusCode();
  87. if ($code == 200) {
  88. return $result->getBody()->getContents();
  89. }
  90. return [];
  91. }
  92. }