YiLianYunService.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <?php
  2. namespace services\extend\printer;
  3. use Yii;
  4. use yii\web\NotFoundHttpException;
  5. use yii\web\UnprocessableEntityHttpException;
  6. use App\Api\PicturePrintService;
  7. use App\Api\PrintService;
  8. use App\Config\YlyConfig;
  9. use App\Oauth\YlyOauthClient;
  10. use common\components\Service;
  11. use common\helpers\ArrayHelper;
  12. use common\helpers\StringHelper;
  13. use common\models\extend\printer\YiLianYun;
  14. /**
  15. * Class YiLianYunService
  16. * @package services\extend
  17. * @author jianyan74 <751393839@qq.com>
  18. */
  19. class YiLianYunService extends Service
  20. {
  21. /**
  22. * @var YlyConfig
  23. */
  24. protected $config;
  25. /**
  26. * 打印数量
  27. *
  28. * @var int
  29. */
  30. protected $printNum;
  31. /**
  32. * 机器码
  33. *
  34. * @var string
  35. */
  36. protected $machineCode;
  37. public function initConfig(YiLianYun $config)
  38. {
  39. $this->machineCode = $config->terminal_number;
  40. $this->printNum = $config->print_num;
  41. $this->config = new YlyConfig($config->app_id, $config->app_secret_key);
  42. // 授权打印机(自有型应用使用,开放型应用请跳过该步骤)
  43. // $printer = new PrinterService($this->token->access_token, $this->config);
  44. // $data = $printer->addPrinter('你的机器码', '你的机器密钥');
  45. parent::init();
  46. }
  47. /**
  48. * @param $data
  49. *
  50. * 58mm排版 排版指令详情请看 http://doc2.10ss.net/332006
  51. *
  52. * $content = "<FS2><center>**#1 美团**</center></FS2>";
  53. * $content .= str_repeat('.', 32);
  54. * $content .= "<FS2><center>--在线支付--</center></FS2>";
  55. * $content .= "<FS><center>张周兄弟烧烤</center></FS>";
  56. * $content .= "订单时间:". date("Y-m-d H:i") . "\n";
  57. * $content .= "订单编号:40807050607030\n";
  58. * $content .= str_repeat('*', 14) . "商品" . str_repeat("*", 14);
  59. * $content .= "<table>";
  60. * $content .= "<tr><td>烤土豆(超级辣)</td><td>x3</td><td>5.96</td></tr>";
  61. * $content .= "<tr><td>烤豆干(超级辣)</td><td>x2</td><td>3.88</td></tr>";
  62. * $content .= "<tr><td>烤鸡翅(超级辣)</td><td>x3</td><td>17.96</td></tr>";
  63. * $content .= "<tr><td>烤排骨(香辣)</td><td>x3</td><td>12.44</td></tr>";
  64. * $content .= "<tr><td>烤韭菜(超级辣)</td><td>x3</td><td>8.96</td></tr>";
  65. * $content .= "</table>";
  66. * $content .= str_repeat('.', 32);
  67. * $content .= "<QR>这是二维码内容</QR>";
  68. * $content .= "小计:¥82\n";
  69. * $content .= "折扣:¥4 \n";
  70. * $content .= str_repeat('*', 32);
  71. * $content .= "订单总价:¥78 \n";
  72. * $content .= "<FS2><center>**#1 完**</center></FS2>";
  73. *
  74. * @param string $uuid
  75. * @param YiLianYun|array $config
  76. */
  77. public function text($content, $uuid = '', $config = [])
  78. {
  79. if (!empty($config)) {
  80. $this->initConfig($config);
  81. }
  82. // 格式化内容
  83. $content = $this->formattedContent($content);
  84. $token = $this->getToken();
  85. empty($uuid) && $uuid = StringHelper::random(32, true);
  86. $print = new PrintService($token['access_token'], $this->config);
  87. $data = $print->index($this->machineCode, $content, $uuid);
  88. if ($data->error != 0) {
  89. throw new UnprocessableEntityHttpException($data->error_description);
  90. }
  91. return $data->body;
  92. }
  93. /**
  94. * @param $data
  95. * @param string $uuid
  96. * @param YiLianYun|array $config
  97. */
  98. public function image($data, $uuid = '', $config = [])
  99. {
  100. if (!empty($config)) {
  101. $this->initConfig($config);
  102. }
  103. !$uuid && $uuid == StringHelper::random(32, true);
  104. $token = $this->getToken();
  105. $print = new PicturePrintService($token['access_token'], $this->config);
  106. $data = $print->index($this->machineCode, '打印内容排版可看Demo下的callback.php', $uuid);
  107. var_dump($data);
  108. }
  109. protected function formattedContent($data)
  110. {
  111. if (!is_array($data)) {
  112. return $data;
  113. }
  114. $content = "<MN>{$this->printNum}</MN>";
  115. $content .= "<FS><center>****** {$data['title']} ******</center></FS>";
  116. $content .= str_repeat('.', 32);
  117. $content .= "<FS><center>---{$data['payType']}---</center></FS>";
  118. // $content .= "<center>{$data['merchantTitle']}</center>";
  119. $content .= "打印时间:" . Yii::$app->formatter->asDatetime(time()) . "\n";
  120. $content .= "下单时间:" . $data['orderTime'] . "\n";
  121. $content .= str_repeat('*', 13) . " 商品 " . str_repeat("*", 13);
  122. $content .= "<table>";
  123. $content .= "<tr><td>商品名称</td><td>数量</td><td>金额</td></tr>";
  124. foreach ($data['products'] as $product) {
  125. $content .= "<tr><td>{$product['title']}</td><td>x{$product['num']}</td><td>¥{$product['price']}</td></tr>";
  126. }
  127. $content .= "</table>";
  128. $content .= str_repeat('*', 32);
  129. $content .= "<table>";
  130. $content .= "<tr><td>商品总价</td><td></td><td>¥{$data['productOriginalMoney']}</td></tr>";
  131. foreach ($data['marketingDetails'] as $marketingDetail) {
  132. $content .= "<tr><td>{$marketingDetail['marketing_name']}</td><td></td><td>-¥{$marketingDetail['discount_money']}</td></tr>";
  133. }
  134. $data['pointMoney'] > 0 && $content .= "<tr><td>积分抵扣</td><td></td><td>-¥{$data['pointMoney']}</td></tr>";
  135. $data['taxMoney'] > 0 && $content .= "<tr><td>发票税额</td><td></td><td>-¥{$data['taxMoney']}</td></tr>";
  136. $content .= "<tr><td>配送费</td><td></td><td>¥{$data['shippingMoney']}</td></tr>";
  137. $content .= "<tr><td></td><td></td><td></td></tr>";
  138. $content .= "<tr><td>应付金额</td><td></td><td>¥{$data['payMoney']}</td></tr>";
  139. $content .= "</table>";
  140. $content .= str_repeat('.', 32);
  141. $content .= "昵称: " . $data['nickname'] . "\n";
  142. isset($data['receiverName']) && $content .= "客户: " . $data['receiverName'] . "\n";
  143. isset($data['receiverMobile']) && $content .= "电话: " . StringHelper::hideStr($data['receiverMobile'], 3) . "\n";
  144. isset($data['receiverAddress']) && $content .= "地址: " . $data['receiverRegionName'] . $data['receiverAddress'] . "\n";
  145. isset($data['buyerMessage']) && $content .= "备注: " . !empty($data['buyerMessage']) ? $data['buyerMessage'] : '无' . "\n";
  146. if (!empty($data['qr'])) {
  147. $content .= str_repeat('.', 32);
  148. $content .= "<center>二维码</center>";
  149. $content .= "<QR>{$data['qr']}</QR>";
  150. } else {
  151. $content .= str_repeat('.', 32);
  152. $content .= "<center>二维码</center>";
  153. $content .= "<QR>{$data['orderSn']}</QR>";
  154. }
  155. $content .= str_repeat('.', 32);
  156. $content .= "<center>订单号</center>";
  157. $content .= "<BR3>{$data['orderSn']}</BR3>";
  158. $content .= "<center></center>";
  159. $content .= "<FS><center>****** 完 ******</center></FS>";
  160. return $content;
  161. }
  162. /**
  163. * @var string
  164. */
  165. protected $cachePrefix = 'printer.yiLianYun.token.';
  166. /**
  167. * @return array
  168. */
  169. public function getRefreshedToken(): array
  170. {
  171. return $this->getToken(true);
  172. }
  173. /**
  174. * @param bool $refresh
  175. * @return array|object
  176. * @throws NotFoundHttpException
  177. */
  178. public function getToken(bool $refresh = false): array
  179. {
  180. $cacheKey = $this->getCacheKey();
  181. if (!$refresh && Yii::$app->cache->exists($cacheKey)) {
  182. return Yii::$app->cache->get($cacheKey);
  183. }
  184. $token = $this->requestToken();
  185. $this->setToken($token->access_token, $token->refresh_token, $token->expires_in);
  186. return ArrayHelper::toArray($token);
  187. }
  188. /**
  189. * @param string $token
  190. * @param int $lifetime
  191. * @return $this
  192. * @throws NotFoundHttpException
  193. */
  194. public function setToken(string $token, string $refresh_token, int $lifetime = 7200)
  195. {
  196. $status = Yii::$app->cache->set($this->getCacheKey(), [
  197. 'access_token' => $token,
  198. 'refresh_token' => $refresh_token,
  199. 'expireIn' => $lifetime - 500,
  200. ], $lifetime);
  201. if ($status == false || !Yii::$app->cache->exists($this->getCacheKey())) {
  202. throw new NotFoundHttpException('Failed to cache cloud token.');
  203. }
  204. return $this;
  205. }
  206. /**
  207. * @return $this
  208. */
  209. public function refresh()
  210. {
  211. $this->getToken(true);
  212. return $this;
  213. }
  214. /**
  215. * @return mixed|object
  216. */
  217. public function requestToken()
  218. {
  219. $client = new YlyOauthClient($this->config);
  220. return $client->getToken();
  221. }
  222. /**
  223. * @return string
  224. */
  225. protected function getCacheKey()
  226. {
  227. return $this->cachePrefix;
  228. }
  229. }
粤ICP备19079148号