site_id = $siteId; $this->templateInfo=config('alipay.templateInfo'); } /** * Common: 小程序发布记录 查询集合 * Author: wu-hui * Time: 2022/12/29 18:38 * @return Db */ private function appletReleaseSelectCollection($type){ return Db::name('applet_release') ->where('site_id',$this->site_id) ->where('type',$type); } /** * Common: 获取已发布的最新版本 * Author: wu-hui * Time: 2023/01/03 16:41 * @return string */ public function newestVersion():string{ $version = (string)$this->appletReleaseSelectCollection(1) ->order(['create_time'=>'desc','id'=>'desc']) ->value('version'); return !empty($version) ? $version : '0.0.0'; } /** * Common: 判断:当前版本是否为最新版本 * Author: wu-hui * Time: 2023/01/03 17:07 * @return bool */ public function isNewestVersion():bool{ $version = (string) config('alipay.templateInfo.template_version');// 当前系统版本 $newestVersion = (string)$this->newestVersion();// 最新版本 return (boolean)version_compare($version, $newestVersion, '>'); } /** * Common: 发布流程处理 —— 开始处理 * Author: wu-hui * Time: 2023/01/04 10:49 * @param $type * @param $id * @return array */ public function publishingInit($type,$id){ try{ // 根据操作类型获取对应信息 $config = $this->publishingConfig($type); [$params,$textParams] = $this->publishingParams($type,$id); // 发起请求 $result = (new MinCode($this->site_id))->requestApi($config['api'], $params,$textParams); $result = $result[$config['result_key']] ?? ['code' => 0]; if($result['code'] == 10000) { $res = $this->resultProcessing($type,$id,$result); if($res) return success(0,$res); else return $this->success(); }else{ return $this->error('',$result['sub_msg']); } }catch(\Exception $e){ return $this->error('',$e->getMessage()); } } /** * Common: 发布流程处理 —— 根据操作类型获取配置信息 * Author: wu-hui * Time: 2023/01/04 10:09 * @param $type * @return string[] * @throws Exception */ private function publishingConfig($type):array{ $list = [ 'delete' => [ 'api' => 'alipay.open.mini.version.delete', // 请求接口 'result_key' => 'alipay_open_mini_version_delete_response',// 返回结果字段名称 ], 'release_experience_version' => [ 'api' => 'alipay.open.mini.experience.create', 'result_key' => 'alipay_open_mini_experience_create_response', ], 'cancel_experience_version' => [ 'api' => 'alipay.open.mini.experience.cancel', 'result_key' => 'alipay_open_mini_experience_cancel_response', ], 'see_experience_version' => [ 'api' => 'alipay.open.mini.experience.query', 'result_key' => 'alipay_open_mini_experience_query_response', ], 'audit_submit' => [ 'api' => 'alipay.open.mini.version.audit.apply', 'result_key' => 'alipay_open_mini_version_audit_apply_response', ], 'audit_cancel' => [ 'api' => 'alipay.open.mini.version.audit.cancel', 'result_key' => 'alipay_open_mini_version_audit_cancel_response', ], 'audited_cancel' => [ 'api' => 'alipay.open.mini.version.audited.cancel', 'result_key' => 'alipay_open_mini_version_audited_cancel_response', ], 'version_online' => [ 'api' => 'alipay.open.mini.version.online', 'result_key' => 'alipay_open_mini_version_online_response', ], 'version_gray_online' => [ 'api' => 'alipay.open.mini.version.gray.online', 'result_key' => 'alipay_open_mini_version_gray_online_response', ], 'version_gray_cancel' => [ 'api' => 'alipay.open.mini.version.gray.cancel', 'result_key' => 'alipay_open_mini_version_gray_cancel_response', ], 'version_offline' => [ 'api' => 'alipay.open.mini.version.offline', 'result_key' => 'alipay_open_mini_version_offline_response', ], 'version_rollback' => [ 'api' => 'alipay.open.mini.version.rollback', 'result_key' => 'alipay_open_mini_version_rollback_response', ], 'version_upload' => [ 'api' => 'alipay.open.mini.version.upload', 'result_key' => 'alipay_open_mini_version_upload_response', ], ]; if($list[$type]) return $list[$type]; else throw new Exception('无效的操作!'); } /** * Common: 发布流程处理 —— 根据操作类型生成接口请求参数 * Author: wu-hui * Time: 2023/01/04 10:32 * @param $type * @param $id * @return array[] * @throws Exception */ private function publishingParams($type,$id){ $params = $textParams = []; // 根据类型进行对应的操作 switch($type){ case 'delete': case 'release_experience_version': case 'cancel_experience_version': case 'see_experience_version': case 'audit_cancel': case 'audited_cancel': case 'version_online': case 'version_gray_cancel': case 'version_offline': case 'version_rollback': $params = [ 'app_version' => $this->getVersion($id), 'bundle_id' => $this->bundle_id, ]; break; case 'audit_submit': $version = $this->getVersion($id); $textParams = [ 'region_type' => 'CHINA', 'version_desc' => "发布{$version}版本", 'app_version' => $version, //开发版本 模板ID 'bundle_id' => $this->bundle_id, 'speed_up' => 'false', 'auto_online' => 'auto_online' ]; break; case 'version_gray_online': $params = [ 'app_version' => $this->getVersion($id), 'gray_strategy' => 'p10',// 枚举支持:p10、p30、p50 'bundle_id' => $this->bundle_id, ]; break; case 'version_upload': // 获取最新版本 $isNewestVersion = (new AliPayApplet($this->site_id))->isNewestVersion(); if(!$isNewestVersion) throw new Exception('当前版本为最新版本,请勿重复发布!'); // 获取默认门店id $storeInfo =Db::name('store') ->where('site_id',$this->site_id) ->where('is_default',1) ->field('store_id,store_id,store_name') ->find(); if(empty($storeInfo)) throw new Exception('默认门店不存在,请添加后进行操作!'); // 判断:是否存在小程序配置信息 $hasAccount = Db::name('uni_account')->where('site_id',$this->site_id)->value('id'); if($hasAccount <= 0) throw new Exception('请先配置小程序!'); $ext = [ 'extEnable' => true, 'ext' => [ 'site_id' => $this->site_id, 'store_id' => $storeInfo['store_id'], ], 'window'=>[ 'defaultTitle'=>$storeInfo['store_name'] ], ]; $params = [ 'template_version' => $this->templateInfo['template_version'],// 小程序模板版本号 'ext' => json_encode($ext),//自定义参数 'template_id' => $this->templateInfo['template_id'],// 小程序模板 APPID 'app_version' => $this->templateInfo['template_version'],//商家小程序版本号 'bundle_id' => $this->bundle_id, ]; break; default: throw new Exception('无效的操作!'); } return [$params,$textParams]; } /** * Common: 发布流程处理 —— 根据id获取版本信息 * Author: wu-hui * Time: 2023/01/04 10:18 * @param $id * @return mixed * @throws Exception */ private function getVersion($id){ $version = Db::name('applet_release')->where('id',$id)->value('version'); if(!$version) throw new Exception('版本不存在!'); return $version; } /** * Common: 发布流程处理 —— 请求结果处理 * Author: wu-hui * Time: 2023/01/04 10:46 * @param $type * @param $id * @param $result * @return string * @throws \think\db\exception\DbException */ private function resultProcessing($type,$id,$result){ $returnData = ''; switch($type){ case 'delete': Db::name('applet_release')->where('id',$id)->delete(); break; // 删除版本 case 'release_experience_version': $this->appletReleaseSelectCollection(1)->update(['is_experience_version'=>0]); Db::name('applet_release')->where('id',$id)->update(['is_experience_version'=>1]); break;// 发布体验版本 case 'cancel_experience_version': Db::name('applet_release')->where('id',$id)->update(['is_experience_version'=>0]); break;// 取消体验版发布 case 'see_experience_version': $statusText = [ 'expVersionPackged' => '体验版打包成功', 'expVersionPackaging' => '体验版打包中', 'notExpVersion' => '非体验版', ]; $returnData = $statusText[$result['status']]; break;// 体验版状态查看 case 'audit_submit': Db::name('applet_release')->where('id',$id)->update(['version_status'=> 'AUDITING']); break;// 提交审核 case 'audit_cancel': case 'audited_cancel': Db::name('applet_release')->where('id',$id)->update(['version_status'=> 'INIT']); break;// 撤销审核 & 退回开发 case 'version_online': Db::name('applet_release')->where('id',$id)->update(['version_status'=> 'RELEASE']); break;//上架 case 'version_gray_online': Db::name('applet_release')->where('id',$id)->update(['version_status'=> 'GRAY']); break;//灰度上架 case 'version_gray_cancel': Db::name('applet_release')->where('id',$id)->update(['version_status'=> 'WAIT_RELEASE']); break;//结束灰度 case 'version_offline': Db::name('applet_release')->where('id',$id)->update(['version_status'=> 'OFFLINE']); break;// 下架 case 'version_rollback': $this->versionSee($id); break;// 回滚 case 'version_upload': $version = config('alipay.templateInfo.template_version'); $data = [ 'site_id' => $this->site_id, 'version' => $version, 'type' => 1, 'ali_create_status' => $result['create_status'], 'version_status' => 'INIT', 'create_time' => time(), ]; Db::name('applet_release')->insert($data); break;// 发布新版本 } return $returnData; } /** * Common: 版本管理 —— 所有版本同步 * Author: wu-hui * Time: 2022/12/30 9:58 * @return array * @throws \Exception */ public function versionSynchronization(){ $params = [ 'bundle_id' => $this->bundle_id, // 版本状态:INIT=开发中,AUDITING=审核中,AUDIT_REJECT=审核驳回,WAIT_RELEASE=待上架,BASE_AUDIT_PASS=准入不可营销,GRAY=灰度中,RELEASE=已上架,OFFLINE=已下架,AUDIT_OFFLINE: 已下架 'version_status' => 'INIT,AUDITING,AUDIT_REJECT,WAIT_RELEASE,BASE_AUDIT_PASS,GRAY,RELEASE,OFFLINE,AUDIT_OFFLINE', ]; $result = (new MinCode($this->site_id))->requestApi('alipay.open.mini.version.list.query', $params); $result = $result['alipay_open_mini_version_list_query_response']; if($result['code'] == 10000) { // 同步版本信息 $appVersionInfos = $result['app_version_infos'] ?? []; $hasList = $this->appletReleaseSelectCollection(1)->column('version','id'); $hasListIds = array_flip($hasList); $insertData = []; $updateData = []; foreach($appVersionInfos as $val){ if(!in_array($val['app_version'],$hasList)){ $insertData[] = [ 'site_id' => $this->site_id, 'version' => $val['app_version'], 'type' => 1, 'ali_create_status' => 0, 'version_status' => $val['version_status'], 'create_time' => strtotime($val['create_time']), ]; }else{ $updateData[] = [ 'id' => $hasListIds[$val['app_version']], 'version_status' => $val['version_status'], ]; } } Db::name('applet_release')->insertAll($insertData); (new NewBaseModel(['table_name'=>'applet_release']))->saveAll($updateData); return $this->success(); }else{ return $this->error('',$result['sub_msg']); } } /** * Common: 版本管理 —— 查询小程序版本构建状态 * Author: wu-hui * Time: 2022/12/29 17:45 * @param $version * @param $id * @return array|mixed * @throws \think\db\exception\DbException */ public function versionBuildQuery($version,$id){ $params = [ 'app_version' => $version, 'bundle_id' => $this->bundle_id, ]; $result = (new MinCode($this->site_id))->requestApi('alipay.open.mini.version.build.query', $params); $result = $result['alipay_open_mini_version_build_query_response']; if($result['code'] == 10000) { Db::name('applet_release')->where('id',$id)->update(['ali_create_status'=>$result['create_status']]); return $result['create_status']; }else{ return $this->error('',$result['sub_msg']); } } /** * Common: 版本管理 —— 版本详情查询 * Author: wu-hui * Time: 2022/12/30 16:54 * @param $id * @return array * @throws \think\db\exception\DbException */ public function versionSee($id){ $version = Db::name('applet_release')->where('id',$id)->value('version'); if(!$version) $this->error('','版本不存在!'); $params = [ 'app_version' => $version, 'bundle_id' => $this->bundle_id, ]; $result = (new MinCode($this->site_id))->requestApi('alipay.open.mini.version.detail.query', $params); $result = $result['alipay_open_mini_version_detail_query_response']; if($result['code'] == 10000) { Db::name('applet_release')->where('id',$id)->update(['version_status'=>$result['status']]); return success(0,'版本详情',$result); }else{ return $this->error('',$result['sub_msg']); } } /** * Common: 生成小程序推广二维码 * Author: wu-hui * Time: 2023/01/03 14:12 * @return array */ public function qrcodeCreate(){ $cacheName = 'alipay_open_app_qrcode_create_response_'.$this->site_id; // 缓存操作 $result = cache($cacheName); if($result){ return $this->success($result); }else{ // 获取默认门店id $storeId = (int)Db::name('store') ->where('site_id',$this->site_id) ->where('is_default',1) ->value('store_id'); if($storeId <= 0) $this->error('','默认门店不存在,请添加后进行操作!'); $params = [ 'url_param' => 'pages/index/index',// 访问页面路径 'query_param' => 'site_id='.$this->site_id.'&store_id='.$storeId,// 小程序的启动参数 'describe' => '小程序预览',//对应的二维码描述 'color' => '', 'size' => 'l',// 合成后图片的大小(s -- 8cm, m -- 12cm, l -- 30cm) ]; $result = (new MinCode($this->site_id))->requestApi('alipay.open.app.qrcode.create', $params); $result = $result['alipay_open_app_qrcode_create_response']; // 返回结果 if($result['code'] == 10000) { cache($cacheName,$result); return $this->success($result); }else{ return $this->error('',$result['sub_msg']); } } } public function queryTestQrcode($version){ $params['app_version']=$version; // (new MinCode($this->site_id))->requestApi('alipay.open.mini.experience.create', $params); $result = (new MinCode($this->site_id))->requestApi('alipay.open.mini.experience.query', $params); $result = $result['alipay_open_mini_experience_query_response']; // 返回结果 if($result['code'] == 10000) { return $this->success($result); }else{ return $this->error('',$result['sub_msg']); } } /** * Common: 登录 —— 获取用户基本信息 * Author: wu-hui * Time: 2023/01/05 13:33 * @param string $code * @param string $grantType * @param string $refreshToken * @return array */ public function loginBaseInfo($code = '',$grantType = 'authorization_code',$refreshToken = ''){ // authorization_code=换取授权令牌access_token;refresh_token=刷新获取新授权令牌。 $textParams = [ 'grant_type' => $grantType ]; if($grantType == 'refresh_token') $textParams['refresh_token'] = $refreshToken; else if($grantType == 'authorization_code') $textParams['code'] = $code; // 发起请求 $result = (new MinCode($this->site_id))->requestApi('alipay.system.oauth.token',[], $textParams); $result = $result['alipay_system_oauth_token_response'] ?? $result['error_response']; // 返回结果 if(array_key_exists('user_id',$result)) { return $this->success($result); }else{ return $this->error('',$result['sub_msg']); } } /** * Common: 登录 —— 获取用户详细信息 * Author: wu-hui * Time: 2023/01/05 14:04 * @param $authToken * @return array */ public function loginDetailsInfo($authToken){ // 发起请求 $result = (new MinCode($this->site_id))->requestMemberApi($authToken,'alipay.user.info.share'); $result = $result['alipay_user_info_share_response'] ?? $result['error_response']; // 返回结果 if($result['code'] == 10000) { return $this->success($result); }else{ return $this->error('',$result['sub_msg']); } } }