月度存档: 11 月 2018

yii2-restful-api-study8-api频次,版本,返回格式,错误处理

api访问频率限制
1.修改需要限制频率的用户model类,使其继承RateLimitInterface接口,
use yii\filters\RateLimitInterface;
2.实现该接口需要实现的3个方法

//频率限制
    public function getRateLimit($request,$action){
        return [2,1];//每秒请求2 times
    }

    public function loadAllowance($request,$action){
        return [$this->allowance,$this->allowance_updated_at];
    }

    public function saveAllowance($request,$action,$allowance,$timestamp){
        $this->allowance = $allowance;
        $this->allowance_updated_at = $timestamp;
        $this->save();
    }

3.修改控制器的behaviors(好像不加这一步也可以实现频率限制)

//频率限制
        $behaviors['rateLimiter']=[
            'class'=>RateLimiter::className(),
            'enableRateLimitHeaders'=>true,
        ];

版本控制

1.利用yii2系统自带的gii工具生成module,系统的目录结构参考api/modules/v2/controllers/
2.修改config/main.php文件,添加module,添加route

'modules' => [
        'v2' => [
            'class' => 'api\modules\v2\Module',
        ],
    ],
 ...
 [
                    'class' => 'yii\rest\UrlRule', 
                     'controller' => ['v2/test'], //版本2,test为控制器名称
                     'pluralize'=>false,//url不带复数
]   

返回数据格式化

1.可以在config/main.php里面定义response

'response' => [
            'class' => 'yii\web\Response',
            'on beforeSend' => function ($event) {
                $response = $event->sender;
                $response-> format = yii\web\Response::FORMAT_JSON; //定义所有控制器的返回数据格式


            },
        ]

2.也可以在单个控制器里面设定该控制器的返回格式化的数据

ps:格式响应:定义当前控制器的返回数据格式:(如果main.php和里面的behaviors同时定义了,则以里面定义为主)

      //  $behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_HTML;//Response::FORMAT_XML;Response::FORMAT_JSON;

返回数据自定义错误数据格式

修改config/main.php,在beforeSend里添加如下代码:

$response-> format = yii\web\Response::FORMAT_JSON;//自定义返回的数据类型必须和这里的定义一致,不然会报错
$response->statusCode = 200;//自定义返回错误码,方便前端统一用json格式处理数据
                $obj = 
                [
                    'success'=>$response->isSuccessful,
                    'code'=>$response->getStatusCode(),
                    'data'=>$response->data,
                    'message'=>$response->statusText
                ];
                $response-> data = $obj;

yii2-restful-api-study7-api权限管理rbac

原理:利用yii2-admin来管理api权限

1 安装yii2-admin

pre-install composer
$ composer config -g repo.packagist composer https://packagist.phpcomposer.com
$ composer require mdmsoft/yii2-admin "~2.0"

2 配置backend/config/main.php

<?php
$params = array_merge(
    require __DIR__ . '/../../common/config/params.php',
    require __DIR__ . '/../../common/config/params-local.php',
    require __DIR__ . '/params.php',
    require __DIR__ . '/params-local.php'
);

return [
    'id' => 'app-backend',
    'basePath' => dirname(__DIR__),
    'controllerNamespace' => 'backend\controllers',
    'bootstrap' => ['log'],
    'modules' => [
        'admin' => [
            'class' => 'mdm\admin\Module',
        ]
                ],
    'components' => [
        'request' => [
            'csrfParam' => '_csrf-backend',
        ],
        'user' => [
            'identityClass' => 'common\models\User',
            'enableAutoLogin' => true,
            'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true],
        ],
        'session' => [
            // this is the name of the session cookie used for login on the backend
            'name' => 'advanced-backend',
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        /*
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],
        */
         'authManager' => [
            'class' => 'yii\rbac\PhpManager', // or use 'yii\rbac\DbManager'
        ]
    ],
    'as access' => [
        'class' => 'mdm\admin\components\AccessControl',
        'allowActions' => [
            'site/*',
            'admin/*',
            'some-controller/some-action',
        ]

    ],

    'params' => $params,
];


3 访问 yourpath/index.php?r=admin

或者index.php?r=admin%2Froute (ps: 访问encodeURIComponent后的url,直接admin/route会有问题)

4 利用 AdminLTE 渲染后台模板,优化用户体验

4.1 进入 cmd,切换到 advanced 目录,输入

composer require dmstr/yii2-adminlte-asset "2.*"

4.2 复制 vendor/dmstr/yii2-adminlte-asset/example-views/yiisoft/yii2-app里面的两个文件夹 到 backend/views/,覆盖views下的对应文件夹(自己写的先备份,这里只覆盖系统生成的)

再访问 http://localhost/path/to/index.php?r=admin 看效果

4.3 自己记控制器命令总不如点击链接来得方便,所以可以配置下左侧菜单,

修改backend\views\layouts\left.php

 [
                        'label' => '权限管理',
                        'icon' => 'share',
                        'url' => '#',
                        'items' => [
                            ['label' => '权限', 'icon' => 'file-code-o', 'url' => ['/admin/permission'],],
                            ['label' => '角色', 'icon' => 'dashboard', 'url' => ['/admin/role'],],
                            ['label' => '分配', 'icon' => 'dashboard', 'url' => ['/admin/assignment'], ],
                            ['label' => '菜单', 'icon' => 'dashboard', 'url' => ['/admin/menu'], ],
                            ['label' => '路由', 'icon' => 'dashboard', 'url' => ['/admin/route'],],
                        ],
                    ],

进入 cmd,切换到 advanced 目录,输入
yii migrate --migrationPath=@mdm/admin/migrations
成功执行以后查看数据库会发现里面多了张menu表

5 配置用数据库表来存储rbac数据

5.1 修改backend/config/main.php

 'authManager' => [
            'class' => 'yii\rbac\DbManager', // or use 'yii\rbac\DbManager'
        ]

修改common/config/main-local.php,components里加入上面代码

5.2 执行

yii migrate --migrationPath=@yii/rbac/migrations
成功执行以后查看数据库会发现里面多了四张auth开头的授权表

配置这块就先到这里,接下来学习怎么使用这么强大的权限分配工具
思路:先从route里把要设置的function拉到一个权限池子里;然后新建permission,用来打包池子里的function;接着给用户分配权限包

5.3 api的权限分配分两种情况

5.3.1 控制系统生成的function(比如view,index,delete,modify)

在控制器里加上如下函数checkAccess:

//rbac情况一:系统生成的方法,testview,test为打包好route的permission名称
    public function checkAccess($action,$model=null,$params=[])
    {
        if($action==="view"){
            if(\Yii::$app->user->can('testview')){
                return true;
            }
        }

        if($action==="view"||$action==="update"||$action==="delete"||$action==="create"||$action==="index"){
            if(\Yii::$app->user->can('test')){
                return true;
            }
        }

        throw new ForbiddenHttpException("sorry , no authority!");
    }

5.3.2 控制自定义或者重写的function

就在每个定义的function前面加上判断,比如:

//rbac情况二:自定义的方法或者重写的方法,fun为打包好route的permission名称
    public function actionFun(){
        if(!\Yii::$app->user->can('fun')){
            throw new ForbiddenHttpException("sorry , no authority!");
        }
        return "ok";
    }

搭建私有git仓库

简单步骤:
1、安装git服务,并创建git账号
2、创建示例仓库sample
3、导入客户端公钥
4、客户端连接并提交内容
5、修改Git权限,只使用git-shell命令

— detail —

一、安装git
直接通过apt-get安装git。使用这个方式比较简单,当然也可以使用git源代码自己编译最新版本。

apt-get update

apt-get install git -y

1.1 创建git用户
创建git账户并登录,直接指定用户目录到/home/git

useradd git -d /home/git -m -s /bin/bash

passwd git //设置git用户的密码

Enter new UNIX password: //输入新密码,输入的密码无回显
Retype new UNIX password: //确认密码
passwd: password updated successfully

su git

添加用户 user add
-d:指定用户目录
-m:如果目录不存在则创建
-s:可以指定用户使用的命令

二、创建sample库
创建库很简单,注意使用–bare参数。作为代码仓库服务器并不会在上面修改东西,所以只要有相关提交日子就可以。

$ cd ~
$ git init –bare sample.git
三、设置SSH Key
收集客户端公钥,复制到服务器上。 客户端当前账号RSA或DSA的数字签名文件id_rsa.pub 在.ssh用户目录中。通常情况下windows在 %userprofile%.ssh 目录中,Mac在~/.ssh目录中。

mac上可以直接使用下面命令复制粘贴板上,或使用ssh上传

$ pbcopy < ~/.ssh/id_rsa.pub
win7上可以打开Git GUI界面有个帮助->show SSH Key菜单,如果没创建过可以点击创建SSH的签名文件,并复制公钥保存到服务器上。如果使用第三方的SSHKey服务,那可能实际位置会有些差异。

生成本地用户的签名文件,并把客户端上公钥导入到服务器上。如果有多个的话可以放在一个目录中,方便导入。如果是团队人比较多这种方式可能就不太适合了。

如把客户端的key文件mymac.pub和mywin.pub导入。

$ ssh-keygen -t rsa -b 4096
$ cat mymac.pub >> ~/.ssh/authorized_keys
$ cat mywin.pub >> ~/.ssh/authorized_keys
3.1 客户端获取sample库,并增加文件上传到服务器
在Mac客户端获取。

$ git clone ssh://git@221.99.99.99:9922/home/git/sample.git
Cloning into ‘sample’…
warning: You appear to have cloned an empty repository.
Checking connectivity… done.
获取成功OK,增加一个文件,并提交到服务器上

$ cd sample
$ cat >> readme.md
first file.
^c
$ git add .
$ git commit -m “first commit”
$ git push origin master
3.2 服务器上查看状态
$ git log
commit 8b070256af351b43a74753f0b05969fcfe9c7310
Author: moguf moguf_notify@163.com
Date: Sun Apr 3 20:49:17 2016 +0800

first commit

3.3 在Win客户端获取
windows上可以直接使用git或TortoiseGit获取。

git@192.168.10.14:/home/git/sample.git
新建一个文件并提交到服务器上。在服务器上通过git log就能看到第二提交的内容。mac客户机上git pull能看到刚才新加的文件。

这样Git服务器仓库功能基本完成。

四、安全问题
为安全考虑Git账号只允许使用git-shell。在passwd文件中找到git用户,把/bin/bash直接修改成/usr/bin/git-shell 登录root账号,并修改git的用户权限。

$ su

vim /etc/passwd

这样git用户只能git-shell命令不能登录了。

使用 su git 命令就会出现下面提示,git用户就无法登录到shell,这样就OK了。

su git

fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.

ssh 远程登陆指定端口

ssh 到指定端口 ssh -p xx user@ip xx 为 端口号 user为用户名 ip为要登陆的ip

SSH 原理及远程登录

http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html

http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html

vps安全防护

你以为你的vps很安全吗,先来跑两个命令瞅瞅:

查看尝试暴力破解机器密码的人

sudo grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more

查看暴力猜用户名的人

sudo grep "Failed password for invalid user" /var/log/auth.log | awk '{print $13}' | sort | uniq -c | sort -nr | more

1.修改连接端口

vi /etc/ssh/sshd_config
找到#Port 22

删除注释,将22改成自己的端口,不容易被人发现的。比如999,5321等。
然后
service sshd restart

iptable放行

我们在设置新的非22端口之后,是否放行端口。有些时候服务器因为重启或者没有保存,导致自定义的SSH端口失效,我们需要检查或者重新设置放行。

/sbin/iptables -I INPUT -p tcp --dport 11222(你修改的端口) -j ACCEPT

/etc/init.d/iptables save

2. 设置免密登录

假设要登录的服务器机器为192.168.1.100,当前登录的linux机器为192.168.1.101。
首先在101的机器上生成密钥(如果已经生成可以跳过):
$ ssh-keygen -t rsa
一路回车即可。
然后在将生成的公钥复制到机器100上的~/.ssh/authorized_keys中,使用如下命令:
$ ssh-copy-id -i ~/.ssh/id_rsa.pub -p port root@192.168.1.100
root为需要登录到机器100上的身份,需要替换成需要的用户名。
windows系统下的securecrt免密码登录参考:
https://www.cnblogs.com/harrymore/p/8639331.html

关闭ssh的密码登录

vim /etc/ssh/sshd_config
在如上目录找到ssh服务的配置文件,将如下字段进行修改:
#PasswordAuthentication yes
//修改为如下内容:
PasswordAuthentication no
//使用命令重启ssh服务:
//ubuntu:
/etc/init.d/ssh restart
//centos7:
查看状态:
systemctl status sshd.service
启动服务:
systemctl start sshd.service
重启服务:
systemctl restart sshd.service
开机自启:
systemctl enable sshd.service

3. 限定登陆ip

比如我们在 /etc/hosts.allow中加入
all:218.24.129.
这样就会允许来自218.24.129.*域的所有的客户来访问。这只是举个例子,实际上,系统默认状态 下,都是能用这些网络服的

如果我们在 /etc/hosts.deny中加入,就限制了来自218.24.129.*域的所有的所有的IP。
all:218.24.129.

如果我们在 /etc/hosts.deny中加入
all:218.24.129.134,这样就限制了所有在218.24.129.134中的所有的用户的访问。

或者:
sshd:all

当hosts.allow和 host.deny相冲突时,以hosts.allow设置优化。

设置好后,要重新启动
/etc/rc.d/init.d/xinetd restart
/etc/rc.d/init.d/network restart
/etc/init.d/networking restart(ubuntu)

4. 禁用Linux多余端口(ubuntu)

centos设置参考文末

4.1 查看防火墙激活状态

ufw status
如果终端显示防火墙未激活(理论上都应该是这样,因为 ufw 是系统内置的。)
ufw enable

4.2 我们使用如下命令来添加规则:

ps:一定要添加好规则后再启动防火墙
ufw allow ssh
ufw allow http
ufw allow https
//请务必开启 ssh 端口,如果你不是标准端口,请记得开启,否则ssh就连接不上了!
ufw allow from your-login-ip-addr to any port you-set-port proto tcp
ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)?
y
//会提示你影响ssh 连接,但只要提前加入了规则,就不会影响。

删除规则

要首先删除其编号的 UFW 规则,您需要列出规则并找到要删除的规则编号:

sudo ufw status numbered

该命令将为您提供所有防火墙规则的列表,包含了规则的编号:

输出示例

Status: active

To                        Action      From
--                        ------      ----

[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] 8069/tcp ALLOW IN Anywhere

知道规则编号后,请使用 ufw delete 命令后跟要删除的规则编号。

例如,要删除编号为 4 的规则,您可以键入:

sudo ufw delete 4

4.3 开机启动

对了!记得使用如下命令来导出配置,然后配置启动加载,否则重启后各种规则就消失不见啦!

//导出配置,以后可以直接编辑;
iptables-save > /etc/iptables.up.rules
//导入配置
iptables-restore < /etc/iptables.up.rules
编辑之后就可以导入立即生效!
vim /etc/network/interfaces
auto eth0
iface eth0 inet dhcp
//最后这一条就是要添加进的命令!
pre-up iptables-restore < /etc/iptables.up.rules

5. 创建非root用户

adduser 新用户名
passwd 新用户名密码
su 新用户名

6.设置密码失效时间

强制定期修改密码,减少密码被泄漏和猜测风险,使用非密码登陆方式(如密钥对)请忽略此项。
加固建议
使用非密码登陆方式如密钥对,请忽略此项。在 /etc/login.defs 中将 PASS_MAX_DAYS 参数设置为 60-180之间,如:
PASS_MAX_DAYS 90
需同时执行命令设置root密码失效时间:
chage --maxdays 90 root

7.设置SSH空闲超时退出时间

可降低未授权用户访问其他用户ssh会话的风险
加固建议
编辑/etc/ssh/sshd_config,将ClientAliveInterval 设置为300到900,即5-15分钟,将ClientAliveCountMax设置为0-3之间。
ClientAliveInterval 600
ClientAliveCountMax 2

8.设置密码修改最小间隔时间,限制密码更改过于频繁

加固建议
在 /etc/login.defs 中将 PASS_MIN_DAYS 参数设置为7-14之间,建议为7:
PASS_MIN_DAYS 7
需同时执行命令为root用户设置:
chage --mindays 7 root

9.密码复杂度检查

检查密码长度和密码是否使用多种字符类型
加固建议
1、安装PAM的cracklib模块,执行命令:
apt-get update&&apt-get install libpam-cracklib
2、编辑/etc/pam.d/common-password,在password requisite pam_cracklib.so开头的这一行配置minclass(至少包含小写字母、大写字母、数字、特殊字符等4类字符中的3类或4类)设置为3或4,即在行末尾加上参数minclass=3;在password [success=1 default=ignore] pam_unix.so开头的这一行增加配置minlen(密码最小长度)设置为9-32位,建议为9,即在行末尾加上参数minlen=9

10.强制用户不重用最近使用的密码,降低密码猜测攻击风险

加固建议
编辑/etc/pam.d/common-password,在password [success=1 default=ignore] pam_unix.so开头的这一行增加配置remember设置为5-24之间,建议为5,即在行末尾加上参数remember=5

11.设置用户权限配置文件的权限

加固建议
执行以下5条命令
chown root:root /etc/passwd /etc/shadow /etc/group /etc/gshadow
chmod 0644 /etc/group
chmod 0644 /etc/passwd
chmod 0400 /etc/shadow
chmod 0400 /etc/gshadow


日常检查

第一点,检查用户行为记录。

more /var/log/secure
who /var/log/wtmp
通过以上两个命令可以检查VPS是否有用户登录过的记录,第二个命令是登陆VPS的IP记录。如果有不是自己的IP登陆,那说明我们VPS有安全问题,需要检查文件。

第二点,检查网页文件是否有被修改过的痕迹。

find /home/wwwroot/ -name "*.php" -mtime -5

以上的意思是检查wwwroot目录下是否有PHP文件后缀的文件在5天之内被修改过。如果有就会有列表展示出来。这两个方法应该可以检测我们的Linux VPS的安全问题。

禁用Linux多余端口及ip

firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" \
source address="192.168.0.4/24" service name="http" accept"

仅允许部分IP访问本机端口配置
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" \
source address="192.168.0.4/24" \
port protocol="tcp" port="443" accept"

统计 TCP连接数 命令:
netstat -an |grep 'ESTABLISHED' |grep 'tcp' |wc -l
端口控制
netstat -apn | grep 443
定期检查tcp连接:
netstat -na|grep ESTABLISHED
封自己不熟悉的ip:
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='118.31.180.41' reject"
生效
firewall-cmd --reload
其他命令:

#查看firewall状态,LINUX7默认是安装并开启的;
firewall-cmd --state
#安装
yum install firewalld

#启动
systemctl start firewalld 
#设置开机启动
systemctl enable firewalld
#关闭
systemctl stop firewalld
#取消开机启动
systemctl disable firewalld
#允许端口:3389
firewall-cmd --permanent --add-port=3389/tcp
#禁止IP(123.56.161.140)访问机器
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="123.56.161.140" drop'
#禁止一个IP段,比如禁止123.56.*.*
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="123.56.0.0/16" drop'
#禁止一个IP段,比如禁止123.56.161.*
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="123.56.161.0/24" drop'
#禁止机器IP(123.56.161.140)从防火墙中删除
firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address="123.56.161.140" drop'
#允许http服务(对应服务策略目录:/usr/lib/firewalld/services/)
firewall-cmd --permanent --add-service=http
#关闭http服务(对应服务策略目录:/usr/lib/firewalld/services/)
firewall-cmd --permanent --remove-service=http

#允许端口:1-3389
firewall-cmd --permanent --add-port=1-3389/tcp
#关闭放行中端口:3389
firewall-cmd --permanent --remove-port=3389/tcp
#查看firewall的状态
firewall-cmd --state        
#查看防火墙规则(只显示/etc/firewalld/zones/public.xml中防火墙策略,在配置策略前,我一般喜欢先CP,以后方便直接还原)
firewall-cmd --list-all 
#查看所有的防火墙策略(即显示/etc/firewalld/zones/下的所有策略)
firewall-cmd --list-all-zones 
#重新加载配置文件
firewall-cmd --reload
#更改配置后一定要重新加载配置文件:
firewall-cmd --reload

linode不想走ipv6浪费流量:
https://www.linode.com/community/questions/17409/how-do-i-remove-my-ipv6-from-my-linode

更多参考:

购买了VPS之后你应该做足的安全措施


https://zhuanlan.zhihu.com/p/26282070

layaair2开发微信小程序总结

最近用layaair2开发了个微信的小程序,遇到一些问题,不过都解决了,现在把要注意的地方记录下来,方便后续开发,也希望能帮助和我一样遇到问题的同学

1.新建的ui场景相当于flash里面的mc,导出模式选分离模式相当于mc的关联类自动导出(这个类不能手工修改,这个地方和flash里面不一样),注意一定要选分离模式,不然ui下面不会自动生成相关类,新建script脚本,自定义ui类放在这个里面,继承对应的ui页面类,在ide里面关联到页面的runtime属性,这样可以直接引用ui页面有var变量定义的元素(这个自定义的继承类就可以像flashmc的导出类一样随便改了)

有人会问name和var的区别:name一般被用来对象池的引用,var用来被ui页面引用

1.1 可以将控制类的脚本拖到场景ui页面上,如果要在控制类里面操作对象池的对象(比如系统提供Image类的对象,或者自定义的类的对象),必须在声明该对象的时候,同时声明面板属性,参考示例代码:

/** @prop {name:dropBox,tips:"掉落容器预制体对象",type:Prefab}*/ 
        public var dropBox:Prefab;

1.2 这样后面的函数就可以从对象池里拿到这个对象啦

var box:Sprite = Pool.getItemByCreateFun("dropBox", this.dropBox.create, this.dropBox);

2.微信屏幕适配,注意入口main文件加上这个

import laya.wx.mini.MiniAdpter;

构造函数里第一行加:

public function Main() {
            //for js
            //定义一个命名空间的属性为myapp,方便外面自定义js引用;
            Browser.window.myapp = this;
            MiniAdpter.init();//for wx
            //GameConfig.width,     GameConfig.height这里可以手工改成mc_stage的大小(GameConfig是ide自动生成的改不了)
            if (window["Laya3D"]) window["Laya3D"].init(GameConfig.width,   GameConfig.height);
            else Laya.init(GameConfig.width, GameConfig.height, Laya["WebGL"]);
}

3.微信小程序后台设置地址(配置服务器域名啥的):https://mp.weixin.qq.com/ 需要微信扫码登陆

4.微信账号登陆及获取用户信息:

4.1 在bin目录下新建wxlogin.js

//wxlogin.js
var gameLogin=new Function()
    {
        wx.login(
        {
            success: (res) => 
            {
                if (res.code) 
                {
                    code= res.code;
                    console.log("登陆成功,获取到code"+code);
                }
                var button = wx.createUserInfoButton(
                {
                    type: 'text',
                    text: '点击进入游戏',
                    style: 
                    {
                        left: wx.getSystemInfoSync().windowWidth/2-70,
                        bottom: wx.getSystemInfoSync().windowHeight/2,
                        width: 140,
                        height: 40,
                        lineHeight: 40,
                        backgroundColor: '#ff0000',
                        color: '#ffffff',
                        textAlign: 'center',
                        fontSize: 16,
                        borderRadius: 4
                    }
                })
                button.onTap((res) => 
                {
                    if(res.errMsg=="getUserInfo:ok")
                    {
                        console.log("授权用户信息")
                        //获取到用户信息
                        wxUserHead = res.userInfo.avatarUrl
                        wxUserName = res.userInfo.nickName
                        //LayaSample.gameLoad.toStartGame()
                        console.log(wxUserHead);
                        console.log(wxUserName);
                        myapp.startGame();
                        //清除微信授权按钮
                        button.destroy()
                    }
                    else
                    {
                        console.log("授权失败")
                    }
                })
            }
        })
    }

4.2 在bin/game.js第一行加入

require("wxlogin.js");

4.3 在src/Main.as里修改函数:

    private function onConfigLoaded():void {
            //加载场景
            //GameConfig.startScene && Scene.open(GameConfig.startScene);
            //for wx_login
            if(Browser.window.gameLogin!=undefined){
                Browser.window.gameLogin();
            }
            else{
                console.log("no login!");
            }
            //startGame(); 
        }

4.4 发布到微信平台,用微信开发工具打开编译即可

4.5 用户信息拿到了,但是需要存储用户数据的话,需要一个唯一标识,微信提供了一个get方法调用wx.login得到的code来获取session_key和openid:

https://api.weixin.qq.com/sns/jscode2session?appid=wx796fdc1d403f4ae7&secret=ed49b3f560d46dd116dbefd5a4c2d6f8&js_code=001QMKab1c34mv0FUIcb1AIabb1QMKax&grant_type=authorization_code

5.关于屏幕适配

我常用的配置:

//main.as
public function Main() {
//根据IDE设置初始化引擎      
    GameConfig.width=375;
    GameConfig.height=667;
    GameConfig.scaleMode="showall";
......
}

详细文档参考http://ldc.layabox.com/doc/?nav=zh-as-1-8-0

本站服务

1.免费资源-为天地立心
2.体系知识-为科技立命
3.实战项目-为大牛继绝学
4.线下交流-为教育开太平

python3基础10-数据可视化

python3基础9-测试

python3基础8-文件和异常

#coding:utf-8
#write file 覆盖之前的文件
#with open("1.txt","w") as b:
#  b.write("today is a good day")
#write file 在之前的文件后面新加
#with open("1.txt","a") as b:
#  b.write("\ntoday is a ok day")
#读取和写入模式打开,覆盖之前的内容并且第一行留空
with open("1.txt","r+") as b:
    b.write("\ntoday is a r day")

#read file
#默认为只读r
with open("1.txt") as a:
    '''
    c = a.read()
    print(c.rstrip())
    '''
    '''
    for line in a:
        print(line.rstrip())
    '''
    lines = a.readlines()
    for line in lines:
        print(line.rstrip())

#json数据存储
import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename,'w') as f_obj:
    json.dump(numbers, f_obj)

with open(filename) as f_obj:
    numbers = json.load(f_obj)
    print(numbers)

#异常
try:
    print(5/0)
except ZeroDivisionError:
    print("zero")

try:
    print(5/0)
except ZeroDivisionError:
#什么也不做
    pass

try:
    print(5/2)
except ZeroDivisionError:
    print("zero")
else:
    print("ok")

filename = 'alice.txt'
try:
    with open(filename) as f_obj:
        contents = f_obj.read()
except FileNotFoundError:
    msg = "Sorry, the file " + filename + " does not exist."
    print(msg)