健全应用Yii2微信后台开采的成千上万计算

作者: 前端知识  发布:2019-06-24

李秉骏:在Phonegap下实现oAuth认证

2012/07/18 · HTML5 · 2 评论 · 来源: 李秉骏     · HTML5

正文由李秉骏(@CashLee李秉骏)投稿于伯乐在线,也应接任何朋友投稿。提醒:投稿时纪念留下今日头条账号哦 金沙澳门官网网址 1

这段时间做过一回关于Phonegap的实地沟通会议分享。基本上把Phonegap的片段特色和豪门交换了弹指间,大家对此Phonegap的 兴趣也是特别多的。可是因为Phonegap相对于原生应用来说,唯有七个View,这么些View就是一个Web的器皿,那使得Phonegap就存在许多限制。个中部分的限制大家早就因此HTML5的API以及Phonegap为大家搭建的桥去完结了,其它一些大家就得经过Phonegap plugins来落实,而实质上自个儿个人感到Phonegap最强劲的地点也在于有那么大的贰个部落在为她提供精彩纷呈的Plugins,以便去应对实际项 目中境遇的标题。

自家记念在和豪门沟通的时候大家平常会问Phonegap如何做本地的缓存啊(WebSQL),怎么样近乎原生应用(这几个涉及到架构,分界面渲染难点,这 里自个儿也倒霉深切讲,毕竟不是本文要探究的剧情),还会有一个很脑瓜疼的标题就是只要要做二个开放平台的采纳,如何落到实处oAuth认证。在此以前自个儿也境遇过类似的一 些境况,当自家重新相见这么些棘手的问题的时候,我深信必将也可以有Phonegap的听众碰到类似的景色的。于是自身就总括下来何我们研商一下什么样减轻这几个问题吧。

率先目的:解决oAuth认证。

制订安顿:1. 知道oAuth原理;2.驾驭Phonegap在管理这几个难点时候的运转搭飞机制;3. 制订布署实现代码。

下边我们就来一步一步地深入分析,看什么缓和那一个意况吧。(因为自个儿在项目中相见的是和讯易开放平台的oAuth认证,那么上面笔者就用TencentoAuth认证为例吧)

至于oAuth认证,相信做过开放平台应用的爱人都早就充裕纯熟了,假诺您还一向不做过照旧对于oAuth认证流程非常不打听,那么自身提出您先明白一 下原理,在那边自个儿不指望花太多的字数去介绍这么些东西,因为在相当的多地方都足以找到,上边笔者推荐多少个地方方便大家去读书,一定要读书,那会对您明白下边的稿子 有惊人的助手的。

Tencent和讯开放平台:

微博天涯论坛开放平台:

当然在那边下边供给解说表达的是oAuth认证机制是三个通用的手腕,然而因为各样开放平台有投机的国策,因此只怕在里头稍有改观,而且最后赚取的权限也会各不一样样。而近来今日头条今日头条实在太多坑爹的事体了,实在忍受不住,于是自身转战到Tencent的阳台了。

好的,假诺您看完了oAuth认证的流水生产线,就间接到这里来。大名鼎鼎,在oAuth认证的流程中,有二个授权页面,而那些授权页面是透过开放平台提供的,具体的体裁见下图:

金沙澳门官网网址 2

以此页面用于输入开放平台的帐户以及密码,通过授权获取响应的openid以及openkey,最后换取access-token(待会笔者会结合Tencent天涯论坛oAuth认证流程的特征,以及代码和豪门深入分析的)。

以此页面是弹出的,要是在Phonegap里面做的话会很奇异:1,因为属于弹窗,在Phonegap中自个儿正是一个WebView假使你还弹的话 就能够飞到了Safari的浏览器中,这就跳出应用自身,跳出来认证还也许有戏呢?2,通过iFrame,首先体验拾分不好,其次iFrame自身又属于跨域的 问题,那就欠好消除了(为何体验不佳呢,重借使因为授权页面包车型大巴体制是不定点的,类似Tencent天涯论坛开放平台,就比新浪的授权页面做得差,根本不和手提式有线电话机包容的, 而且有个别做得好的,认证页宽度即是320px,就占了您全数应用的版面,体验很不好)那么Phonegap中该怎么落实吗?

带着主题材料,大家就可望在Phonegap中再度引入二个WebView。刚刚提到Phonegap的无敌还在于多数个人以及官方的团体,为其提供了一 套很好的插件机制,以化解五花八门的急需。在Phonegap中有三个插件叫做ChildBrowser,从名称想到所包涵的意义正是:子浏览器。(其实笔者在上五次的 Phonegap专项论题技巧分享中以及谈起到让大家用这几个东西去消除,不过当下分享时间有限只可以够草率带过,抱歉)子浏览器的法力其实便是令你在 Phonegap应用内部调起三个浏览器的View,令你进行pdf,图片,摄像,以至网页阅读的工具。(实际上你看作者下面的截图,正是用 ChildBrowser来完成的)那就好了,那就足以让您调起浏览器而且不跳出应用本人了,能够很好地化解oAuth认证的难题。 ChildBrowser下载地址:

在地点上面,你应当早已见到ChildBrowser的设置情势以及使用格局了,特别轻易,真正的即插即用。要是您感到英文太难,那自个儿就帮不了你 了,你就活动Google翻译一下啊。相信您连忙就足以做出一个ChildBrowser的德姆o的。在这一个地方上边,其实您回去上一层目录,其实您也 已经看到各种各样的Phonegap Plugins,通过那些事物,你还足以调用起手机内部更加的多有趣的能源的!这些将在靠你和煦去开采啦!(别的平台的应用也可以有对应的插件的Android开辟者不要骂果粉哦!)

好了日益地大家就要涉及到代码部分了。首先大家看看调用ChildBrowser的Javascript代码:

JavaScript

cb = window.plugins.childBrowser; /* if(cb != null) { cb.onLocationChange = function(loc){ root.locChanged(loc); };//地址产生变动时候实施的函数 cb.onClose = function(){root.onCloseBrowser(); };//通过js关闭ChildBrowser的法子 cb.onOpenExternal = function(){root.onOpenExternal(); }; */ cb.showWebPage("");

1
2
3
4
5
6
7
8
        cb = window.plugins.childBrowser;
/*
        if(cb != null) {
        cb.onLocationChange = function(loc){ root.locChanged(loc); };//地址发生改变时候执行的函数
        cb.onClose = function(){root.onCloseBrowser(); };//通过js关闭ChildBrowser的办法
        cb.onOpenExternal = function(){root.onOpenExternal(); };
*/
        cb.showWebPage("http://google.com");

个中cb正是初步化的ChildBrowser,而showWebPage正是调起那一个页面的不二等秘书籍。可知代码中要展开的网站就是Google.com啦,这么些地球人都能够看得懂了。于是大家就可以即时想到大家要用ChildBrowser张开的网站是大家在英特网钦定的施用授权站点 了。而作者是布局在SAE下面的,所以下边包车型大巴事例也用PHP来讲呢,期待语言也是一模二样的道理,转义就足以了。在说代码在此之前,大家先来讲说现实通信的流水生产线,以 及我们接下去要实现的指标。

金沙澳门官网网址 3
在这里,我们的手提式有线话机端是透过拜访SAE服务器,由SAE服务器管理数据并与Tencent乐乎开放平台通信的,这里手提式有线电话机端并未直接和Tencent网易开放平台通信(作者这么 管理的由来是1,方便在服务器端处理帐户,那样的话能够洞察自个儿的行使的帐户处境;2,服务器端达成推送机制,方便管理token以及做api;3,服务 器端仍是能够和别的开放平台帐户绑定)。因而,大家的万事认证方案会在劳动器端完结。

而基于Tencent新浪开放平台,大家先是会在开放平台上边注册本身的选择,注册的流水生产线以及艺术本人不说了,注册的地址是:,注册你的施用后,你对号入座能够获得的事物是:

JavaScript

动用名称:mobile_test_api 应用项目:客户端应用 App Key:88888888 App Secret:ainidenideiienfeomeomroemrome

1
2
3
4
应用名称:mobile_test_api
应用类型:客户端应用
App Key:88888888
App Secret:ainidenideiienfeomeomroemrome

在此间笔者的App key以及App Secret是假的(你懂的,你应有有你和睦的),上面大家就采纳Tencent提须求我们的PHP SDK,下载地址:。有了SDK后大家就足以把SDK放到本身的条件方面,然后配置服务器端的代码了。下图是小编大概布署的服务端的代码,lib下存放的正是Tencent天涯论坛的sdk。当然实际生育条件和这些有两样。这里唯有看做示范使用:

金沙澳门官网网址 4

下边就依附Tencent今日头条认证的流程,逐个疏解一下那几个文件以及个中的代码吧。

index.php

PHP

<?php require_once 'app_config.php'; $url=" header('Location:'.$url);

1
2
3
4
5
6
<?php
require_once 'app_config.php';
 
$url="https://open.t.qq.com/cgi-bin/oauth2/authorize?client_id=".$client_id."&APP_KEY=".$app_key."&wap=2&response_type=code&redirect_uri=http://yoururl.com/get_auth.php";//指定URL地址
 
header('Location:'.$url);

此间引进的app_config.php

PHP

<?php $client_id = '8888888888'; $app_key = 'anienineiienrieireowq2839289';

1
2
3
4
5
<?php
 
$client_id = '8888888888';
 
$app_key = 'anienineiienrieireowq2839289';

因为依据今日头条易开放平台,大家首先步要博得的是Code,如下所述,我们要做的正是做好陈设,获取那一个Code

JavaScript

首先步:须要code 乞请方法: GET 哀告地址: 重临结果: 若是授权成功,授权服务器会将用户的浏览注重定向到redirect_uri,并带上code,openid和openkey等参数,重定向的url如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
第一步:请求code
 
请求方法:
GET
 
请求地址:
 
https://open.t.qq.com/cgi-bin/oauth2/authorize?client_id=APP_KEY&amp;response_type=code&amp;redirect_uri=http://www.myurl.com/example
 
返回结果:
如果授权成功,授权服务器会将用户的浏览器重定向到redirect_uri,并带上code,openid和openkey等参数,重定向的url如下:
 
http://www.myurl.com/example?code=CODE&amp;openid=OPENID&amp;openkey=OPENKEY

实际需求央求附带的参数,必须要依照oAuth2.0鉴权的页面提示的开始展览。()

下一场大家再来看看我们所安顿的公文:

get_auth.php

PHP

<?php require_once 'app_config.php'; $code = $_REQUEST['code']; $openid = $_REQUEST['openid']; $openkey = $_REQUEST['openkey']; $url = ""; $message = file_get_contents($url); /* success to print the access token message */ $access = explode("=",$message); print_r("<br />"); $access_message = explode("&",$access[1]); $access_token = $access_message[0]; $user_name = $access[4]; print_r($access_token ." " . $user_name);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
 
require_once 'app_config.php';
 
$code = $_REQUEST['code'];
 
$openid = $_REQUEST['openid'];
 
$openkey = $_REQUEST['openkey'];
 
$url = "https://open.t.qq.com/cgi-bin/oauth2/access_token?client_id=".$client_id."&client_secret=".$app_key."&grant_type=authorization_code&code=".$code."&redirect_uri=http://yoururl.com/get_auth.php";
 
$message = file_get_contents($url);
 
/* success to print the access token message */
 
$access = explode("=",$message);
 
print_r("<br />");
 
$access_message = explode("&",$access[1]);
 
$access_token = $access_message[0];
 
$user_name = $access[4];
 
print_r($access_token ."   " . $user_name);

实在到以上结束,大家的布署文件已经弄好了。在那一个布局文件中,实际上大家要做的就是微博易开放平新北谈到的第二步:

JavaScript

其次步:央求accesstoken 央求地址: 再次回到结果: 重临字符串: access_token=ACCESS_TOKEN&expires_in=60&refresh_token=REFRESH_TOKEN

1
2
3
4
5
6
7
8
9
第二步:请求accesstoken
 
请求地址:
 
https://open.t.qq.com/cgi-bin/oauth2/access_token?client_id=APP_KEY&amp;client_secret=APP_SECRET&amp;redirect_uri=http://www.myurl.com/example&amp;grant_type=authorization_code&amp;code=CODE
 
返回结果:
返回字符串:
access_token=ACCESS_TOKEN&amp;expires_in=60&amp;refresh_token=REFRESH_TOKEN

一经您以往早已配备好你的劳务端口,已经配备好手提式有线电话机端的ChildBrowser,你就已经能够在大哥伦比亚大学方面看看整个认证的流水生产线了。现在的劳作早就实现了绝大大多了,然则细心的相恋的人大概会发觉,对啊,认证是完毕了,手机上依旧不曾得到授权啊,因为授权后的信息还不能由此手提式有线电话机去获得。不要 急,ChildBrowser风趣的地方还不曾完呢。在手提式有线电话机端方面大家做到了oAuth认证,总有一对参数再次来到,不管accesstoken是不是存在手提式有线话机端,你必须有个帐户机制和服务端通信。我的服务端在SAE下边,作者就确立一个唯一id给手提式有线电话机,于是自身就确立了二个帐户机制,存在服务端上,服务端上囤积的东西是:

MySQL

CREATE TABLE IF NOT EXISTS `auth_user` ( `id` int(10) NOT NULL AUTO_INCREMENT, `muser` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `access_token` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `openid` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `openkey` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

1
2
3
4
5
6
7
8
9
10
CREATE TABLE IF NOT EXISTS `auth_user` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `muser` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `access_token` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `openid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `openkey` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

实际那个表也还从未健全,小编必须还要纪录那些用户是或不是在线(假若有推送机制)。此后手提式有线电话机端和服务端通信就经过地点的id以及token等的音信实行通信,再经过服务端想Tencent和讯开始展览api的报纸发表,获取大家想要的新闻。那么申明后大家通过什么路径得到表明后回去的音信吗?我们看看上边JS调控ChildBrowser的代码。会意识内部有多个方式:

JavaScript

cb.onLocationChange = function (loc){ console.warn(loc); };

1
cb.onLocationChange = function (loc){ console.warn(loc); };

若是你在xCode上面跑这段代码的话,你会发掘loc打出去的是历次ChildBrowser里面浏览的网页改造的地方。今年我们就能够顺水推舟,依照这里提供的主意,用url的秘籍把地址重回到Phonegap担当逻辑管理的JS代码中,同期将有关须要通信的消息也回到。再次来到后还是能够通过回 调的措施奉行关闭ChildBrowser的代码:

JavaScript

cb.close();

1
cb.close();

不移至理,你还能举行更加的多异步央求的代码。至于说还足以经过什么的法门开始展览报纸发表其实还或许有多数艺术,小编那边只有是提供一下思路指引以及艺术。具体的 话,还要举行出真理论,做到特别安全的通讯还值得大家继承深远研究。那么本身要介绍的光景就到此处甘休。因为其实项目中大家还会有push notification的体制,所今后来本人应当还或者会联同@Jeff_Kit 达成一下Phonegap的推送方案,并整治出sdk,成文后开放出来方便大家调换。

对此本文假诺有如何疑点还是建议都足以直接向本身举报,小编的新浪博客园是:@CashLee李秉骏 ,小编还八日三头分享部分代码片段在github上边(开源的精力十分的少,所以开源项目较少,希望现在扩展吗。)笔者的Github账号, 迎接您和作者时时开始展览沟通,也冀望Phonegap的华夏开辟者社区会变得更为美丽。

留意:ChildBrowser控件在事实上条件中因为安全主题素材只怕须要修改,通信进程中参数也提出加密。:-)

 

正文由李秉骏(@CashLee李秉骏)投稿于伯乐在线,也迎接任何朋友投稿。提示:投稿时记得留下和讯账号哦 金沙澳门官网网址 5

【如需转发,请标记并保留原著链接和小编等消息,多谢同盟!】

 

 

1 赞 收藏 2 评论

金沙澳门官网网址 6

return [
 //微信接入
 'wechat' =>[
 'token' => 'your token',
 ],
];

在微信公众号后台配置U哈弗L和Token,然后交给认证就可以。

2.接受微信发送的异步支付结果通报

复制代码 代码如下:

1.在app/config/params.php中配置token参数

3.微信支付类 WechatPay.php

wx.config({
    debug: true, // 开启调节和测试情势,调用的持有api的回来值会在客户端alert出来,若要查看传入的参数,能够在pc端张开,参数音讯会通过log打出,仅在pc端时才会打字与印刷。
    appId: '', // 必填,公众号的无可比拟标记
    timestamp: , // 必填,生成具名的时光戳
    nonceStr: '', // 必填,生成具名的人身自由串
    signature: '',// 必填,签名,见附录1
    jsApiList: [] // 必填,要求接纳的JS接口列表,全数JS接口列表见附录2
});

1.用户授权接口:获取access_token、openId等;获取并保存用户资料到数据库

public function getUserInfo($access_token,$openid)
{
    $request_url = '';
    //起头化二个curl会话
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $request_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    curl_close($ch);
    $result = $this->response($result);
    return $result;
}

基于微信公众平台开荒者文书档案:

2.在app/config/main.php中配置路由

四:获取JS-SDK的config参数

public function actionConfig(){
 if (isset($_REQUEST['url'])) {
 $url = $_REQUEST['url'];
 //微信支付参数
 $appid = Yii::$app->params['wechat']['appid'];
 $mchid = Yii::$app->params['wechat']['mchid'];
 $key = Yii::$app->params['wechat']['key'];
 $wx_pay = new WechatPay($mchid, $appid, $key);
 $package = $wx_pay->getSignPackage($url);
 $result['error'] = 0;
 $result['msg'] = '获取成功';
 $result['config'] = $package;
 } else {
 $result['error'] = 1;
 $result['msg'] = '参数错误';
 }
 return $result;
}

2.到手config参数接口

取得用户音信的相干接口

3.在app/controllers中新建WechatController

复制代码 代码如下:

 

如上正是利用Yii2微信后台开拓总体进程及示范代码,希望本文对大家基于php的微信公众平台开采具备帮忙。

你只怕感兴趣的篇章:

  • Yii2 RESTful中api的施用及支付实例详解
  • Yii第22中学安装与收获外号的函数(setAlias和getAlias)用法深入分析
  • Yii第22中学YiiBase自动加载类、引用文件措施深入分析(autoload)
  • Yii2创设调控器(createController)方法详解
  • Yii2大旨(Theme)用法详解
  • Yii2创立表单(ActiveForm)方法详解
  • Yii2验证器(Validator)用法解析
  • yii2 RBAC使用DbManager实现后台权限判定的法子
  • Yii2轻松达成多语言配置的点子
  • yii2调节器Controller Ajax操作示例
  • Yii第22中学Restful API原理实例分析
'urlManager' => [
 'enablePrettyUrl' => true,
 'enableStrictParsing' => true,
 'showScriptName' => false,
 'rules' => [
 [
  'class' => 'yiirestUrlRule',
  'controller' => 'wechat',
  'extraPatterns' => [
  'GET valid' => 'valid',
  ],
 ],
 ],
],

持有需求采取JS-SDK的页面必须先注入配置新闻,否则将不也许调用(同二个url仅需调用三回,对于变化url的SPA的web app可在每一遍url变化时打开调用,近些日子Android微信客户端不援助pushState的H5新特点,所以采纳pushState来贯彻web app的页面会促成签名退步,此难点会在Android6.第22中学期维修复)。

二:获取用户新闻

<?php
namespace apisdk;
use Yii;
class WechatPay
{
    public function getSignPackage($url) {
        $jsapiTicket = self::getJsApiTicket();
        $timestamp = time();
        $nonceStr = self::createNonceStr();
        // 这里参数的一一要鲁人持竿 key 值 ASCII 码升序排序
        $string = "jsapi_ticket=".$jsapiTicket."&noncestr=".$nonceStr."×tamp=".$timestamp."&url=".$url;
        $signature = sha1($string);
        $signPackage = array(
            "appId"     => $this->appid,
            "nonceStr"  => $nonceStr,
            "timestamp" => $timestamp,
            "url"       => $url,
            "signature" => $signature,
            "rawString" => $string
        );
        return $signPackage;
    }
    public static function getJsApiTicket() {
        //使用Redis缓存 jsapi_ticket
        $redis = Yii::$app->redis;
        $redis_ticket = $redis->get('wechat:jsapi_ticket');
        if ($redis_ticket) {
            $ticket = $redis_ticket;
        } else {
            $accessToken = self::getAccessToken();
            $url = ";
            $res = json_decode(self::curlGet($url));
            $ticket = $res->ticket;
            if ($ticket) {
                $redis->set('wechat:jsapi_ticket', $ticket);
                $redis->expire('wechat:jsapi_ticket', 7000);
            }
        }
        return $ticket;
    }
    public static function getAccessToken() {
        //使用Redis缓存 access_token
        $redis = Yii::$app->redis;
        $redis_token = $redis->get('wechat:access_token');
        if ($redis_token) {
            $access_token = $redis_token;
        } else {
            $appid = Yii::$app->params['wechat']['appid'];
            $appsecret = Yii::$app->params['wechat']['appsecret'];
            $url = ";
            $res = json_decode(self::curlGet($url));
            $access_token = $res->access_token;
            if ($access_token) {
                $redis->set('wechat:access_token', $access_token);
                $redis->expire('wechat:access_token', 7000);
            }
        }
        return $access_token;
    }
    public static function curlGet($url = '', $options = array()){
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        if (!empty($options)) {
            curl_setopt_array($ch, $options);
        }
        //https乞求 不表达证书和host
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
    public static function curlPost($url = '', $postData = '', $options = array()){
        if (is_array($postData)) {
            $postData = http_build_query($postData);
        }
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cU君越L允许实践的最长秒数
        if (!empty($options)) {
            curl_setopt_array($ch, $options);
        }
        //https央求 不表达证书和host
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
    public static function createNonceStr($length = 16){
        $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
金沙澳门官网网址 ,        $str = '';
        for ($i = 0; $i<$length; $i ){
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }
}

复制代码 代码如下:

本文由金沙澳门官网发布于前端知识,转载请注明出处:健全应用Yii2微信后台开采的成千上万计算

关键词: 金沙澳门官网

上一篇:时间流互联网之未来
下一篇:没有了