httpPostJson(); 访问链接 //new Client($app); 上传文件 parent::__construct($config); $this->store_id = $config['store_id']; $this->mini_id = $config['mini_id']; $this->app = (new WechatMini())::getWechatConfig($config['store_id'], $config['mini_id']); } // 提交申请 public function applyAuthAndIcp() { // $t = \Yii::$app->db->beginTransaction(); try { $app = $this->app; if (!$app) { throw new \Exception('小程序信息未找到'); } $this->baseClient = $baseClient = new BaseClient($app); $mini = StoreMini::findOne($this->mini_id); if (!$mini) { throw new \Exception('小程序信息查询失败'); } $store = Store::findOne($this->store_id); if (!$store) { throw new \Exception('商城信息查询失败'); } if (is_string($this->data)) { $this->data = json_decode($this->data, true); } $data = $this->data ?: [ 'auth_data' => [ 'contact_info' => [ 'name' => '', 'email' =>'' ], 'invoice_info' => [ 'invoice_type' => 2, 'electronic' => [ 'id' => '', 'desc' => '' ], 'vat' => [ 'enterprise_phone' => '', 'id' => '', 'enterprise_address' => '', 'bank_name' => '', 'bank_account' => '', 'desc' => '', ], ], 'customer_type' => 1, 'pay_type' => StoreMiniAuth::PAY_TYPE_SELF, // 'taskid' => '', 'qualification_other' => [// TODO 图片处理 ['media_id' => '', 'url' => ''] ['微信所需media_id' => '', '前端图片显示地址' => ''] '' ], 'account_name' => $mini->mini_nickname, 'account_name_type' => 1, 'account_supplemental' => [// TODO 图片处理 ['media_id' => '', 'url' => ''] ['微信所需media_id' => '', '前端图片显示地址' => ''] '' ], 'third_party_phone' => Option::get("platform_phone", 0, 'saas')['value'], 'service_appid' => Option::get("platform_wechat_fuwu_appid", 0, 'saas')['value'] ], 'icp_subject' => [ 'base_info' => [ 'type' => '', 'name' => '', 'province' => '', 'city' => '', 'district' => '', 'address' => '', 'comment' => '' ], 'organize_info' => [ 'certificate_type' => '', 'certificate_number' => '', 'certificate_address' => '', 'certificate_photo' => '', ], 'principal_info' => [ 'name' => '', 'mobile' => '', 'email' => '', 'emergency_contact' => '', 'certificate_type' => '', 'certificate_number' => '', 'certificate_validity_date_start' => '', 'certificate_validity_date_end' => '', 'certificate_photo_front' => '', 'certificate_photo_back' => '', 'authorization_letter' => '', 'verify_task_id' => '', ], 'legal_person_info' => [ 'name' => '', 'certificate_number' => '' ] ], 'icp_applets' => [ 'base_info' => [ 'service_content_types' => '', 'nrlx_details' => [ [ 'type' => 24, 'code' => '', 'media' => '' ] ], 'comment' => '' ], 'principal_info' => [ 'name' => '', 'mobile' => '', 'email' => '', 'emergency_contact' => '', 'certificate_type' => '', 'certificate_number' => '', 'certificate_validity_date_start' => '', 'certificate_validity_date_end' => '', 'certificate_photo_front' => '', 'certificate_photo_back' => '', 'authorization_letter' => '', 'verify_task_id' => '', ] ], 'icp_materials' => [ 'commitment_letter' => [ '' ], 'business_name_change_letter' => [ '' ], 'party_building_confirmation_letter' => [ '' ], 'promise_video' => [ '' ], 'authenticity_responsibility_letter' => [ '' ], 'authenticity_commitment_letter' => [ '' ], 'website_construction_proposal' => [ '' ], 'subject_other_materials' => [ '' ], 'applets_other_materials' => [ '' ], 'holding_certificate_photo' => [ '' ], ] ]; if (isset($data['auth_data']['third_party_phone']) && empty($data['auth_data']['third_party_phone'])) { $data['auth_data']['third_party_phone'] = Option::get("platform_phone", 0, 'saas')['value']; } else { $data['auth_data'] = array_merge($data['auth_data'], ['third_party_phone' => Option::get("platform_phone", 0, 'saas')['value']]); } if (intval($data['auth_data']['pay_type']) === StoreMiniAuth::PAY_TYPE_SERVICE) { if ($store->mini_auth_num <= 0) { throw new \Exception('当前商城认证代缴次数不足,请联系平台管理员'); } if (isset($data['auth_data']['service_appid']) && empty($data['auth_data']['service_appid'])) { $data['auth_data']['service_appid'] = Option::get('platform_wechat_fuwu_appid', 0, 'saas', '')['value']; } else { $data['auth_data'] = array_merge($data['auth_data'], ['service_appid' => Option::get('platform_wechat_fuwu_appid', 0, 'saas', '')['value']]); } } //处理ocr_data是json字符 且前端一直json不解密问题 $data['ocr_data'] = $this->handleJsonData($data['ocr_data']); $mini_auth_icp = StoreMiniAuthIcp::findOne(['store_id' => $this->store_id, 'mini_id' => $this->mini_id]) ?: new StoreMiniAuthIcp(); $mini_auth_icp->store_id = $this->store_id; $mini_auth_icp->mini_id = $this->mini_id; $mini_auth_icp->data = json_encode($data, JSON_UNESCAPED_UNICODE); $mini_auth_icp->ocr_data = json_encode($data['ocr_data'], JSON_UNESCAPED_UNICODE); if (!$mini_auth_icp->save()) { throw new \Exception(implode(';', array_values($mini_auth_icp->firstErrors))); } unset($data['ocr_data']); $data['icp_subject']['principal_info']['certificate_validity_date_start'] = date('Ymd', strtotime($data['icp_subject']['principal_info']['certificate_validity_date_start'])); if ($data['icp_subject']['principal_info']['certificate_validity_date_end'] !== '长期') { $data['icp_subject']['principal_info']['certificate_validity_date_end'] = date('Ymd', strtotime($data['icp_subject']['principal_info']['certificate_validity_date_end'])); } $data['icp_applets']['principal_info']['certificate_validity_date_start'] = date('Ymd', strtotime($data['icp_applets']['principal_info']['certificate_validity_date_start'])); if ($data['icp_applets']['principal_info']['certificate_validity_date_end'] !== '长期') { $data['icp_applets']['principal_info']['certificate_validity_date_end'] = date('Ymd', strtotime($data['icp_applets']['principal_info']['certificate_validity_date_end'])); } if (!in_array($data['auth_data']['customer_type'], [1, 12])) { throw new \Exception('身份类型枚举值错误'); } // 支付方式 if (!in_array($data['auth_data']['pay_type'], [StoreMiniAuth::PAY_TYPE_SERVICE, StoreMiniAuth::PAY_TYPE_SELF])) { throw new \Exception('支付方式枚举值错误'); } if (intval($data['auth_data']['pay_type']) === StoreMiniAuth::PAY_TYPE_SERVICE) {//支付方式 1:消耗服务商预购包 //发票信息,如果是服务商代缴模式,不需要改参数 // unset($data['auth_data']['invoice_info']); $data['auth_data']['invoice_info']['invoice_type'] = 1; if (empty($data['auth_data']['service_appid'])) { throw new \Exception('请选择服务市场appid'); } } else { // 发票类型 if (!in_array($data['auth_data']['invoice_info']['invoice_type'], [1, 2, 4])) { throw new \Exception('发票类型枚举值错误'); } //不开发票 if (intval($data['auth_data']['invoice_info']['invoice_type']) === 1) { unset($data['auth_data']['invoice_info']['vat'], $data['auth_data']['invoice_info']['electronic']); } // 电子发票 if (intval($data['auth_data']['invoice_info']['invoice_type']) === 2) { // 未填写电子发票开票信息 if (empty($data['auth_data']['invoice_info']['electronic'])) { throw new \Exception('未填写电子发票开票信息'); } // 未填写电子发票纳税识别号 if (empty($data['auth_data']['invoice_info']['electronic']['id'])) { throw new \Exception('未填写电子发票纳税识别号'); } unset($data['auth_data']['invoice_info']['vat']); } // 增值税专票 if (intval($data['auth_data']['invoice_info']['invoice_type']) === 4) { // 未填写电子发票开票信息 if (empty($data['auth_data']['invoice_info']['vat'])) { throw new \Exception('未填写增值税专票开票信息'); } // 未填写企业电话 if (empty($data['auth_data']['invoice_info']['vat']['enterprise_phone'])) { throw new \Exception('未填写企业电话'); } // 未填写电子发票纳税识别号 if (empty($data['auth_data']['invoice_info']['vat']['id'])) { throw new \Exception('未填写增值税专票纳税识别号'); } // 未填写企业注册地址 if (empty($data['auth_data']['invoice_info']['vat']['enterprise_address'])) { throw new \Exception('未填写企业注册地址'); } // 未填写企业开户银行 if (empty($data['auth_data']['invoice_info']['vat']['bank_name'])) { throw new \Exception('未填写企业开户银行'); } // 未填写企业银行账号 if (empty($data['auth_data']['invoice_info']['vat']['bank_account'])) { throw new \Exception('未填写企业银行账号'); } unset($data['auth_data']['invoice_info']['electronic']); } } //组装微信所需数据 //名称命中关键词-补充材料 if ($data['auth_data']['account_supplemental']) { $account_supplemental = []; foreach ($data['auth_data']['account_supplemental'] as $account_supplemental_item) { $account_supplemental[] = $account_supplemental_item['media_id']; } if (!empty($account_supplemental)) { $data['auth_data']['account_supplemental'] = $account_supplemental; } } //主体资质其他证明材料,最多上传10张图片 if ($data['auth_data']['qualification_other']) { $qualification_other = []; foreach ($data['auth_data']['qualification_other'] as $qualification_other_item) { $qualification_other[] = $qualification_other_item['media_id']; } if (!empty($qualification_other)) { $data['auth_data']['qualification_other'] = $qualification_other; } } if (count($data['auth_data']['qualification_other']) > 10) { throw new \Exception('主体资质其他证明材料,最多上传10张图片'); } // 小程序账号名称 if (empty($data['auth_data']['account_name'])) { throw new \Exception('需要填写小程序账号名称'); } // 小程序账号名称命名类型 if (!in_array($data['auth_data']['account_name_type'], [1, 2])) { throw new \Exception('小程序账号名称命名类型枚举值错误'); } // 第三方联系电话 if (empty($data['auth_data']['third_party_phone'])) { throw new \Exception('需要填写第三方联系电话'); } //备案资料验证 //主体额外信息 主体证件照片 media_id $certificate_photo = $data['icp_subject']['organize_info']['certificate_photo']; if ($certificate_photo) { $data['icp_subject']['organize_info']['certificate_photo'] = $certificate_photo['media_id']; } //主体负责人信息-负责人证件正面照片 $certificate_photo_front = $data['icp_subject']['principal_info']['certificate_photo_front']; if ($certificate_photo_front) { $data['icp_subject']['principal_info']['certificate_photo_front'] = $certificate_photo_front['media_id']; } //主体负责人信息-负责人证件背面照片 $certificate_photo_back = $data['icp_subject']['principal_info']['certificate_photo_back']; if ($certificate_photo_back) { $data['icp_subject']['principal_info']['certificate_photo_back'] = $certificate_photo_back['media_id']; } //主体负责人信息-授权书 $authorization_letter = $data['icp_subject']['principal_info']['authorization_letter']; if ($authorization_letter) { $data['icp_subject']['principal_info']['authorization_letter'] = $authorization_letter['media_id']; } //扫脸认证任务id(扫脸认证接口返回的task_id) $data['icp_subject']['principal_info']['verify_task_id'] = $mini_auth_icp->task_id; //前置审批项 if ($data['icp_applets']['base_info']['nrlx_details']) { foreach ($data['icp_applets']['base_info']['nrlx_details'] as $nrlx_index => $nrlx_item) { if (intval($nrlx_item['type']) === 24) {//以上都不涉及 $data['icp_applets']['base_info']['nrlx_details'][$nrlx_index] = [ 'type' => 24 ]; } else { $data['icp_applets']['base_info']['nrlx_details'][$nrlx_index]['media'] = $nrlx_item['media_id']; } } } else { $data['icp_applets']['base_info']['nrlx_details'] = [ [ 'type' => 24 ] ]; } if (empty($data['icp_applets']['base_info']['comment'])) { throw new \Exception('请具体描述小程序实际经营内容、主要服务内容,该信息为主管部门审核重要依据,备注内容字数限制20-200字,请认真填写。(特殊备注要求请查看注意事项)'); } //微信小程序负责人信息-负责人证件正面照片 $certificate_photo_front = $data['icp_applets']['principal_info']['certificate_photo_front']; if ($certificate_photo_front) { $data['icp_applets']['principal_info']['certificate_photo_front'] = $certificate_photo_front['media_id']; } //微信小程序负责人信息-负责人证件背面照片 $certificate_photo_back = $data['icp_applets']['principal_info']['certificate_photo_back']; if ($certificate_photo_back) { $data['icp_applets']['principal_info']['certificate_photo_back'] = $certificate_photo_back['media_id']; } //主体负责人信息-授权书 $authorization_letter = $data['icp_applets']['principal_info']['authorization_letter']; if ($authorization_letter) { $data['icp_applets']['principal_info']['authorization_letter'] = $authorization_letter['media_id']; } //扫脸认证任务id(扫脸认证接口返回的task_id) $data['icp_applets']['principal_info']['verify_task_id'] = $mini_auth_icp->task_id; $wechatMiniIcpForm = new WechatMiniIcpForm(); //其他备案媒体材料-互联网信息服务承诺书 最大数量1 $commitment_letter_ = $data['icp_materials']['commitment_letter']; if ($commitment_letter_) { $data['icp_materials']['commitment_letter'] = $wechatMiniIcpForm->arrayChange($commitment_letter_); } //其他备案媒体材料-主体更名函 media_id(非个人类型,且发生过更名时需要上传) 最大数量1 $business_name_change_letter_ = $data['icp_materials']['business_name_change_letter']; if ($business_name_change_letter_) { $data['icp_materials']['business_name_change_letter'] = $wechatMiniIcpForm->arrayChange($business_name_change_letter_); } //其他备案媒体材料-党建确认函 最大数量1 $party_building_confirmation_letter_ = $data['icp_materials']['party_building_confirmation_letter']; if ($party_building_confirmation_letter_) { $data['icp_materials']['party_building_confirmation_letter'] = $wechatMiniIcpForm->arrayChange($party_building_confirmation_letter_); } //其他备案媒体材料-承诺视频 最大数量1 $promise_video_ = $data['icp_materials']['promise_video']; if ($promise_video_) { $data['icp_materials']['promise_video'] = $wechatMiniIcpForm->arrayChange($promise_video_); } //其他备案媒体材料-党建确认函 最大数量1 $authenticity_responsibility_letter_ = $data['icp_materials']['authenticity_responsibility_letter']; if ($authenticity_responsibility_letter_) { $data['icp_materials']['authenticity_responsibility_letter'] =$wechatMiniIcpForm->arrayChange($authenticity_responsibility_letter_); } //其他备案媒体材料-小程序备案信息真实性承诺书 最大数量1 $authenticity_commitment_letter_ = $data['icp_materials']['authenticity_commitment_letter']; if ($authenticity_commitment_letter_) { $data['icp_materials']['authenticity_commitment_letter'] = $wechatMiniIcpForm->arrayChange($authenticity_commitment_letter_); } //其他备案媒体材料-小程序建设方案书 最大数量1 $website_construction_proposal_ = $data['icp_materials']['website_construction_proposal']; if ($website_construction_proposal_) { $data['icp_materials']['website_construction_proposal'] = $wechatMiniIcpForm->arrayChange($website_construction_proposal_); } //其他备案媒体材料-主体其它附件 最大数量10 $subject_other_materials_ = $data['icp_materials']['subject_other_materials']; if ($subject_other_materials_) { $data['icp_materials']['subject_other_materials'] = $wechatMiniIcpForm->arrayChange($subject_other_materials_); } //其他备案媒体材料-小程序其它附件 最大数量10 $applets_other_materials_ = $data['icp_materials']['applets_other_materials']; if ($applets_other_materials_) { $data['icp_materials']['applets_other_materials'] = $wechatMiniIcpForm->arrayChange($applets_other_materials_); } //其他备案媒体材料-手持证件照 最大数量1 $holding_certificate_photo_ = $data['icp_materials']['holding_certificate_photo']; if ($holding_certificate_photo_) { $data['icp_materials']['holding_certificate_photo'] = $wechatMiniIcpForm->arrayChange($holding_certificate_photo_); } if (isset($data['mini_id'])) { unset($data['mini_id']); } $result = $baseClient->httpPostJson('wxa/sec/submit_auth_and_icp', $data); debug_log(['store_id' => $this->store_id, 'mini_id' => $this->mini_id, 'result' => $result], 'wxa_auth_icp.log'); if (empty($result['errcode']) && !empty($result)) { if ($result['procedure_id']) { $mini_auth_icp->procedure_id = $result['procedure_id']; } if ($result['pay_url']) { $mini_auth_icp->pay_url = $result['pay_url']; } $url = $result['pay_url']; if ($url) { $pic_url = $this->setPicUrl($url, $mini_auth_icp->id); $mini_auth_icp->pay_qrcode_url = $pic_url; } if (intval($data['auth_data']['pay_type']) === StoreMiniAuth::PAY_TYPE_SERVICE) { $mini_auth_icp->is_use_service = 1; } if (!$mini_auth_icp->save()) { throw new \Exception(implode(';', array_values($mini_auth_icp->firstErrors))); } // $t->commit(); return [ 'code' => 0, 'msg' => "成功", 'data' => [ 'auth_url' => $result['auth_url'] ] ]; } else { if ($result['hints']) { $mini_auth_icp->hints = json_encode($result['hints'], JSON_UNESCAPED_UNICODE); if (!$mini_auth_icp->save()) { throw new \Exception(implode(';', array_values($mini_auth_icp->firstErrors))); } } if (!empty($result['hints'])) { $result['errmsg'] = implode(';', array_column($result['hints'], 'errmsg')); } if (strpos($result['errmsg'], 'cURL error 28') !== false) { $this->queryAuthAndIcp(); $storeMiniAuthIcp = StoreMiniAuthIcp::findOne(['mini_id' => $this->mini_id]); if (!in_array($storeMiniAuthIcp->face_is_finish, [ StoreMiniAuthIcp::PROCEDURE_STATUS_NOT_START, StoreMiniAuthIcp::PROCEDURE_STATUS_AUTH_AUDIT_REJECT, StoreMiniAuthIcp::PROCEDURE_STATUS_AUTH_AUDIT_FINAL_FAIL, StoreMiniAuthIcp::PROCEDURE_STATUS_ICP_AUDIT_FAIL, StoreMiniAuthIcp::PROCEDURE_STATUS_ICP_PLATFORM_AUDIT_REJECT, StoreMiniAuthIcp::PROCEDURE_STATUS_ICP_GOVERNMENT_AUDIT_REJECT ])) { return [ 'code' => 0, 'msg' => "成功", 'data' => [ 'auth_url' => '' ] ]; } $message = intval($storeMiniAuthIcp->face_is_finish) === StoreMiniAuthIcp::FACE_FINISH ? StoreMiniAuthIcp::PROCEDURE_STATUS_NAME[intval($storeMiniAuthIcp->procedure_status)] : StoreMiniAuthIcp::FACE_STATUS_NAME[intval($storeMiniAuthIcp->face_status)]; throw new \Exception('微信服务器返回信息异常 请尝试返回上一页刷新状态或重新提交,当前状态为:' . $message); } throw new \Exception($result['errmsg'], $result['errcode']); } } catch (\Exception $e) { // $t->rollBack(); return [ 'code' => $e->getCode() ?: 1, 'msg' => $e->getMessage() ]; } } public function handleJsonData($data) { if (is_string($data)) { $data = json_decode($data, true); if (is_string($data)) { return $this->handleJsonData($data); } } return $data; } //查询认证以及备案流程 public function queryAuthAndIcp() { try { //请求微信接口 $app = $this->app; if (!$app) { throw new \Exception('获取小程序信息失败'); } $mini_id = $this->mini_id; $store_mini_auth_icp = StoreMiniAuthIcp::findOne(['mini_id' => $mini_id, 'is_delete' => 0]); $client = new BaseClient($app); $data = [ 'procedure_id' => $store_mini_auth_icp->procedure_id, ]; $result = $client->httpPostJson('wxa/sec/query_auth_and_icp', $data); //返回微信信息 if ($result['errcode']) { throw new \Exception($result['errmsg'], $result['errcode']); } $store_mini_auth_icp->procedure_status = $result['procedure_status']; $store_mini_auth_icp->orderid = $result['orderid']; $store_mini_auth_icp->refill_reason = $result['refill_reason']; $store_mini_auth_icp->fail_reason = $result['fail_reason']; if ($result['icp_audit']) { $store_mini_auth_icp->icp_audit = json_encode($result['icp_audit'], JSON_UNESCAPED_UNICODE); if ($result['icp_audit']['hints']) { $store_mini_auth_icp->hints = json_encode($result['icp_audit']['hints'], JSON_UNESCAPED_UNICODE); } $store_mini_auth_icp->sms_verify_status = $result['icp_audit']['sms_verify_status']; } if (!$store_mini_auth_icp->save()) { throw new \Exception(implode(';', array_values($store_mini_auth_icp->firstErrors))); } return [ 'code' => 0, 'msg' => "成功" ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } //任务流程状态枚举:15=等待支付认证审核费用;16=认证审核费用支付成功;17=认证审核中;18=认证审核驳回;19=认证审核通过;20=认证审核最终失败(不能再修改);21=创建备案审核单失败;22=备案平台审核中;23=备案平台审核驳回;24=备案管局审核中;25=管局审核驳回;26=认证及备案完成; // 获取信息 public function getApplyData() { try { $mini = StoreMini::findOne($this->mini_id); if (!$mini) { throw new \Exception('小程序信息查询失败'); } $data = [ 'auth_data' => [ 'contact_info' => [ 'name' => '', 'email' =>'' ], 'invoice_info' => [ 'invoice_type' => 2, 'electronic' => [ 'id' => '', 'desc' => '' ], 'vat' => [ 'enterprise_phone' => '', 'id' => '', 'enterprise_address' => '', 'bank_name' => '', 'bank_account' => '', 'desc' => '', ], // 'invoice_title' => '', ], 'customer_type' => 1, 'pay_type' => StoreMiniAuth::PAY_TYPE_SELF, // 'taskid' => '', 'qualification_other' => [// TODO 图片处理 ['media_id' => '', 'url' => ''] ['微信所需media_id' => '', '前端图片显示地址' => ''] ], 'account_name' => $mini->mini_nickname, 'account_name_type' => 1, 'account_supplemental' => [// TODO 图片处理 ['media_id' => '', 'url' => ''] ['微信所需media_id' => '', '前端图片显示地址' => ''] ], 'third_party_phone' => Option::get("platform_phone", 0, 'saas')['value'], 'service_appid' => Option::get("platform_wechat_fuwu_appid", 0, 'saas')['value'] ], 'icp_subject' => [ 'base_info' => [ 'type' => '', 'name' => '', 'province' => '', 'city' => '', 'district' => '', 'address' => '', 'comment' => '' ], 'organize_info' => [ 'certificate_type' => '', 'certificate_number' => '', 'certificate_address' => '', 'certificate_photo' => [ 'media_id' => '', 'url' => '' ], ], 'principal_info' => [ 'name' => '', 'mobile' => '', 'email' => '', 'emergency_contact' => '', 'certificate_type' => '', 'certificate_number' => '', 'certificate_validity_date_start' => '', 'certificate_validity_date_end' => '', 'certificate_photo_front' => [ 'media_id' => '', 'url' => '' ], 'certificate_photo_back' => [ 'media_id' => '', 'url' => '' ], 'authorization_letter' => [ 'media_id' => '', 'url' => '' ], 'verify_task_id' => '', ], 'legal_person_info' => [ 'name' => '', 'certificate_number' => '' ] ], 'icp_applets' => [ 'base_info' => [ 'service_content_types' => '', 'nrlx_details' => [ [ 'type' => 24, 'code' => '', 'media' => '' ] ], 'comment' => '' ], 'principal_info' => [ 'name' => '', 'mobile' => '', 'email' => '', 'emergency_contact' => '', 'certificate_type' => '', 'certificate_number' => '', 'certificate_validity_date_start' => '', 'certificate_validity_date_end' => '', 'certificate_photo_front' => [ 'media_id' => '', 'url' => '' ], 'certificate_photo_back' => [ 'media_id' => '', 'url' => '' ], 'authorization_letter' => [ 'media_id' => '', 'url' => '' ], 'verify_task_id' => '', ] ], 'icp_materials' => [ 'commitment_letter' => [ ], 'business_name_change_letter' => [ ], 'party_building_confirmation_letter' => [ ], 'promise_video' => [ ], 'authenticity_responsibility_letter' => [ ], 'authenticity_commitment_letter' => [ ], 'website_construction_proposal' => [ ], 'subject_other_materials' => [ ], 'applets_other_materials' => [ ], 'holding_certificate_photo' => [ ], ] ]; // 查询人脸识别状态 如果已经达到最终态就不再请求接口 // $ocr_data = [ 'organize_certificate_photo' => '', 'certificate_photo_front' => '', 'certificate_photo_back' => '', ]; $mini_auth_icp = StoreMiniAuthIcp::findOne(['store_id' => $this->store_id, 'mini_id' => $this->mini_id]); $pic_url = ''; if ($mini_auth_icp) { // $this->getTaskStatus($mini_auth_icp); $data = json_decode($mini_auth_icp->data, JSON_UNESCAPED_UNICODE) ?: $data; //处理ocr_data是json字符 且前端一直json不解密问题 $data['ocr_data'] = $this->handleJsonData($data['ocr_data']); if (!empty($mini_auth_icp->pay_url)) { $pic_url = $this->setPicUrl($mini_auth_icp->pay_url, $mini_auth_icp->id); $mini_auth_icp->pay_qrcode_url = $pic_url; $mini_auth_icp->save(); } if (isset($data['mini_id'])) { $data['mini_id'] = $this->mini_id; } $ocr_data = json_decode($mini_auth_icp->ocr_data, true) ?: $ocr_data; //处理ocr_data是json字符 且前端一直json不解密问题 $ocr_data = $this->handleJsonData($ocr_data); } $icp_form = new WechatMiniIcpForm(['store_id' => $this->mini_id, 'mini_id' => $this->mini_id]); //单位性质 $subject_types = null; $icpSubjectTypesResult = $icp_form->queryIcpSubjectTypes(); if ($icpSubjectTypesResult['code'] === 0) { $subject_types = $icpSubjectTypesResult['data']['data']; } //区域信息 $district_code = null; $icpDistrictCodeResult = $icp_form->queryIcpDistrictCode(); if ($icpDistrictCodeResult['code'] === 0) { $district_code = $icpDistrictCodeResult['data']['data']; } //获取证件类型 $certificate_types = null; $icpCertificateTypesResult = $icp_form->queryIcpCertificateTypes(); if ($icpCertificateTypesResult['code'] === 0) { $certificate_types = $icpCertificateTypesResult['data']['data']; } //获取前置审批项类型 $nrlx_types = null; $queryIcpNrlxTypesResult = $icp_form->queryIcpNrlxTypes(); if ($queryIcpNrlxTypesResult['code'] === 0) { $nrlx_types = $queryIcpNrlxTypesResult['data']['data']; } //获取小程序服务内容类型 $service_content_types = null; $icpServiceContentTypesResult = $icp_form->queryIcpServiceContentTypes(); if ($icpServiceContentTypesResult['code'] === 0) { $service_content_types = $icpServiceContentTypesResult['data']['data']; } $is_submit = false; if (in_array($mini_auth_icp->procedure_status, [ StoreMiniAuthIcp::PROCEDURE_STATUS_NOT_START, StoreMiniAuthIcp::PROCEDURE_STATUS_AUTH_AUDIT_REJECT, StoreMiniAuthIcp::PROCEDURE_STATUS_AUTH_AUDIT_FINAL_FAIL, StoreMiniAuthIcp::PROCEDURE_STATUS_ICP_AUDIT_FAIL, StoreMiniAuthIcp::PROCEDURE_STATUS_ICP_PLATFORM_AUDIT_REJECT, StoreMiniAuthIcp::PROCEDURE_STATUS_ICP_GOVERNMENT_AUDIT_REJECT, ])) { $is_submit = true; } $fail_reason = $mini_auth_icp->fail_reason; if (in_array($mini_auth_icp->procedure_status, [ StoreMiniAuthIcp::PROCEDURE_STATUS_ICP_PLATFORM_AUDIT_REJECT, StoreMiniAuthIcp::PROCEDURE_STATUS_ICP_GOVERNMENT_AUDIT_REJECT ])) { $message = ''; $icp_audit_data = json_decode($mini_auth_icp->icp_audit, true); foreach ($icp_audit_data['audit_data'] as $icp_audit_item) { $message .= $icp_audit_item['error'] . "_" . $icp_audit_item['suggest'] . ';'; } $fail_reason = $message; } return [ 'code' => 0, 'msg' => '获取成功', 'data' => [ 'data' => $data, 'pay_url' => $pic_url ?: '', 'procedure_status' => intval($mini_auth_icp->procedure_status) ?: 0, 'procedure_status_text' => StoreMiniAuthIcp::PROCEDURE_STATUS_NAME[$mini_auth_icp->procedure_status ?: 0], 'sms_verify_status' => intval($mini_auth_icp->sms_verify_status) ?: 0, 'sms_verify_status_text' => StoreMiniAuthIcp::SMS_VERIFY_STATUS_NAME[$mini_auth_icp->sms_verify_status ?: 0], 'refill_reason' => $mini_auth_icp->refill_reason, 'fail_reason' => $fail_reason, // 'is_edit' => $is_edit, 'subject_types' => $subject_types, 'district_code' => $district_code, 'certificate_types' => $certificate_types, 'nrlx_types' => $nrlx_types, 'service_content_types' => $service_content_types, 'is_submit' => $is_submit, 'ocr_data' => $ocr_data ] ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } //获取人脸核身任务状态 状态:-1未创建任务;1待核验;2=成功;3=失败; public function queryIcpVerifyTask() { try { //请求微信接口 $app = $this->app; if (!$app) { throw new \Exception('获取小程序信息失败'); } $mini_id = $this->mini_id; $store_mini_auth_icp = StoreMiniAuthIcp::findOne(['mini_id' => $mini_id, 'is_delete' => 0]); if (empty($store_mini_auth_icp->task_id)) { return [ 'code' => 0, 'msg' => '', 'data' => [ 'face_status' => -1,//未创建 'face_status_text' => '等待人脸核身任务创建', 'face_verify_qrcode_url' => '' ] ]; } if ($store_mini_auth_icp->face_is_finish) { return [ 'code' => 0, 'msg' => '', 'data' => [ 'face_status' => StoreMiniAuthIcp::FACE_STATUS_SUCCESS, 'face_status_text' => '', 'face_verify_qrcode_url' => '' ] ]; } $data = [ 'task_id' => $store_mini_auth_icp->task_id, ]; $client = new BaseClient($app); $result = $client->httpPostJson('wxa/icp/query_icp_verifytask', $data); //返回微信信息 if ($result['errcode']) { throw new \Exception($result['errmsg'], $result['errcode']); } $store_mini_auth_icp->face_is_finish = intval($result['is_finish']); $store_mini_auth_icp->face_status = intval($result['face_status']); $store_mini_auth_icp->face_along_with_auth_result = intval($result['along_with_auth_result']); if (!$store_mini_auth_icp->save()) { throw new \Exception(implode(';', array_values($store_mini_auth_icp->firstErrors))); } $statusText = ''; $pic_url = ''; if (!intval($result['is_finish'])) { $statusText = StoreMiniAuthIcp::FACE_STATUS_NAME[$result['face_status']]; if (intval($result['face_status']) === StoreMiniAuthIcp::FACE_STATUS_SUCCESS) { if (intval($result['face_along_with_auth_result']) === StoreMiniAuthIcp::ALONG_WITH_AUTH_NO) { $statusText = '等待认证短信核验'; } $result['face_status'] = StoreMiniAuthIcp::FACE_STATUS_WAITING; } if (in_array($result['face_status'], [StoreMiniAuthIcp::FACE_STATUS_INIT, StoreMiniAuthIcp::FACE_STATUS_WAITING])) { $result['face_status'] = StoreMiniAuthIcp::FACE_STATUS_WAITING; } // if (!empty($store_mini_auth_icp->face_verify_url)) { // $pic_url = $this->setPicUrl($store_mini_auth_icp->face_verify_url, $store_mini_auth_icp->id, 'verify'); // $store_mini_auth_icp->face_verify_qrcode_url = $pic_url; // $store_mini_auth_icp->save(); // } } return [ 'code' => 0, 'msg' => '', 'data' => [ // 'face_is_finish' => intval($result['is_finish']), 'face_status_text' => $statusText, 'face_status' => $result['face_status'], 'face_verify_qrcode_url' => $store_mini_auth_icp->face_verify_url ] ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } /** * 发起小程序管理员人脸核身 */ public function createVerifyTask() { try { $cache = cache(); //请求微信接口 $app = $this->app; if (!$app) { throw new \Exception('获取小程序信息失败'); } $store_id = $this->store_id; $mini_id = $this->mini_id; $store_mini_icp = StoreMiniAuthIcp::findOne(['mini_id' => $mini_id, 'is_delete' => 0]); $open = false; if ($store_mini_icp) { $key = 'mini_auth_icp_' . $store_mini_icp->id; if ($cache->get($key)) { $open = true; }; } if ($open) { if (intval($store_mini_icp->face_is_finish)) { throw new \Exception('人脸核身已经通过'); } if (!empty($store_mini_icp->task_id)) { throw new \Exception('人脸核身检验中 请及时处理或联系管理员'); } } $data = [ 'along_with_auth' => true ]; $client = new BaseClient($app); $result = $client->httpPostJson('wxa/icp/create_icp_verifytask', $data); //返回微信信息 if ($result['errcode'] !== 0) { throw new \Exception($result['errmsg'], $result['errcode']); } // TODO 首次猜测可能每个小程序备案一次 //保存人脸核验任务id task_id if (!$store_mini_icp) { $store_mini_icp = new StoreMiniAuthIcp(); } $store_mini_icp->task_id = $result['task_id']; $store_mini_icp->store_id = $store_id; $store_mini_icp->mini_id = $mini_id; $store_mini_icp->created_at = time(); if (!$store_mini_icp->save()) { throw new \Exception(json_encode($store_mini_icp->errors, JSON_UNESCAPED_UNICODE)); } $pic_url = ''; if (!empty($result['verify_url'])) { $pic_url = $this->setPicUrl($result['verify_url'], $store_mini_icp->id, 'verify'); $store_mini_icp->face_verify_qrcode_url = $pic_url; $store_mini_icp->face_verify_url = $result['verify_url']; $store_mini_icp->save(); } $cache->set('mini_auth_icp_' . $store_mini_icp->id, 1, 600); return [ 'code' => 0, 'msg' => '已发送人脸核身', 'data' => [ 'task_id' => $result['task_id'], 'face_verify_qrcode_url' => $pic_url ] ]; } catch (\Exception $e) { return [ 'code' => $e->getCode() ?: 1, 'msg' => $e->getMessage() ]; } } public function setPicUrl($auth_url, $id, $type = 'pay') { $filename = md5(date('Ym') . 'mini_auth_icp' . $id . '_' . $type); $path = \Yii::$app->runtimePath . '/image/' . $filename . '.jpg'; $pic_url = str_replace('http://', 'https://', \Yii::$app->request->hostInfo . '/runtime/image/' . $filename . '.jpg'); QrCode::image($auth_url, 500, false, 'L', 'JPEG', 0, ['255,255,255', '0,0,0'], 1, false, $path); return $pic_url; } //获取网络图片到临时目录 private function saveTempImage($url) { if (strpos($url, 'http') === false) { $url = 'http:' . trim($url); } if (!is_dir(\Yii::$app->runtimePath . '/image')) { mkdir(\Yii::$app->runtimePath . '/image'); } $save_path = \Yii::$app->runtimePath . '/image/' . md5($url) . '.jpg'; CurlHelper::download($url, $save_path); return $save_path; } }