Miniapp.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
  4. * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
  5. * @author pillar<ltmn@qq.com>
  6. * 小程序管理
  7. */
  8. namespace app\system\controller\passport;
  9. use app\common\facade\WechatProgram;
  10. use app\common\model\SystemMemberMiniappOrder;
  11. use app\common\model\SystemMiniapp;
  12. use app\common\model\SystemMemberMiniappCode;
  13. use app\common\facade\Qrcode;
  14. use think\facade\Request;
  15. use app\common\facade\Upload;
  16. class Miniapp extends Common{
  17. protected $program;
  18. public function initialize() {
  19. parent::initialize();
  20. if($this->user->lock_config){
  21. $this->error('你账户锁定配置权限');
  22. }
  23. if($this->user->parent_id){
  24. $this->error('无权限访问,只有创始人身份才允许使用.');
  25. }
  26. if(!$this->member_miniapp_id){
  27. $this->error('未找到所属应用,请先开通应用.');
  28. }
  29. if ($this->member_miniapp->miniapp->types == 'mp' || $this->member_miniapp->miniapp->types == 'app'){
  30. $this->error('非小程序应用',url('system/passport.setting/index'));
  31. }
  32. if($this->member_miniapp->miniapp->is_openapp){
  33. $this->error('非SaaS应用请自行配置应用',url('system/passport.setting/index'));
  34. }
  35. $this->program = WechatProgram::isTypes($this->member_miniapp_id);
  36. if(!$this->program){
  37. $this->error('小程序还未授权,禁止操作');
  38. }
  39. }
  40. /**
  41. * 提交审核
  42. * @access public
  43. */
  44. public function submitPass(){
  45. $getcate = $this->program->code->getCategory(); //小程序权限目录
  46. if($getcate['errcode'] == -1){
  47. $this->error($getcate['errmsg']);
  48. }
  49. $page = $this->program->code->getPage(); //小程序页面
  50. if($page['errcode'] != 0){
  51. $this->error($page['errmsg']);
  52. }
  53. $cate = [];
  54. foreach ($getcate['category_list'] as $key => $value) {
  55. $cate[$key]['name'] = empty($value['third_class']) ? $value['first_class'].'-'.$value['second_class'] : $value['first_class'].'-'.$value['second_class'].'-'.$value['third_class'];
  56. $cate[$key]['id'] = empty($value['third_id']) ? $value['first_id'].'-'.$value['second_id'] : $value['first_id'].'-'.$value['second_id'].'-'.$value['third_id'];
  57. }
  58. $view['cate'] = $cate;
  59. $view['page'] = $page['page_list'];
  60. $view['id'] = $this->member_miniapp_id;
  61. return view()->assign($view);
  62. }
  63. /**
  64. * 以下部分是微信小程序官方操作
  65. * ###########################################
  66. * 设置域名
  67. */
  68. public function domain(){
  69. if(request()->isAjax()){
  70. $rel = SystemMemberMiniappCode::where(['member_miniapp_id'=>$this->member_miniapp_id,'member_id' => $this->user->id])->find();
  71. if(!empty($rel) && $rel->is_commit == 3 && $rel->state == 1){
  72. return enjson(0,'审核中小程序禁止设置业务域名');
  73. }
  74. $url['action'] = 'set';
  75. $url['requestdomain'] = ['https://res.'.Request::rootDomain(),'https://'.$this->web['url']];
  76. $url['wsrequestdomain'] = ['wss://res.'.Request::rootDomain(),'wss://'.$this->web['url']];
  77. $url['uploaddomain'] = $url['requestdomain'];
  78. $url['downloaddomain'] = $url['requestdomain'];
  79. $miniapp = WechatProgram::isTypes($this->member_miniapp_id);
  80. if(!$miniapp){
  81. return enjson(0,'小程序还未授权,禁止操作');
  82. }
  83. $rel = $this->program->domain->modify($url);
  84. if($rel['errcode'] > 0){
  85. return enjson(0,'服务器域名:'.$rel['errmsg']);
  86. }
  87. $this->program->domain->setWebviewDomain([Request::scheme().'://'.Request::rootDomain()]); //设置业务域名
  88. $data['is_commit'] = 2;
  89. $data['member_miniapp_id'] = $this->member_miniapp_id;
  90. $data['member_id'] = $this->user['id'];
  91. SystemMemberMiniappCode::edit(['member_miniapp_id'=>$this->member_miniapp_id,'member_id' =>$this->user->id],$data);
  92. return enjson(200,'设置域名成功');
  93. }
  94. }
  95. /**
  96. * 上传代码
  97. */
  98. public function upCode(){
  99. if(request()->isAjax()){
  100. $rel = SystemMemberMiniappCode::where(['member_miniapp_id'=>$this->member_miniapp_id,'member_id' => $this->user->id])->find();
  101. if(!empty($rel) && $rel->is_commit == 3 && $rel->state == 1){
  102. return enjson(0,'审核中小程序禁止上传代码');
  103. }
  104. //读取小程序信息
  105. $app = SystemMiniapp::where(['id'=>$this->member_miniapp->miniapp_id,'is_lock'=>0])->find();
  106. if(empty($app)){
  107. return json(['code'=>200,'msg'=>'小程序不存在或暂停服务']);
  108. }
  109. //上传参数
  110. $miniapp = WechatProgram::isTypes($this->member_miniapp_id);
  111. if(!$miniapp){
  112. return json(['code'=>0,'msg'=>'小程序还未授权,禁止操作']);
  113. }
  114. $extJson = [
  115. 'extAppid' => $this->member_miniapp->miniapp_appid,
  116. 'ext' => [
  117. "name" => $this->member_miniapp->appname,
  118. "attr" => [
  119. 'host' => 'https://'.Request::host(),
  120. 'miniapp' => $this->member_miniapp->service_id,
  121. ],
  122. ],
  123. "window" => ['navigationBarTitleText' => $this->member_miniapp->appname]
  124. ];
  125. $miniapp = $this->program->code->commit($app->template_id,json_encode($extJson),$app->version,$app->describe);
  126. //更新信息
  127. $data['is_commit'] = 3;
  128. $data['member_miniapp_id'] = $this->member_miniapp_id;
  129. $data['member_id'] = $this->user->id;
  130. SystemMemberMiniappCode::edit(['member_miniapp_id'=>$this->member_miniapp_id,'member_id' =>$this->user->id],$data);
  131. return json(['code'=>200,'msg'=>'上传代码成功']);
  132. }
  133. }
  134. /**
  135. * 拉取二维码
  136. */
  137. public function getQrcode(){
  138. if(request()->isAjax()){
  139. $miniapp = WechatProgram::isTypes($this->member_miniapp_id);
  140. if(!$miniapp){
  141. return enjson(0,'小程序还未授权,禁止操作');
  142. }
  143. try {
  144. $qrcode = $this->program->code->getQrCode();
  145. } catch (\Exception $e) {
  146. return enjson(0,'小程序还未授权,禁止操作');
  147. }
  148. $data['trial_qrcode'] = Qrcode::saveQcode($qrcode,'miniapp_'.$this->member_miniapp_id);
  149. $data['member_miniapp_id'] = $this->member_miniapp_id;
  150. $data['member_id'] = $this->user->id;
  151. SystemMemberMiniappCode::edit(['member_miniapp_id'=>$this->member_miniapp_id,'member_id' =>$this->user->id],$data);
  152. return enjson(200,'读取体验二维码成功');
  153. }else{
  154. return enjson(0,'读取体验二维码失败');
  155. }
  156. }
  157. /**
  158. * 提交审核
  159. */
  160. public function addPass(){
  161. if(request()->isAjax()){
  162. $param = [
  163. 'cate' => $this->request->param('cate'),
  164. 'scene' => $this->request->param('scene/a'),
  165. 'other_scene_desc' => $this->request->param('other_scene_desc/s'),
  166. 'method' => $this->request->param('method/a'),
  167. 'has_audit_team' => $this->request->param('has_audit_team/d'),
  168. 'audit_desc' => $this->request->param('has_audit_team/d'),
  169. 'feedback_info' => $this->request->param('feedback_info/s'),
  170. 'imgs' => $this->request->param('imgs/a',[]),
  171. ];
  172. $validate = $this->validate($param,'open.addpass');
  173. if(true !== $validate){
  174. return json(['code'=>0,'msg'=>$validate]);
  175. }
  176. //UGC内容生成
  177. $ugc = [];
  178. if($param['scene'][0] || ($param['scene'][0] == 0 && count($param['scene']) >= 2)){
  179. $ugc['scene'] = $param['scene'];
  180. if(in_array(5,$param['scene']) && empty($param['other_scene_desc'])){
  181. return enjson(0,'其它UGC场景的必须填写UGC说明');
  182. }
  183. if(in_array(5,$param['scene'])){
  184. $ugc['other_scene_desc'] = $param['other_scene_desc'];
  185. }
  186. if($param['scene'][0] == 0){
  187. unset($param['scene'][0]);
  188. $param['scene'] = array_values($param['scene']);
  189. }
  190. $ugc['scene'] = $param['scene'];
  191. $ugc['method'] = $param['method'];
  192. $ugc['has_audit_team'] = $param['has_audit_team'];
  193. $ugc['audit_desc'] = $param['audit_desc'];
  194. }
  195. $miniapp = WechatProgram::isTypes($this->member_miniapp_id);
  196. if(!$miniapp){
  197. return json(['code'=>0,'msg'=>'小程序还未授权,禁止操作']);
  198. }
  199. //上传小程序截图
  200. $preview_info = [];
  201. if(!empty($param['imgs'])){
  202. $data = Upload::uploadWechatWeapp($this->member_miniapp_id,$param['imgs']);
  203. if(!empty($data)){
  204. $preview_info['pic_id_list'] = array_column($data,'media_id');
  205. }
  206. }
  207. //读取分类
  208. /**
  209. * $getcate = $this->program->code->getCategory();
  210. * if($getcate['errcode'] == -1){
  211. * $this->error($getcate['errmsg']);
  212. * }
  213. * $itemlist = [array_merge(["address"=> $param['page'],"tag"=> $param['tag'],"title"=> $param['name']],$getcate['category_list'][$param['cate']])];
  214. */
  215. //提交审核单
  216. $rel = $this->program->code->submitAudit([],$preview_info,$ugc,$param['feedback_info']);
  217. if($rel['errcode'] != 0){
  218. return json(['code'=>0,'msg'=>'提交审核:'.$rel['errmsg']]);
  219. }
  220. $code_data['is_commit'] = 3;
  221. $code_data['state'] = 1;
  222. $code_data['member_miniapp_id'] = $this->member_miniapp_id;
  223. $code_data['member_id'] = $this->user->id;
  224. $code_data['auditid'] = $rel['auditid'];
  225. SystemMemberMiniappCode::edit(['member_miniapp_id' => $this->member_miniapp_id,'member_id' => $this->user->id],$code_data);
  226. return json(['code'=>200,'msg'=>'成功提交审核','url'=>url('system/passport.setting/index')]);
  227. }else{
  228. return json(['code'=>0,'msg'=>'读取体验二维码失败']);
  229. }
  230. }
  231. /**
  232. * 强制撤销审核
  233. * @access public
  234. */
  235. public function restPass(){
  236. if(request()->isAjax()){
  237. $miniapp = WechatProgram::isTypes($this->member_miniapp_id);
  238. if(!$miniapp){
  239. return json(['code'=>0,'msg'=>'小程序还未授权,禁止操作']);
  240. }
  241. $rel = $this->program->code->withdrawAudit();
  242. if($rel['errcode'] == 0){
  243. $data['is_commit'] = 2;
  244. $data['state'] = 0;
  245. $data['member_miniapp_id'] = $this->member_miniapp_id;
  246. $data['member_id'] = $this->user->id;
  247. SystemMemberMiniappCode::edit(['member_miniapp_id'=>$this->member_miniapp_id,'member_id' => $this->user->id],$data);
  248. return json(['code'=>200,'msg'=>'撤回成功']);
  249. }else{
  250. return json(['code'=>0,'msg'=>'撤回失败:'.$rel['errmsg']]);
  251. }
  252. }else{
  253. return json(['code'=>0,'msg'=>'读取体验二维码失败']);
  254. }
  255. }
  256. /**
  257. * 发布小程序
  258. */
  259. public function sendApp(){
  260. if(request()->isAjax()){
  261. $rel = WechatProgram::isTypes($this->member_miniapp_id)->code->release();
  262. switch ($rel['errcode']) {
  263. case 0:
  264. //修改发布状态
  265. SystemMemberMiniappCode::edit(['member_miniapp_id' => $this->member_miniapp_id,'member_id' =>$this->user->id],['is_commit' => 4,'state' => 0,'member_miniapp_id'=>$this->member_miniapp_id,'member_id'=>$this->user->id]);
  266. //同步本地版本
  267. SystemMemberMiniappOrder::where(['id' => $this->member_miniapp->miniapp_order_id])->update(['update_var' => $this->member_miniapp->miniapp->template_id]);
  268. return json(['code'=>200,'msg'=>'发布成功']);
  269. break;
  270. case 85019:
  271. return json(['code'=>0,'msg'=>'没有审核版本']);
  272. break;
  273. case 85020:
  274. return json(['code'=>0,'msg'=>'审核状态未满足发布']);
  275. break;
  276. case -1:
  277. return json(['code'=>0,'msg'=>'系统繁忙']);
  278. break;
  279. default:
  280. return json(['code'=>0,'msg'=>$rel['errmsg']]);
  281. break;
  282. }
  283. }else{
  284. return json(['code'=>0,'msg'=>'小程序发布失败']);
  285. }
  286. }
  287. }