MiniProgramService.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <?php
  2. namespace backend\modules\mall\services;
  3. use common\enums\RabbitMqEnum;
  4. use common\events\mall\GetMiniProgramAdsEvent;
  5. use common\helpers\CurlHelper;
  6. use common\logic\wechat\WechatMiniProgramLogic;
  7. use common\models\wechat\WechatMiniProgramUpload;
  8. use Yii;
  9. /**
  10. * 微信小程序服务
  11. * @package backend\modules\mall\services
  12. */
  13. class MiniProgramService extends BaseService
  14. {
  15. /**
  16. * @var string
  17. */
  18. const UPLOAD_URI = 'http://1.14.248.220:3000';
  19. /**
  20. * 获取小程序配置
  21. *
  22. * @return array
  23. */
  24. public function getMiniProgramConfig()
  25. {
  26. $mini_program = Yii::$app->services->setting->mall->get($this->mall_id, 'mini_program');
  27. if(!isset($mini_program['version'])) $mini_program['version'] = '';
  28. if(!isset($mini_program['desc'])) $mini_program['desc'] = '';
  29. if(!isset($mini_program['secret_key_file'])) $mini_program['secret_key_file'] = '';
  30. return $mini_program;
  31. }
  32. /**
  33. * 保存小程序配置
  34. *
  35. * @param array $data
  36. * @return boolean
  37. */
  38. public function setMiniProgramConfig(array $data)
  39. {
  40. // 保存数据
  41. $trans = Yii::$app->db->beginTransaction();
  42. try {
  43. Yii::$app->services->setting->mall->set($this->mall_id, ['mini_program' => $data]);
  44. $trans->commit();
  45. } catch (\Exception $e) {
  46. $trans->rollBack();
  47. return $this->error($e->getMessage());
  48. }
  49. WechatMiniProgramLogic::setMsgJumpPath(['mall_id' => $this->mall_id]);
  50. return true;
  51. }
  52. /**
  53. * 获取小程序上传日志分页列表
  54. *
  55. * @param array $params
  56. * @return array
  57. */
  58. public function getTaskPageList(array $params = [])
  59. {
  60. return WechatMiniProgramUpload::getPaginationList($this->getLimit($params), function ($query) {
  61. $query->where(['mall_id' => $this->mall_id])->select([
  62. 'api_domain', 'app_id', 'created_at', 'desc', 'id', 'is_live', 'mall_id', 'mall_sign', 'plugins', 'static_domain', 'status', 'updated_at', 'version', 'is_review',
  63. ]);
  64. }, 'id desc');
  65. }
  66. public function getTaskLog($params = []) {
  67. $info = WechatMiniProgramUpload::getOne([
  68. ['mall_id' => $this->mall_id],
  69. ['id' => $params['id']]
  70. ], true, [], 'id desc', 'output');
  71. return $info;
  72. }
  73. /**
  74. * 添加小程序上传日志
  75. *
  76. * @param array $data
  77. * @return boolean
  78. */
  79. public function addTaskLog(array $data)
  80. {
  81. $data['mall_id'] = $this->mall_id;
  82. // version判断版本号
  83. $last_version = WechatMiniProgramUpload::getLastVersion($this->mall_id);
  84. if ($last_version && $data['version'] <= $last_version) {
  85. return $this->error('版本号必须大于' . $last_version);
  86. }
  87. if (WechatMiniProgramUpload::getTaskByVersion($this->mall_id, $data['version'])) {
  88. return $this->error('版本号已存在');
  89. }
  90. // 保存数据
  91. $trans = Yii::$app->db->beginTransaction();
  92. try {
  93. $model = WechatMiniProgramUpload::addTask($data);
  94. $model->changeAllTaskReview();
  95. $trans->commit();
  96. } catch (\Exception $e) {
  97. $trans->rollBack();
  98. return $this->error($e->getMessage());
  99. }
  100. // 获取是否属于docker部署方式
  101. $is_docker_deploy = Yii::$app->params['is_docker_deploy'] ?? false;
  102. if ($is_docker_deploy) {
  103. // docker部署方式不支持异步上传,只能进行同步上传
  104. $res = WechatMiniProgramUpload::uploadMiniProgramCode(['id' => $model->id]);
  105. if ($res === false) return $this->error('上传失败');
  106. } else {
  107. // 队列处理
  108. Yii::$app->services->rabbitMq->push(
  109. RabbitMqEnum::EXCHANGE_TASK,
  110. RabbitMqEnum::TASK_QUEUE,
  111. ['id' => $model->id],
  112. WechatMiniProgramUpload::class,
  113. 'uploadMiniProgramCode'
  114. );
  115. }
  116. return true;
  117. }
  118. /**
  119. * 提交至微信审核小程序
  120. *
  121. * @return false|array
  122. */
  123. public function uploadToWechat()
  124. {
  125. $api_url = Yii::$app->services->setting->platform->get('system.api_url');
  126. if(empty($api_url)) return $this->error('api域名不能为空,请联系平台管理员');
  127. // 获取小程序配置
  128. $mini_program = $this->getMiniProgramConfig();
  129. if(empty($mini_program['app_id'])) return $this->error('请先填写appid,保存后,再提交微信审核');
  130. if(empty($mini_program['version'])) return $this->error('请先填写版本号,保存后,再提交微信审核');
  131. if(empty($mini_program['secret_key_file'])) return $this->error('请先上传密钥文件,保存后,再提交微信审核');
  132. if(empty($mini_program['desc'])) return $this->error('请先填写描述,保存后,再提交微信审核');
  133. $dir = dirname(dirname($_SERVER['DOCUMENT_ROOT']));
  134. $file_name = $dir . '/' . $mini_program['secret_key_file'];
  135. $result = CurlHelper::upload(self::UPLOAD_URI . '/upload', $file_name);
  136. if (!empty($result['errno'])) return $this->error($result['data']['msg']);
  137. $arr = explode('/', $mini_program['secret_key_file']);
  138. $file_name = array_pop($arr);
  139. $params = [
  140. 'app_id' => $mini_program['app_id'],
  141. 'api_url' => $api_url,
  142. 'file_name' => $file_name,
  143. 'version' => $mini_program['version'],
  144. 'desc' => $mini_program['desc'],
  145. 'is_live' => $mini_program['is_live'],
  146. 'sign' => $this->mall['mall_sign'],
  147. 'static' => Yii::getAlias("@attachurl"),
  148. ];
  149. $result = CurlHelper::post(self::UPLOAD_URI . '/api/upload', $params);
  150. if (!empty($result['errno'])) return $this->error($result['data']['msg']);
  151. return $result['data'];
  152. }
  153. /**
  154. * 获取小程序上传任务配置
  155. *
  156. * @return array
  157. */
  158. public function getTaskLogConfig()
  159. {
  160. $data = $this->getMiniProgramConfig();
  161. $next_version = WechatMiniProgramUpload::getNextVersion($this->mall_id);
  162. $data['api_domain'] = str_replace(['http://', 'https://'], '', Yii::getAlias('@apiUrl'));
  163. $data['static_domain'] = str_replace(['http://', 'https://'], '', Yii::getAlias('@attachurl'));
  164. $data['is_docker_deploy'] = Yii::$app->params['is_docker_deploy'] ?? 0;
  165. $data['version'] = $next_version;
  166. // 获取小程序拓展插件
  167. $event = new GetMiniProgramAdsEvent($this->mall_id);
  168. Yii::$app->services->events->dispatch($event);
  169. $data['addons_list'] = $event->getAdsList();
  170. return $data;
  171. }
  172. /**
  173. * 修改任务审核状态
  174. *
  175. * @param integer $id
  176. * @return boolean
  177. */
  178. public function changeTaskReview(int $id)
  179. {
  180. /**
  181. * @var WechatMiniProgramUpload|null $task
  182. */
  183. $task = WechatMiniProgramUpload::getOne([['mall_id' => $this->mall_id, 'id' => $id]]);
  184. if (empty($task)) return $this->error('任务不存在');
  185. $trans = Yii::$app->db->beginTransaction();
  186. try {
  187. $task->changeTaskReview();
  188. $trans->commit();
  189. } catch (\Exception $e) {
  190. $trans->rollBack();
  191. return $this->error($e->getMessage());
  192. }
  193. return true;
  194. }
  195. }