首页 > 编程语言 >第三方平台 之代开发小程序

第三方平台 之代开发小程序

时间:2023-09-16 16:22:06浏览次数:50  
标签:之代 authorizer 程序 ret access token https appid 第三方

一、服务商代开发小程序

文档:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/product/how_to_dev.html

二、extAppid 的开发调试

文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/ext.html

ext.json文件

{
    "extEnable": true,
    "extAppid": "", //模板小程序appid
    "directCommit": false,
    "ext": {
        "uniacid": 10001  //多平台标识
    }
}

通过uni.getExtConfigSync()获取ext数据

三、代小程序实现业务

<?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);

    }

}

 

标签:之代,authorizer,程序,ret,access,token,https,appid,第三方
From: https://www.cnblogs.com/yang-2018/p/17706888.html

相关文章

  • AppSpider Pro 7.4.055 for Windows - Web 应用程序安全测试
    AppSpiderPro7.4.055forWindows-Web应用程序安全测试Rapid7DynamicApplicationSecurityTesting(DAST)请访问原文链接:https://sysin.org/blog/appspider/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgappspider没有任何应用程序未经测试,没有未知风险......
  • idea中启动maven项目报错:程序包lombok.extern.slf4j不存在问题如何解决
    idea中启动maven项目报错:程序包lombok.extern.slf4j不存在问题如何解决1.现象:在springboot的maven项目启动时,报错:Error:(3,27)java:程序包lombok.extern.slf4j不存在错误,编译不报错,maven依赖也合适,项目就是无法启动,现象截图如下:其实不是项目本身或者maven本身的问题,而是......
  • AnyCAD程序无法启动的问题解决方法
    在某些电脑上会出现基于AnyCAD开发的程序无法启动的问题,如:System-ArgumentEcception:Pleasecheckthedependendes解决方法安装最新的VS运行时库,如VS2022:微软官方下载地址:x64:vc_redist.x64.exeSystem.AccessViolationException:"Attemptedtoreadorwriteprotected......
  • 【译】使用 ChatGPT 和 Azure Cosmos DB 构建智能应用程序
    原文|MarkBrown翻译|郑子铭随着对智能应用程序的需求不断增长,开发人员越来越多地转向人工智能(AI)和机器学习(ML),以增强其应用程序的功能。聊天机器人已经成为提供对话式人工智能的最流行方式之一。ChatGPT是OpenAI开发的大型语言模型(LLM),是构建能够理解自然语言并提供智能响应的聊......
  • 2021年中国大学生程序设计竞赛女生专场 AKDGIBC
    2021年中国大学生程序设计竞赛女生专场目录2021年中国大学生程序设计竞赛女生专场概况C-连锁商店B-攻防演练I-驾驶卡丁车G-3G网络D-修建道路K-音乐游戏A-公交线路概况前五题去年的这个时候VP的,今年学校要去打女生赛,我先帮她们看看C-连锁商店一眼状压,但发现......
  • 【uniapp】【微信小程序】wxml-to-canvas
    真是搞吐了,研究了整整两天,困死我了 本来使用生成二维码插件好好的,插件页也支持导出二维码图片,可是领导说要带上文件的名称,那就涉及html转图片了,当然也可以改二维码插件的源码,不过源码做了混淆,看晕了,放弃了。试了将微信的原生插件wxml-to-canvas引入uniapp项目,最后捣鼓了好久没......
  • springboot vue uniapp 小说电子书阅读小程序APP源码
    开发环境及工具:大等于jdk1.8,大于mysql5.5,idea(eclipse),nodejs,vscode(webstorm),HBuilderX技术说明:springbootmybatisvueelementuiuniapp代码注释齐全,没有多余代码,适合学习(毕设),二次开发,包含论文技术相关文档。功能介绍:用户端:登录注册首页显示搜索小说,轮播图,最新发布小说(可带推荐算......
  • 基于JAVA的运动健康微信小程序
    互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用基于web的运动健康小程序可以有效管理,使......
  • 基于JAVA的微信食堂线上订餐小程序
    通过移动互联网这几年的发展,单独的开发某些APP已经到了日暮西山的地步,原因不在于单个的APP功能丰富与否,而是因为用户生态体系的问题。使用智能手机的用户经过多年的使用习惯,已经越来越不喜欢安装各种的APP,除了正常生活和工作所必须的APP,不喜欢因为喜欢某些内容而被强制安装APP软件......
  • 基于微信小程序的学生管理系统
    互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用小程序学生管理系统可以有效管理,使信息管......