<?php /* * 代小程序实现业务 */ namespace app\home\model; use think\Model; use think\Db; use think\Cache; class Miniprogram extends Model { private $thirdAppId ; //开放平台appid private $encodingAesKey ; //开放平台encodingAesKey private $thirdToken ; //开放平台token private $thirdAccessToken ; //开放平台access_token private $authorizer_appid ; private $authorizer_access_token ; private $authorizer_refresh_token ; public function __construct( $appid ) { $weixin_account = Db::name( 'weixin_account' )->where([ 'type' => 1])->field( 'token,encodingAesKey,appId,component_access_token' )->find(); if ( $weixin_account ) { $this ->thirdAppId = $weixin_account [ 'appId' ]; $this ->encodingAesKey = $weixin_account [ 'encodingAesKey' ]; $this ->thirdToken = $weixin_account [ 'token' ]; $this ->thirdAccessToken = $weixin_account [ 'component_access_token' ]; $miniprogram = Db::name( 'wxminiprograms' )->where( 'authorizer_appid' , $appid ) ->field( 'authorizer_access_token,authorizer_refresh_token,authorizer_expires' )->find(); if ( $miniprogram ){ $this ->authorizer_appid = $appid ; if (time() > $miniprogram [ 'authorizer_expires' ]){ $miniapp = $this ->update_authorizer_access_token( $appid , $miniprogram [ 'authorizer_refresh_token' ]); if ( $miniapp ) { $this ->authorizer_access_token = $miniapp ->authorizer_access_token; $this ->authorizer_refresh_token = $miniapp ->authorizer_refresh_token; } else { $this ->errorLog( "更新小程序access_token失败,appid:" . $this ->authorizer_appid, '' ); exit ; } } else { $this ->authorizer_access_token = $miniprogram [ 'authorizer_access_token' ]; $this ->authorizer_refresh_token = $miniprogram [ 'authorizer_refresh_token' ]; } } else { $this ->errorLog( "小程序不存在,appid:" . $this ->authorizer_appid, '' ); exit ; } } else { $this ->errorLog( "请增加微信第三方公众号平台账户信息" , '' ); exit ; } } /* * 设置小程序服务器地址,无需加https前缀,但域名必须可以通过https访问 * @params string / array $domains : 域名地址。只接收一维数组。 * */ public function setServerDomain( $domain = 'test.moh.cc' ) { $url = "https://api.weixin.qq.com/wxa/modify_domain?access_token=" . $this ->authorizer_access_token; if ( is_array ( $domain )) { $https = '' ; $wss = '' ; foreach ( $domain as $key => $value ) { $https .= '"https://' . $value . '",' ; $wss .= '"wss://' . $value . '",' ; } $https = rtrim( $https , ',' ); $wss = rtrim( $wss , ',' ); $data = '{ "action" : "add" , "requestdomain" :[ '.$https.' ], "wsrequestdomain" :[ '.$wss.' ], "uploaddomain" :[ '.$https.' ], "downloaddomain" :[ '.$https.' ] }'; } else { $data = '{ "action" : "add" , "requestdomain" : "https://'.$domain.'" , "wsrequestdomain" : "wss://'.$domain.'" , "uploaddomain" : "https://'.$domain.'" , "downloaddomain" : "https://'.$domain.'" }'; } $ret = json_decode(https_post( $url , $data )); if ( $ret ->errcode == 0) { return true; } else { $this ->errorLog( "设置小程序服务器地址失败,appid:" . $this ->authorizer_appid, $ret ); return false; } } /* * 设置小程序业务域名,无需加https前缀,但域名必须可以通过https访问 * @params string / array $domains : 域名地址。只接收一维数组。 * */ public function setBusinessDomain( $domain = 'test.moh.cc' ) { $url = "https://api.weixin.qq.com/wxa/setwebviewdomain?access_token=" . $this ->authorizer_access_token; if ( is_array ( $domain )) { $https = '' ; foreach ( $domain as $key => $value ) { $https .= '"https://' . $value . '",' ; } $https = rtrim( $https , ',' ); $data = '{ "action" : "add" , "webviewdomain" :[ '.$https.' ] }'; } else { $data = '{ "action" : "add" , "webviewdomain" : "https://'.$domain.'" }'; } $ret = json_decode(https_post( $url , $data )); if ( $ret ->errcode == 0) { return true; } else { $this ->errorLog( "设置小程序业务域名失败,appid:" . $this ->authorizer_appid, $ret ); return false; } } /* * 成员管理,绑定小程序体验者 * @params string $wechatid : 体验者的微信号 * */ public function bindMember( $wechatid ) { $url = "https://api.weixin.qq.com/wxa/bind_tester?access_token=" . $this ->authorizer_access_token; $data = '{"wechatid":"' . $wechatid . '"}' ; $ret = json_decode(https_post( $url , $data )); if ( $ret ->errcode == 0) { return true; } else { $this ->errorLog( "绑定小程序体验者操作失败,appid:" . $this ->authorizer_appid, $ret ); return false; } } /* * 成员管理,解绑定小程序体验者 * @params string $wechatid : 体验者的微信号 * */ public function unBindMember( $wechatid ) { $url = "https://api.weixin.qq.com/wxa/unbind_tester?access_token=" . $this ->authorizer_access_token; $data = '{"wechatid":"' . $wechatid . '"}' ; $ret = json_decode(https_post( $url , $data )); if ( $ret ->errcode == 0) { return true; } else { $this ->errorLog( "解绑定小程序体验者操作失败,appid:" . $this ->authorizer_appid, $ret ); return false; } } /* * 成员管理,获取小程序体验者列表 * */ public function listMember() { $url = "https://api.weixin.qq.com/wxa/memberauth?access_token=" . $this ->authorizer_access_token; $data = '{"action":"get_experiencer"}' ; $ret = json_decode(https_post( $url , $data )); if ( $ret ->errcode == 0) { return $ret ->members; } else { $this ->errorLog( "获取小程序体验者列表操作失败,appid:" . $this ->authorizer_appid, $ret ); return false; } } /* * 为授权的小程序帐号上传小程序代码 * @params int $template_id : 模板ID * @params json $ext_json : 小程序配置文件,json格式 * @params string $user_version : 代码版本号 * @params string $user_desc : 代码描述 * */ public function uploadCode( $template_id = 1, $user_version = 'v1.0.0' , $user_desc = "魔盒CMS小程序模板库" ) { $ext_json = json_encode( '{"extEnable": true,"extAppid": "wx572****bfb","ext":{"appid": "' . $this ->authorizer_appid. '"}}' ); $url = "https://api.weixin.qq.com/wxa/commit?access_token=" . $this ->authorizer_access_token; $data = '{"template_id":"' . $template_id . '","ext_json":' . $ext_json . ',"user_version":"' . $user_version . '","user_desc":"' . $user_desc . '"}' ; $ret = json_decode(https_post( $url , $data )); if ( $ret ->errcode == 0) { return true; } else { $this ->errorLog( "为授权的小程序帐号上传小程序代码操作失败,appid:" . $this ->authorizer_appid, $ret ); return false; } } /* * 获取体验小程序的体验二维码 * @params string $path : 指定体验版二维码跳转到某个具体页面 * */ public function getExpVersion( $path = '' ) { if ( $path ){ $url = "https://api.weixin.qq.com/wxa/get_qrcode?access_token=" . $this ->authorizer_access_token. "&path=" .urlencode( $path ); } else { $url = "https://api.weixin.qq.com/wxa/get_qrcode?access_token=" . $this ->authorizer_access_token; } $ret = json_decode(https_get( $url )); if ( $ret ->errcode) { $this ->errorLog( "获取体验小程序的体验二维码操作失败,appid:" . $this ->authorizer_appid, $ret ); return false; } else { return $url ; } } /* * 提交审核 * @params string $tag : 小程序标签,多个标签以空格分开 * @params strint $title : 小程序页面标题,长度不超过32 * */ public function submitReview( $tag = "魔盒CMS 微信投票 微网站 微信商城" , $title = "魔盒CMS微信公众号营销小程序开发" ) { $first_class = '' ; $second_class = '' ; $first_id = 0; $second_id = 0; $address = "pages/index/index" ; $category = $this ->getCategory(); if (! empty ( $category )) { $first_class = $category [0]->first_class ? $category [0]->first_class : '' ; $second_class = $category [0]->second_class ? $category [0]->second_class : '' ; $first_id = $category [0]->first_id ? $category [0]->first_id : 0; $second_id = $category [0]->second_id ? $category [0]->second_id : 0; } $getpage = $this ->getPage(); if (! empty ( $getpage ) && isset( $getpage [0])) { $address = $getpage [0]; } $url = "https://api.weixin.qq.com/wxa/submit_audit?access_token=" . $this ->authorizer_access_token; $data = '{ "item_list" :[{ "address" : "'.$address.'" , "tag" : "'.$tag.'" , "title" : "'.$title.'" , "first_class" : "'.$first_class.'" , "second_class" : "'.$second_class.'" , "first_id" : "'.$first_id.'" , "second_id" : "'.$second_id.'" }] }'; $ret = json_decode(https_post( $url , $data )); if ( $ret ->errcode == 0) { Db::name( 'wxminiprogram_audit' )->insert([ 'appid' => $this ->authorizer_appid, 'auditid' => $ret ->auditid, 'create_time' => date ( 'Y-m-d H:i:s' ) ]); return true; } else { $this ->errorLog( "小程序提交审核操作失败,appid:" . $this ->authorizer_appid, $ret ); return false; } } /* * 小程序审核撤回 * 单个帐号每天审核撤回次数最多不超过1次,一个月不超过10次。 * */ public function unDoCodeAudit() { $url = "https://api.weixin.qq.com/wxa/undocodeaudit?access_token=" . $this ->authorizer_access_token; $ret = json_decode(https_get( $url )); if ( $ret ->errcode == 0) { return true; } else { $this ->errorLog( "小程序审核撤回操作失败,appid:" . $this ->authorizer_appid, $ret ); return false; } } /* * 查询指定版本的审核状态 * @params string $auditid : 提交审核时获得的审核id * */ public function getAuditStatus( $auditid ) { $url = "https://api.weixin.qq.com/wxa/get_auditstatus?access_token=" . $this ->authorizer_access_token; $data = '{"auditid":"' . $auditid . '"}' ; $ret = json_decode(https_post( $url , $data )); if ( $ret ->errcode == 0) { $reason = $ret ->reason ? $ret ->reason : '' ; Db::name( 'wxminiprogram_audit' )->where([ 'appid' => $this ->authorizer_appid, 'auditid' => $auditid ])->update([ 'status' => $ret ->status, 'reason' => $reason ]); return true; } else { $this ->errorLog( "查询指定版本的审核状态操作失败,appid:" . $this ->authorizer_appid, $ret ); return false; } } /* * 查询最新一次提交的审核状态 * */ public function getLastAudit() { $url = "https://api.weixin.qq.com/wxa/get_latest_auditstatus?access_token=" . $this ->authorizer_access_token; $ret = json_decode(https_get( $url )); if ( $ret ->errcode == 0) { $reason = $ret ->reason ? $ret ->reason : '' ; Db::name( 'wxminiprogram_audit' )->where([ 'appid' => $this ->authorizer_appid, 'auditid' => $ret ->auditid])->update([ 'status' => $ret ->status, 'reason' => $reason ]); return $ret ->auditid; } else { $this ->errorLog( "查询最新一次提交的审核状态操作失败,appid:" . $this ->authorizer_appid, $ret ); return false; } } /* * 发布已通过审核的小程序 * */ public function release() { $url = "https://api.weixin.qq.com/wxa/release?access_token=" . $this ->authorizer_access_token; $data = '{}' ; $ret = json_decode(https_post( $url , $data )); if ( $ret ->errcode == 0) { return true; } else { $this ->errorLog( "发布已通过审核的小程序操作失败,appid:" . $this ->authorizer_appid, $ret ); return $ret ->errcode; } } /* * 获取授权小程序帐号的可选类目 * */ private function getCategory() { $url = "https://api.weixin.qq.com/wxa/get_category?access_token=" . $this ->authorizer_access_token; $ret = json_decode(https_get( $url )); if ( $ret ->errcode == 0) { return $ret ->category_list; } else { $this ->errorLog( "获取授权小程序帐号的可选类目操作失败,appid:" . $this ->authorizer_appid, $ret ); return false; } } /* * 获取小程序的第三方提交代码的页面配置 * */ private function getPage() { $url = "https://api.weixin.qq.com/wxa/get_page?access_token=" . $this ->authorizer_access_token; $ret = json_decode(https_get( $url )); if ( $ret ->errcode == 0) { return $ret ->page_list; } else { $this ->errorLog( "获取小程序的第三方提交代码的页面配置失败,appid:" . $this ->authorizer_appid, $ret ); return false; } } /* * 更新授权小程序的authorizer_access_token * @params string $appid : 小程序appid * @params string $refresh_token : 小程序authorizer_refresh_token * */ private function update_authorizer_access_token( $appid , $refresh_token ) { $url = 'https://api.weixin.qq.com/cgi-bin/component/api_authorizer_token?component_access_token=' . $this ->thirdAccessToken; $data = '{"component_appid":"' . $this ->thirdAppId . '","authorizer_appid":"' . $appid . '","authorizer_refresh_token":"' . $refresh_token . '"}' ; $ret = json_decode(https_post( $url , $data )); if (isset( $ret ->authorizer_access_token)) { Db::name( 'wxminiprograms' )->where([ 'authorizer_appid' => $appid ])->update([ 'authorizer_access_token' => $ret ->authorizer_access_token, 'authorizer_expires' => (time() + 7200), 'authorizer_refresh_token' => $ret ->authorizer_refresh_token]); return $ret ; } else { $this ->errorLog( "更新授权小程序的authorizer_access_token操作失败,appid:" . $appid , $ret ); return null; } } private function errorLog( $msg , $ret ) { file_put_contents (ROOT_PATH . 'runtime/error/miniprogram.log' , "[" . date ( 'Y-m-d H:i:s' ) . "] " . $msg . "," .json_encode( $ret ).PHP_EOL, FILE_APPEND); } } |