分类 技术学习 下的文章

第三方登录和支付开发记录

登录

微信登录

微信登录需要注意的一点是微信的网页应用、移动应用、公众号的上限都是10个,所有同一个账号下的应用获取到的 union_id 是相同的,open_id 不同,所以需注意应用数量是否会超过上限。

微信登录目前只有APP登录、扫码登录和公众号登录三种登录方式,在微信浏览器内打开网页使用的是公众号登录的方式,其他浏览器只能使用扫码登录,换句话说目前移动端非微信浏览器打开的网页基本无法使用微信登录。

微信登录所需的信息基本在微信开放平台中,open.weixin.qq.com。新建应用需经过审核,一般两三个工作日内就会有反应,修改信息后需要重新审核的情况下,应用会以此次修改信息之前的状态正常运行,所以不必担心上线后改动应用基本信息。

扫码登录

使用场景为pc端浏览器打开网页时用手机扫描二维码进行登录,移动段浏览器虽然也可以通过将图片保存下来后使用微信扫描等方式实现登录,但是十分不方便而且成功率较低。

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=37dc565662c0fbc0f5c485f884f25f4da6f01b19&lang=zh_CN

公众号登录

使用场景为通过微信自带浏览器打开网页时唤起微信授权登录页面进行授权登录。

文档见 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432&token=&lang=zh_CN 中的微信网页授权章节

公众号登录的一个神奇疑似bug:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxa77178c0a05b6498&redirect_uri=http%3A%2F%2Fh5.2144.com%2Fsite%2Fauth%3Fauthclient%3Dweixin-mp&scope=snsapi_userinfo&response_type=code

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxa77178c0a05b6498&response_type=code&redirect_uri=http%3A%2F%2Fh5.2144.com%2Fsite%2Fauth%3Fauthclient%3Dweixin-mp&scope=snsapi_userinfo

上面两个链接除了参数的顺序不同之外完全相同,但是上面那个链接可以正常显示授权页面,下面那个则不可以,具体触发原因不明(貌似appid和redirect_uri不相邻则不行),貌似下面那个链接非百分百无法访问。~~这个问题简直搞死我了~~

原生APP登录

移动端通过sdk进行登录后就能获取到所需的用户信息,然后客户端把这些信息传给服务端,服务端相比前两种方式省去了通过授权码获取用户信息的步骤。

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=41d9521a6fd56f08d54a099d4952c5fecaa86441&lang=zh_CN

QQ登录

QQ登录如果要做平台化的话,需要用union_idunion_id需要发邮件申请打通应用间数据才能获取到。

QQ登录所需的信息在QQ互联:https://connect.qq.com/中,而不是QQ开放平台。如果是公司使用,建议不要使用个人账号进行注册,否则会带来很多麻烦。

微博登录(待续)

支付

支付宝支付

即时到账

https://doc.open.alipay.com/docs/doc.htm?treeId=108&articleId=103950&docType=1

手机网站支付

https://doc.open.alipay.com/docs/doc.htm?treeId=193&articleId=105288&docType=1

APP支付

https://doc.open.alipay.com/docs/doc.htm?treeId=204&articleId=105051&docType=1

微信支付

扫码支付

https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1

该支付方式适用于在pc网页上显示支付二维码进行扫码支付的场景。

公众号支付

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1

该方式适用于使用微信自带浏览器打开网页时进行支付的场景。

APP支付

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1

该支付方式适用于原生APP内进行支付的场景。

H5支付

https://pay.weixin.qq.com/wiki/doc/api/wap.php?chapter=15_1

该支付方式适用于手机普通浏览器打开网页时进行支付的场景,但是改方式腾讯还在内测中,只开放给特定商户使用。详见:非微信内wap版微信支付

Yii2 使用jsonp格式response时遇到的一个坑

最近的一个项目在实现前后端分离时,由于调用域名与接口域名可能不相同,所以使用了jsonp格式进行返回,但是在开发环境上开了debug的情况下遇到500错误时竟然没有任何错误显示,也即response body是空的,这让我很困扰。

通过查看 Yii 写的文件日志发现,这是 Yii 在默认的 ErrorHandler 中没有对 jsonp 格式返回进行特殊处理造成的,于是便在 github 上提了一个 issue。从回复来看,一年前就有人修改了jsonpformatter的实现,不过由于会破坏兼容性,所以一直没正式接收。话说原本的jsonp实现方式实在是太坑了,和其他几种Formatter的实现不一致,使用起来很不方便,希望Yii官方早点改掉吧。

PHP项目开发实践总结内部分享大纲

项目部署相关

  • 项目命名: 域名中 . 替换为 _,如: app.domain.com 项目名为 app_domain_com。关于分支,deploy分支用于部署到正式环境,如有测试环境的需要可以添加test分支,如果测试环境对稳定性有需求的话可以开develop分支,如果是多人协作的项目中有周期较长的功能模块需要开发则可以单独新开分支。
  • 所有在上线时需要忽略的文件都写到.gitignore里,这样运维在配置发布系统时也比较方便
  • 如果开启了 opcache,则每次新代码上线之后都需要清空 opcache 缓存(service php-fpm reload 或者通过调用cgi的opcache),否则上线后没有效果。
  • 如果在composer.json中添加了自定义的自动加载项,如使用了git subtree的情况下,每次上线后可能都需要重新 composer dump-autoload 一遍。该问题可复现,但具体出现原因不明
  • 服务器若仅有内网,外网是通过proxy进行访问的情况下需注意代码的行为可能会和预期的不一致(主要curl等操作)
  • 服务器在使用了内网namedserver的情况下,如果 nginx 使用unix socket的方式调用php-fpm的话,可能不生效

性能优化相关

  • php7(php 各版本新特性的分享中提到过 php7 的性能对照)
  • opcache(开启了 opcache 的 php7 才能展现出真正的高性能)
  • composer dump-autoload -o (能一定程度上提升第三方库的加载效率,尤其是在未开启 opcache 的情况下)
  • 项目配置(如主要提供 api 的项目可以关闭 session 以提升性能)
  • redis/memcache缓存(尤其适用于查询接口较多的项目,性能提升明显)

静态资源部署

  • protocol relative url(方便地切换 http 和 https)
  • 版本号(日期时间序列或hash)
  • 静态资源域名采用特定的静态资源域名,防止 cookie 过大对加载时间造成影响
  • 浏览器对相同域名的并发连接数限制,一般浏览器是6个,http2是一个服务器一个连接而不是一个资源一个连接所以对于复杂页面性能提升很大,http2的硬性要求是https

编码风格相关

  • php-cs-fixer用法,已分享
  • phpstorm自带代码风格检查设置,Settings > Editor > Code Style > PHP > Set from...,快捷键(windows Ctrl + Alt + L)

数据库设计相关

  • 数据一致性要求不严格的场景下不要使用外键、unique等,在代码中进行逻辑控制,这一点在快速迭代的项目中尤其适用
  • 联合索引的第一列如果不能将范围缩至六分之一(具体数字记不得了)以内则会全表扫描
  • 数据库字符集utf8mb4加索引时需注意varchar类型的长度,mysql索引长度最多1000字节,varchar类型默认长度255,utf8mb4的情况下最多占用1020字节超出限制,migration运行会报错
  • collate中unicode_ci和general_ci的注意点,查询时的相等判定(1AÀ
  • 表名和字段名无特殊含义或专有名词的情况下建议使用单数形式,如:user、game
  • 所有资源类的数据表都可能会需要如下字段:
    created_at、created_by、updated_at、updated_by,这些字段在yii2的model中可以通过
    TimestampBehavior、BlameableBehavior进行自动控制。
    status字段表示软删除,引用SoftDeleteTrait即可

  • 表示与其他表id字段进行关联的字段建议命名为:表名_id,如:user_id、category_id,代码中对id的命名也建议采用如:\$user_id,$userId 之类的方式避免产生混淆

  • 需要与其他表进行关联的字段添加索引时,两表中的对应字段类型应保持一致

composer相关

  • 使用国内镜像进行加速,http://pkg.phpcomposer.com/
  • composer根目录路径不要有中文(windows环境上),否则会出现一些问题。修改composer默认根目录可以通过设置COMPOSER_HOME实现
  • composer.json中常见配置字段含义和作用讲解,composer.lock文件的作用讲解(minimum-stability、require版本通配符、require-dev、autoload、scripts、extra)

yii2框架相关

  • 何时采用basic模板何时采用advanced模板,在session分离并且数据互通的情况下应采用多应用端的advanced模板结构,若session互通则使用basic模板分模块进行开发
  • Model中rules、behaviors、scenarios作用和相互之间的联系
  • Model中的relations使用
  • Components的编写和使用(https://github.com/takashiki/yii2-ide-helper
  • Controller中responseFormat的使用
  • ActiveQuery中使用->limit(1)->one()来提升性能

设计模式相关

  • 工厂模式,在有完善的依赖注入框架的情况下使用场景较少
  • 单列模式,维护配置文件、数据字典等仍会经常用到
  • 策略模式(框架的缓存实现)
  • 适配器模式(不同游戏的进入游戏加币等)

学习相关

最快的提升方式就是去看别人的优质代码:

https://github.com/trending
https://github.com/ziadoz/awesome-php
http://www.phptherightway.com/
https://github.com/domnikl/DesignPatternsPHP
http://www.digpage.com/
https://github.com/samdark/yii2-cookbook
https://github.com/forecho/awesome-yii2
http://www.yiichina.com/
https://getyii.com/
http://laravelacademy.org/
https://laravel-china.org/
http://www.laruence.com/

PHP基础的提升则要多看官方手册:
http://php.net/

建议多看英文文档,英文文档在即时性、准确性和详细程度上一般都有优势,PHP官方文档也是如此,比如:
http://php.net/manual/en/function.serialize.php
http://php.net/manual/zh/function.serialize.php

使用phpbrew管理php版本

参考文档:http://rmingwang.com/php-version-management-phpenv.html

安装

curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
chmod +x phpbrew
sudo mv phpbrew /usr/bin/phpbrew

初始化

phpbrew init

sudo vim ~/.bashrc
#文件最后,插入下面这行代码
source ~/.phpbrew/bashrc

安装php版本

phpbrew known

phpbrew install 7.0.11 +default +fpm +pdo +mysql +sqlite +gd

初步用下来感觉不是特别好用,建议使用docker。