微信 第三方开放平台 服务型 小程序使用demo 二_wxopenservice-程序员宅基地

技术标签: 第三方开放平台  微信  PHP  php  小程序  

上期说过的微信授权完成后!终于可以开始正经地写接口API了,躺完坑后,现在舒服多了,直接封装了十几个接口!

就是这些了

我的代码是分 控制器 逻辑层和数据层的

首先是控制器

<?php


namespace app\common\controller;


use app\common\model\WxOpenModel;

class WxOpen
{
    private $WC;

    public function __construct()
    {
        $this->WC = new WxOpenModel();
    }

    ##############授权绑定小程序#############

    /**
     * 获取令牌
     */
    public function componentAccessToken()
    {
        $this->WC->componentAccessToken();
    }

    /**
     * 获取预授权码
     */
    public function preAuthCode()
    {
        //获取令牌
        $this->WC->componentAccessToken();
        //获取预授权码
        $this->WC->preAuthCode();
    }

    /**
     * 使用授权码获取授权信息 3
     */
    public function authorizationInfo($authorization_code)
    {
        $this->WC->authorizationInfo($authorization_code);
    }

    /**
     * 创建开放平台帐号并绑定公众号/小程序 4
     */
    public function createAccount()
    {
        $this->WC->createAccount();
    }

    /**
     * 将公众号/小程序绑定到开放平台帐号下 5
     */
    public function bindingAccount()
    {
        $this->WC->bindingAccount();
    }


    ##############开发小程序#############

    /**
     * 获取代码草稿列表
     */
    public function draftList()
    {
        $this->componentAccessToken();
        $this->WC->draftList();
    }

    /**
     * 将草稿添加到代码模板库
     */
    public function addDraftList($draft_id)
    {
        $this->WC->addDraftList($draft_id);
    }

    /**
     * 获取代码模板列表
     */
    public function templateList()
    {
        $this->WC->templateList();
    }

    /**
     * 上传小程序代码
     */
    public function upCode()
    {
        $this->WC->upCode();
    }

    /**
     * 获取体验版二维码
     */
    public function getCode()
    {
        $this->WC->getCode();
    }

    /**
     * 提交审核
     */
    public function applyCode()
    {
        $this->WC->applyCode();
    }


    /**
     * 查询指定发布审核单的审核状态
     */
    public function selectApply()
    {
        $this->WC->selectApply();
    }

    /**
     * 查询最新一次提交的审核状态
     */
    public function selectNewApply()
    {
        $this->WC->selectNewApply();
    }

    /**
     * 发布已通过审核的小程序
     */
    public function release()
    {
        $this->WC->release();
    }

    /**
     * 版本回退
     */
    public function rollbackCode()
    {
        $this->WC->rollbackCode();
    }

    /**
     * 设置最低基础库版本
     */
    public function setVersion()
    {
        $this->WC->setVersion();
    }

}



逻辑层

<?php


namespace app\common\model;


use app\common\controller\Redis;
use app\common\service\WxOpenService;

class WxOpenModel
{
    public function __construct()
    {
        new WxOpenService();
    }

    /**
     * 令牌的获取是有限制的,每个令牌的有效期为 2 小时,在令牌快过期时(比如1小时50分),重新调用接口获取
     * 获取令牌 1
     * [AppId] => 
     * [CreateTime] => 1594886696
     * [InfoType] => component_verify_ticket
     * [ComponentVerifyTicket] => 
     */
    public function componentAccessToken()
    {
        //拿票据
        $R = New Redis();
        //先判断令牌有没有过期
        $component = $R->redis_str_get('component_access_token');
        if (($component['add_time'] + 6000) < time()) {
            //未过期
            WxOpenService::$component_access_token = $component['component_access_token'];
        } else {

            $encrypt = $R->redis_str_get('encrypt');
            $option  = [
                "component_appid"         => WxOpenService::$component_appid,
                "component_appsecret"     => WxOpenService::$component_appsecret,
                "component_verify_ticket" => $encrypt['ComponentVerifyTicket']
            ];

            $list                                  = WxOpenService::RequestPostCurl(WxOpenService::$componentAccessTokenUrl, $option);
            WxOpenService::$component_access_token = $list['component_access_token'];

            $list['add_time'] = time();
            $R->redis_str_set('component_access_token', $list);
        }
    }

    /**
     * 获取预授权码 2
     */
    public function preAuthCode()
    {
        $option                       = [
            "component_appid" => WxOpenService::$component_appid,
        ];
        WxOpenService::$pre_auth_code = WxOpenService::RequestPostCurl(WxOpenService::$preAuthCodeUrl . WxOpenService::$component_access_token, $option);
    }

    /**
     * 使用授权码获取授权信息 3
     */
    public function authorizationInfo($authorization_code)
    {
        WxOpenService::$authorization_code = $authorization_code;
        $option                            = [
            "component_appid"    => WxOpenService::$component_appid,
            "authorization_code" => WxOpenService::$authorization_code,
        ];
        WxOpenService::$authorization_info = WxOpenService::RequestPostCurl(WxOpenService::$authorizationInfoUrl . WxOpenService::$component_access_token, $option);

    }

    /**
     * 创建开放平台帐号并绑定公众号/小程序 4
     */
    public function createAccount()
    {
        $option = [
            "appid" => WxOpenService::$authorization_info['authorizer_appid'],
        ];
        $list   = WxOpenService::RequestPostCurl(WxOpenService::$createAccountUrl . WxOpenService::$authorization_info['authorizer_access_token'], $option);

        if ($list['errcode'] != 0) {
            WxOpenService::log('创建开放平台帐号并绑定公众号/小程序失败');
        }

        WxOpenService::$open_appid = $list['open_appid'];
        WxOpenService::log('创建开放平台帐号并绑定公众号/小程序成功');
    }

    /**
     * 将公众号/小程序绑定到开放平台帐号下 5
     */
    public function bindingAccount()
    {
        $option = [
            "appid"      => WxOpenService::$authorization_info['authorizer_appid'],
            "open_appid" => WxOpenService::$open_appid,
        ];
        $list   = WxOpenService::RequestPostCurl(WxOpenService::$bindingAccountUrl . WxOpenService::$authorization_info['authorizer_access_token'], $option);
        if ($list['errcode'] != 0) {
            WxOpenService::log('将公众号/小程序绑定到开放平台帐号下失败');
        }
        WxOpenService::log($list);
        WxOpenService::log('将公众号/小程序绑定到开放平台帐号下成功');

    }

    /**
     * 获取代码草稿列表
     */
    public function draftList()
    {
        $list = WxOpenService::RequestGetCurl(WxOpenService::$draftUrl . WxOpenService::$component_access_token);
        if ($list['errcode'] != 0) {
            WxOpenService::log('获取代码草稿列表失败');
            output_errors('获取代码草稿列表失败');
        }
        output_data($list);
    }

    /**
     * 将草稿添加到代码模板库
     */
    public function addDraftList($draft_id)
    {
        $option = [
            "draft_id" => $draft_id,
        ];
        $list   = WxOpenService::RequestPostCurl(WxOpenService::$addDraftUrl . WxOpenService::$component_access_token, $option);
        if ($list['errcode'] != 0) {
            WxOpenService::log('将草稿添加到代码模板库失败');
            output_errors('添加失败');
        }
        output_data('添加成功');
    }

    /**
     * 获取代码模板列表
     */
    public function templateList()
    {
        $list = WxOpenService::RequestGetCurl(WxOpenService::$GetTemplateUrl . WxOpenService::$component_access_token);
        if ($list['errcode'] != 0) {
            WxOpenService::log('获取代码模板列表失败');
            output_errors('获取代码模板列表失败');
        }
        output_data($list);
    }

    /**
     * 上传小程序代码
     */
    public function upCode()
    {
        WxOpenService::check(['template_id', 'ext_json', 'user_version', 'user_desc']);
        $option = [
            "template_id"  => $_POST['template_id'],
            "ext_json"     => $_POST['ext_json'],
            "user_version" => $_POST['user_version'],
            "user_desc"    => $_POST['user_desc'],
        ];
        $list   = WxOpenService::RequestPostCurl(WxOpenService::$upCodeUrl . WxOpenService::$component_access_token, $option);
        if ($list['errcode'] != 0) {
            WxOpenService::log('将上传小程序代码失败');
        }
        WxOpenService::log($list);
        WxOpenService::log('上传小程序代码成功');
        output_data('成功');

    }

    /**
     * 获取体验版二维码
     */
    public function getCode()
    {
        $path = '/pages/index/index';
        $path = urlencode($path);
        $list = WxOpenService::RequestGetCurl(WxOpenService::$getCodeUrl . WxOpenService::$component_access_token . '&path=' . $path);

        WxOpenService::log('获取体验版二维码');
        output_data($list);
    }

    /**
     * 提交审核
     */
    public function applyCode()
    {
        $option = [
        ];
        $list   = WxOpenService::RequestPostCurl(WxOpenService::$applyCodeUrl . WxOpenService::$component_access_token, $option);
        if ($list['errcode'] != 0) {
            WxOpenService::log('提交审核失败');
        }
        WxOpenService::log($list);
        WxOpenService::log('提交审核成功');
        output_data('成功');

    }

    /**
     * 查询指定发布审核单的审核状态
     */
    public function selectApply()
    {
        WxOpenService::check(['auditid']);
        $option = [
            'auditid' => $_POST['auditid']
        ];
        $list   = WxOpenService::RequestPostCurl(WxOpenService::$selectApplyUrl . WxOpenService::$component_access_token, $option);
        if ($list['errcode'] != 0) {
            WxOpenService::log('查询指定发布审核单的审核状态失败');
        }
        switch ($list['status']) {
            case 0 :
                $list['status_name'] = '审核成功';
                break;
            case 1 :
                $list['status_name'] = '审核被拒绝';
                break;
            case 2 :
                $list['status_name'] = '审核中';
                break;
            case 3 :
                $list['status_name'] = '已撤回';
                break;
            case 4 :
                $list['status_name'] = '审核延后';
                break;
        }
        WxOpenService::log($list);
        WxOpenService::log('查询指定发布审核单的审核状态成功');
        output_data($list);
    }

    /**
     * 查询最新一次提交的审核状态
     */
    public function selectNewApply()
    {
        $list = WxOpenService::RequestGetCurl(WxOpenService::$selectNewApplyUrl . WxOpenService::$component_access_token);
        if ($list['errcode'] != 0) {
            WxOpenService::log('查询最新一次提交的审核状态失败');
        }
        switch ($list['status']) {
            case 0 :
                $list['status_name'] = '审核成功';
                break;
            case 1 :
                $list['status_name'] = '审核被拒绝';
                break;
            case 2 :
                $list['status_name'] = '审核中';
                break;
            case 3 :
                $list['status_name'] = '已撤回';
                break;
        }
        WxOpenService::log($list);
        WxOpenService::log('查询最新一次提交的审核状态成功');
        output_data($list);
    }
    /**
     * 发布已通过审核的小程序
     */
    public function release()
    {
        $option = [
        ];
        $list   = WxOpenService::RequestPostCurl(WxOpenService::$releaseUrl . WxOpenService::$component_access_token, $option);
        if ($list['errcode'] != 0) {
            WxOpenService::log('发布已通过审核的小程序失败');
        }
        WxOpenService::log($list);
        WxOpenService::log('发布已通过审核的小程序成功');
        output_data($list);
    }

    /**
     * 版本回退
     */
    public function rollbackCode()
    {
        $list = WxOpenService::RequestGetCurl(WxOpenService::$rollbackCodeUrl . WxOpenService::$component_access_token);

        if ($list['errcode'] != 0) {
            WxOpenService::log('版本回退失败');
        }
        WxOpenService::log($list);
        WxOpenService::log('版本回退成功');
        output_data($list);
    }

    /**
     * 设置最低基础库版本
     */
    public function setVersion()
    {
        WxOpenService::check(['version']);
        $option = [
            'version'=>$_POST['version']
        ];
        $list   = WxOpenService::RequestPostCurl(WxOpenService::$setVersion . WxOpenService::$component_access_token, $option);
        if ($list['errcode'] != 0) {
            WxOpenService::log('设置最低基础库版本失败');
        }
        WxOpenService::log($list);
        WxOpenService::log('设置最低基础库版本成功');
        output_data($list);
    }

}

 

最后是数据层

 

<?php


namespace app\common\service;


use app\common\ApiCommon;
use app\pay\service\PayService;
use lib\Curl;

class WxOpenService extends ApiCommon
{
    //开放平台appid
    public static $component_appid='';
    //开放平台appsecret
    public static $component_appsecret='';

    //令牌
    public static $component_access_token;
    //预授权码
    public static $pre_auth_code;
    //授权码
    public static $authorization_code;
    //获取授权信息
    public static $authorization_info;
    //所创建的开放平台帐号的 appid
    public static $open_appid;
    //代码草稿列表
    public static $draft_list;
    //代码模板列表
    public static $template_list;


    //令牌
    public static $componentAccessTokenUrl='https://api.weixin.qq.com/cgi-bin/component/api_component_token';
    //预授权码
    public static $preAuthCodeUrl='https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=';
    //预授权码获取授权码
    public static $authorizationCodeUrl='https://mp.weixin.qq.com/cgi-bin/componentloginpage?';
    //预授权码获取授权码 回调 URI
    public static $redirectUrl='https://master.jiaju01.com/api/Wx/GetAuthorizationCode';
    //使用授权码获取授权信息
    public static $authorizationInfoUrl='https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=';
    //创建开放平台帐号并绑定公众号/小程序
    public static $createAccountUrl='https://api.weixin.qq.com/cgi-bin/open/create?access_token=';
    //将公众号/小程序绑定到开放平台帐号下
    public static $bindingAccountUrl='https://api.weixin.qq.com/cgi-bin/open/bind?access_token=';
    //获取代码草稿列表
    public static $draftUrl='https://api.weixin.qq.com/wxa/gettemplatedraftlist?access_token=';
    //将草稿添加到代码模板库
    public static $addDraftUrl='https://api.weixin.qq.com/wxa/gettemplatedraftlist?access_token=';
    //获取代码模板列表
    public static $GetTemplateUrl='https://api.weixin.qq.com/wxa/gettemplatelist?access_token=';
    //上传小程序代码
    public static $upCodeUrl='https://api.weixin.qq.com/wxa/commit?access_token=';
    //获取体验版二维码
    public static $getCodeUrl='https://api.weixin.qq.com/wxa/get_qrcode?access_token=';
    //提交审核
    public static $applyCodeUrl='https://api.weixin.qq.com/wxa/submit_audit?access_token=';
    //查询指定发布审核单的审核状态
    public static $selectApplyUrl='https://api.weixin.qq.com/wxa/get_auditstatus?access_token=';
    //查询最新一次提交的审核状态
    public static $selectNewApplyUrl='https://api.weixin.qq.com/wxa/get_latest_auditstatus?access_token=';
    //发布已通过审核的小程序
    public static $releaseUrl='https://api.weixin.qq.com/wxa/release?access_token=';
    //版本回退
    public static $rollbackCodeUrl='https://api.weixin.qq.com/wxa/revertcoderelease?access_token=';
    //设置最低基础库版本
    public static $setVersion='https://api.weixin.qq.com/cgi-bin/wxopen/setweappsupportversion?access_token=';




    public function __construct()
    {
        //初始化父类
        parent::__construct();
    }

    /**
     * URL请求(GET)
     */
    public static function RequestGetCurl($url)
    {
        $curl = new  Curl();
        $curl->setUrl($url);
        $list = $curl->execute(true);
        $curl->close();
        return $list;
    }

    /**
     * URL请求(POST)
     */
    public static function RequestPostCurl($url, $xmlData)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url); //定义表单提交地址
        curl_setopt($curl, CURLOPT_POST, 1);   //定义提交类型 1:POST ;0:GET 设置post方式提交
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_HTTPHEADER, 'Content-type: text/xml');
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_HEADER, 0);            //定义是否显示状态头 1:显示 ; 0:不显示
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //定义是否直接输出返回流
        curl_setopt($curl, CURLOPT_POSTFIELDS, $xmlData); //定义提交的数据,这里是XML文件

        $returnData = curl_exec($curl);
        return $returnData;
    }

    public static function log($msg){
        if(WxOpenService::$authorization_info['authorizer_appid']){
            WxOpenService::p('小程序:' . WxOpenService::$authorization_info['authorizer_appid'], false, 'wx');
        }

        WxOpenService::p($msg, false, 'wx');
        WxOpenService::p(date('Y-m-d H:i:s',time()), false, 'wx');
    }

}

这块还是比较简单的,直接封装自己想用的就行了!!!
加油各位,胜利就在前方!
有坑可以留言哦
 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq284944970/article/details/107425111

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签