分类: 资源

  • 在线卡通头像生成器Avataaars的开源代码

    在线卡通头像生成器Avataaars的开源代码

    Avataaars generator是一个网页版的免费在线卡通头像生成器,可以自定义参数,生成自己独特风格的头像。这些头像可以是PNG或SVG格式的图片,也可以是一段React代码。

    Avataaars就是Avatar,表示头像、阿凡达的意思。

    这个网页版卡通头像生成器的开发者是一位1991年出生的帅气小伙,叫林芳本,他是在Sketch库Avataaars的基础上开发的。林芳本曾经也是一位创业者,现在是旧金山湾区公司Niantic的一名软件工程师。Niantic就是那个与任天堂共同发布了AR游戏精灵宝可梦 Go(Pokemon Go)的公司。

    最初完成这些头像设计的,是一位叫做Pablo Stanley的哥们,他有着多年设计经验的设计师,现任产品设计平台InVision的设计主管。Pablo Stanley还制作了一个免费的Sketch库,安装后可以在Sketch中方便的创建卡通头像。

    资源下载地址:https://github.com/fangpenlin/avataaars-generator

    资源演示地址:https://avatarmaker.com/

  • wordpress在线浏览PDF等文档插件

    wordpress在线浏览PDF等文档插件

    在线PDF浏览

    在我百度google好久终于明白原来类似百度文库豆丁网它们是先将PDF等文档转换成SWF文件,然后通过播放器来播放SWF文件来达到在线浏览的效果,而另外有通过jQuery插件的直接在实现。

    在开源中国有介绍这8个jQuery的PDF浏览插件,其中有一种是PDF.js的是一个技术原型主要用于在HTML5平台上展示PDF文档,无需任何本地技术支持。今天介绍的wordpress在线PDF插件有一款就是通过这个PDF.js实现的。

    PDF.JS在线演示:http://mozilla.github.io/pdf.js/web/viewer.html

    PDF.JS开源地址:https://github.com/mozilla/pdf.js

    而其他有没有实现在线PDF文档浏览的具体可行方法呢?其实是有很多的,不过不好实现,如果你需要的话以下是一些参考。希望对你有帮助。

    有没有开源的,可以直接浏览 pdf 的网站程序?

    pdf2swf+flexpaper解决pdf在线阅读(类百度文库)

    Office Web App2013 在线查看PDF文件

    wordpress在线PDF插件

    对于用wordpress的站点来说似乎有更简单的方法,那就是自己不动手用别人的插件,这也许是大多数人都能实现的方法了,今天介绍的wordpress在线PDF插件分别是PDF.js Viewer Shortcode和Prizm Viewer插件。

    PDFjsViewer

    这插件就像艾尔云上面说的是通过PDF.js来实现的,对于不支持HTML5的浏览器来说似乎是没戏,不过HTML5迟早是趋势。用起来界面美观大方。

    PDF.jsViewerShortcode主页:https://wordpress.org/plugins/pdfjs-viewer-shortcode/

    使用方法其实很简单,后台安装启用之后,在写文章的时候插入短代码来实现的,如果你了解wordpress的话可以直接集成到wordpress后台编辑器中使用起来直接点击按钮加入链接即可。

    短代码:[pdfjs-viewer url=http://www.aaa.com/test.pdf viewer_width=600px viewer_height=700px fullscreen=true download=true print=true openfile=false]

    url (必填项):直接链接直接PDF文件

    viewer_width(可选):宽度(默认值:100%)

    viewer_height(可选):高度(默认值:1360px)

    fullscreen(可选):true/false,上面显示全屏浏览器链接(默认:真)

    download(可选):true/false,启用或禁用下载按钮(默认:真)

    print (可选):true/false,启用或禁用打印按钮(默认:真)

    openfile(可选):true/false,可启用或禁用打开文件按钮,(缺省值:false)

    如果你懂点HTML的话里面的选项都不太难理解,自己设置即可。

    PrizmViewer

    Prizm Viewer插件是一款强大的文档阅读器,Prizm实际上是一个云服务提供商,提供文档,图像的存储(有点像Google Docs)。而Prizm Viewer插件就是该提供商开发的一款插件,允许WordPress博主在网站中加入文档在线预览功能,支持DOC,XLS,PPT,PDF,CAD等近300种格式。

    插件主页:https://wordpress.org/plugins/prizm-cloud-document-viewer/

    听起来不错可就是用起来麻烦点儿,需要注册并且选用Prizm的免费套餐,然后经过一系列的设置来实现网站在先PDF阅读的目的,好吧说了这么多,到底怎么用呢?表急!艾尔云给出参考地址。

    Prizm Viewer插件——为你的WordPress加入文档阅读器(支持DOC,XLS,PPT,PDF,CAD等多种格式)

    本文小结

    经过上面一番折腾算是可以在线PDF浏览了,一些网站程序除了用现成的插件之外。目前实现在线PDF浏览而且防止复制的主要有两种方法,一种就是通过工具将上传的PDF等文档转换成SWf文件然后再播放类似豆丁网百度文库,另外一种就是office web app这是微软出品,网易邮箱在线PDF浏览似乎是这个。

  • ThinkphpB2C逍遥商城系统(支持PC+H5)

    ThinkphpB2C逍遥商城系统(支持PC+H5)

    这是一个B2C的商城系统,功能完整,没有任何缺失,安装就可以直接使用,希望在大家的共同努力下,让这个系统覆盖到到小程序端。
    更新到了1.1.1版本,支持微信,支付宝支付及实时退款。
    B2C商城源码


    功能如下:
    1、 支持PC+H5版本(H5版本可以对接公众号进行二次开发)
    2、 支持虚拟商品自动发货
    3、 支持自定义多种规格参数商品管理
    4、 支持拼团活动,自定义商品团购活动,线上营销活动更丰富。
    5、 支持限时折扣,自定义折扣比例,多种营销活动助力线上运营
    6、 支持优惠券,自定义优惠券可使用商品范围。
    7、 支持会员积分,积分可以抵扣购物金额。
    8、 支持品牌管理,查找商品时按品牌分类检索
    9、 支持APP套壳,免费打包自己的专属APP,做到全平台覆盖
    10、 支持webview形式的小程序,现在小程序支持webview形式了,可以直接做成小程序。
    11、 支持支付宝,微信支付,网银支付,余额支付等多种支付方式(仅需简单配置)
    12、 支持订单管理,可直接查看各种状态的订单(待付款,待发货,已发货,交易完成,交易关闭)
    13、 支持退款/退货管理,退货管理清晰明了,不用再海量订单中查找订单。
    14、 支持打印发货单和快递单,方便订单到物流的管理。
    15、 资金列表,可以查看所有资金动帐明细。
    16、 支持不同等级会员,不同等级会员享受不同购物折扣比。
    17、 支持自定义广告管理
    18、 支持线上数据库备份
    技术参数
    1、 支持伪静态
    2、 支持对php7的支持
    3、 支持百万级数据库压力测试
    4、 经过多重安全漏洞检测
    5、 Win或linux都可以安装

    注:在手机端打开就自动是H5版本

    资源下载地址:http://www.qiye1000.com/talk/?thread-101.htm

    资源演示地址:http://test.szkandk.cn/xyshop/

  • 如何将WordPress网站转换为APP移动应用程序

    如何将WordPress网站转换为APP移动应用程序

    wordpress怎么生成app

    虽然现在大部分的wordpress主题都是完美自适应,无论在平板上还是手机上浏览都没有任何的影响。但是就目前访客的习惯或者体验上来讲,一个完整的APP显然更具吸引力。而对于wordpress博主/站长来讲,APP的一些推送功能,无疑会增加网站的流量或者说提示访客的粘性,这些都是非常重要的。所以学会如何将wordpress网站转换成APP是很有必要的。

    接下来,我们将分享几个可以将你的网站快速生成APP的wordpress插件。

    1. AppPresser

    AppPresser是创建与WordPress集成的iOS和Android移动应用程序的最佳方式之一。您可以使用现有页面组合应用程序,并创建新的移动友好菜单。

    此外,AppPresser还具有以WordPress定制器为模型的可视化编辑器。这意味着如果您已经习惯了内容管理系统(CMS),那么这些操作将变得非常简单。此外,您还可以使用实时预览功能查看应用的外观,该功能可实时显示每个变化。

    主要特征:

    允许您为您的网站设置iOS和Android应用程序。

    与WordPress网站完美集成。

    使您可以使用自定义程序样式编辑器来创建应用程序。

    价格: 起价为每月19美元

    2. Super Progressive Web Apps

    Super Progressive Web Apps(PWA)是一款免费将wordpress网站生成APP的插件。实用PWA这款插件前,要确保您的网站是完全自响应。否则,访客将无法获得最佳体验。当有人从移动设备访问时,Super Progressive Web Apps插件会 向您的网站添加“添加到主屏幕” 通知。如果他们点击它,该插件将在他们的主屏幕上设置一个APP应用程序的按钮,访客可以该按钮直接访问您的网站。此外,该插件还将设置一个简单的LOGO图标。

    主要特征:

    为您的网站创建PWA。

    为您的网站应用程序设置自定义图标和启动画面。

    用户可以快速将您网站的PWA添加到主屏幕。

    价格: 免费

    3. WPMobile.app

    WPMobile.app可以用最简单的方式创建网站APP应用程序,虽然该插件在自定义应用程序方面并不是最好的,但它确实有很多其他实用的功能,例如,您可以在发布之前测试您的移动应用程序,确保没有任何问题之后再发布。

    该插件还自带完美的的搜索和社交分享功能。而且还提供了用户的一些数据统计分析,如果您想认真考虑改善用户体验,这是非常宝贵的。

    主要特征:

    允许您在发布前测试您的网站应用程序。

    发布新内容时提供自动更新。

    提供向您的应用添加搜索功能和社交分享的功能。

    允许访问有关您的应用用户的分析。

    价格: 单个Android应用程序的终身许可证起价为56美元

    4. AppyPie

    AppyPie与上面谈到的网站生成APP插件有很大的不同。它既不是用于WordPress插件或第三方应用程序。相反,它是一个功能齐全的应用程序构建器。有了它,您可以创建一个网站应用程序,甚至可以根据需要处理更复杂的项目。

    此服务包括Android和iOS应用程序构建器,以及将现有网站转换为应用程序的工具。对于您创建的任何应用,您可以设置订阅,推送通知,联系表单,社交媒体链接和共享按钮等。添加所有这些功能很简单,因为AppyPie具有拖放式应用程序构建器,包括实时预览功能。

    最后,AppyPie为常见的项目类型包含了很多应用程序“模板”。例如,如果您想创建餐厅,房地产甚至播客应用程序,这是一个很好的选择。

    主要特征:

    使您能够从头开始构建自定义Android和iOS应用程序,或使用您的站点作为模板。

    允许您使用拖放构建器添加功能。

    允许您从几种类型的应用程序模板中进行选择,以加快“开发”过程。

    价格: 有一个功能有限的免费计划,高级选项起价为每个应用每月209美元

  • owllook – 在线小说搜索引擎

    owllook – 在线小说搜索引擎

    owllook-在线网络小说阅读网站&小说搜索引擎&小说推荐系统[搜索、追书、收藏、追更、小说API]

    owllook是一个基于其他搜索引擎构建的垂直小说搜索引擎,owllook目的是让阅读更简单、优雅,让每位读者都有舒适的阅读体验,如搜书、阅读、收藏、追更、推荐等功能.

    本站仅收集与分享该项目,不负责技术安装或任何咨询服务!

    目前实现功能如下:

    • 多搜索源
    • 丰富的解析源
    • 界面统一解析
    • 完善的阅读体验
    • 搜索记录
    • 缓存
    • 书架
    • 书签
    • 登录
    • 初步兼容手机
    • 注册(开放注册)
    • 上次阅读记录
    • 最新章节
    • 书友推荐(简单地基于相似度进行推荐)
    • 目录获取
    • 翻页
    • 搜索排行
    • 章节异步加载 感谢@[mscststs](https://github.com/mscststs)
    • 排行榜 – 起点+owllook
    • 自带爬虫框架,统一爬虫规范,对爬虫感兴趣的可以看看 – [ruia](https://github.com/howie6879/ruia)

    注意:若将本项目部署并发行,请声明来源,本项目纯属共享学习之用,不得用于商业!

    Overview

    owllook使用了mongodb储存了用户使用过程中的产生的基本信息,诸如注册信息、搜索小说信息、收藏小说数据等,对于某些必要的缓存,则利用redis进行缓存处理,如小说缓存、session缓存,注意,对于限制数据:都将在24小时删除

    对于不同网站的小说,页面规则都不尽相同,我希望能够在代码解析后再统一展示出来,这样方便且美观,而不是仅仅跳转到对应网站就完事,清新简洁的阅读体验才是最重要的

    目前采用的是直接在搜索引擎上进行结果检索,我尽量写少量的规则来完成解析,具体见规则定义,遇到自己喜欢的小说网站,你也可以自己添加解析,owllook目前解析了超过 200+ 网站,追更网站解析了50+

    有一些地方需要用到爬虫,比如说排行榜,一些书籍信息等,我不想动用重量级爬虫框架来写,于是我在owllook里面编写了一个很轻量的爬虫框架来做这件事,见 ruia

    BTW,sanic写界面确实不是很方便,至于为什么写这个,一是想利用sanic尽量做成异步服务,二是想就此练习下推荐系统,顺便作为毕业设计

    Installation

    请先装好mongo以及redis,不会安装mongo看这里,owllook使用pipenv管理虚拟环境,所以使用前请确保安装一个Python3.6环境(比如我这里环境路径在/Users/howie/anaconda3/envs/python36/bin/python3.6),然后安装好pipenv

    mongo以及redis装好后,进入项目目录,依照步骤执行:

    # 下载代码
    git clone https://...
    cd owllook
    pip install pipenv
    # 请先提前创建好Python3.6环境
    pipenv install --python /Users/howie/anaconda3/envs/python36/bin/python3.6 --skip-lock
    # 进入虚拟环境
    pipenv shell
    
    # 先配置好相关数据库配置,具体看`config/dev_config.py`
    
    # 方案一
    # 运行:
    cd owllook
    pipenv run gunicorn -c owllook/config/gunicorn.py --worker-class sanic.worker.GunicornWorker owllook.server:app
    
    # 方案二 推荐 
    # 安装docker并打包镜像
    docker build -t howie6879/owllook .
    # 实际运行
    docker-compose up -d
    # 退出
    docker-compose down
    
    [ 详细安装说明请见下一页 ]

    Screenshots

    首页:

    搜索:

    榜单:

    书架:

    目录解析页:

    阅读:

    FAQ

    为什么首页榜单为空白?

    这个是根据小说搜索次数显示的,每天刷新一次,使用多了就会有

    为什么会出现302跳转?

    为了防止直接运行服务被恶意域名绑定,所以作出如下修改:

    vim config/config.py
    # 将 true 改为 false
    VAL_HOST = os.getenv('VAL_HOST', 'true')
    VAL_HOST = os.getenv('VAL_HOST', 'false')

    小说榜单页面为什么没有内容?

    需要运行owllook/spiders/spider_console.py, 目前代码中是设定60分钟运行一次,运行的时候请酌情更改, os.environ['MODE'] = 'PRO' 这段代码也请注释掉

    Reference

    owllook使用了以下第三方包:

    • sanic:基于Python 3.5+的异步web服务器
    • motor:异步的mongodb驱动
    • Jinja2:基于python的模板引擎
    • aiohttp:异步请求
    • caddy:基于go的web服务器

    web框架:

    • bootstrap:时尚、直观且功能强大的前端框架,可实现更快、更轻松的 Web 开发。
    • mdui:MDUI是一个基于Material Design的接口框架

    License

    owllook is offered under the Apache 2 license.

    [ 安装请见下一页 ]

    页: 1 2

  • Magento模板安装详细过程

    Magento模板安装详细过程

    第一种方法是通过magento connect (magento连接器)功能来安装magento主题模板。详细步骤如下:

    1.首先你要到magento官网找到一个免费的magento主题(收费的要交钱后才提供给你extension key),找到后那你会看到在主题图片下方有个Get Extension Key按钮,点击Get Extension Key 并勾选“By checking this box I agree to the extension license agreement.”复选框就会得到一个extension key,复制key如图:

    magento themes

    2. 通过magento后台->系统(system)->(magento连接)magento connect->(magento连接管理)magento connect manager打开并用管理用户登录,然后把你刚复制的extinction key 拷贝到Paste extension key to install 后面的输入框中,点击install按钮,如图:

    3. 如果你的extinction key 没过期的话,稍等片刻你会看到“Theme successfully installed”信息展示在下面的信息框中,这表明你已经安装成功了。接着你必须到后台->系统(system)->(配置)Configuration->(设计)Design->(主题)Themes,在default一栏填写你安装成功的主题名称,这里填 modern。如图:

    4.如果你不清楚你的magento主题名称,你可以到你网站的目录\app\design\frontend\default下查看你主题文件夹的名称。填写好刷新缓存,前台即可显示为你安装的magento主题。

    第二种方法是直接通过文件夹进行安装。详细步骤如下:

    注意区分“主题包”和“主题文件”这两个概念。我们所使用的主题在“主题文件”中,“主题包”中可以含有多个主题文件

    1. 首先我们来看下magento主题文件的存放规则

    主题文件路径一般为

    app/design/frontend/主题包名字/主题文件名字/layout+locael+template

    skin/frontend/主题包名字/主题文件名字/css+images+js

    2.当我们新安装好一个magento的时候,magento使用default主题包中的default主题文件路径如下

    app/design/frontend/default/default

    skin/frontend/default/default

    红色部分为主题包的名字“default”

    蓝色部分为主题文件夹的名字“default”

    因为default主题是magento的默认设置,所以在后台的设置中留空就是设置为default

    3.我们来看后台system—>configration—->general—>design

    若要使用的主题文件路径如下,后台的设置便如下图所示

    app/design/frontend/default/blank

    skin/frontend/default/blank

    4.当你购买到一个新的magento主题的时候,假设它的主题包的名字是blank,他的文件路径可能是如下的样子,那你应该这样设置,如图:

    app/design/frontend/blank/theme037

    skin/frontend/blank/theme037

    后台的设置的时候,主题文件包的名字是“blank”,主题文件夹的名字是“theme037”

  • 麦进斗 Magento 设置多站点、多域名、多语言、多货币

    麦进斗 Magento 设置多站点、多域名、多语言、多货币

    1、登录后台system->manage stores
    多站点
    选择create website:

    进入:

    填写完整后,保存,再去该website下新建store和store view
    store新建:

    2、store下面可以新建多个store view(即多语言设置),Code的值是展示view的关键所在
    每个view代表着一种语言,所以建立多个view时,需要去下载安装语言包,magento-community

    3、多个网站,重复上面步骤即可。
    4、多域名设置
    system->confirguration

    5、然后在选择,GENERAL标签下的Web:

    6、取消use default(或者 use website)前面的勾, 在Unsecure和Secure的base url中输入你已经拥有的域名
    点击保存。
    7、多域名设置的最后一步,修改项目根木的 .htaccess文件:

    打开文件在最后加入:

    SetEnvIf Host ^xncp.mez100.de.cn    MAGE_RUN_CODE=de   /* Store or website code 这里的code新建store view时的code输入框的值*/
    SetEnvIf Host ^xncp.mez100.de.cn    MAGE_RUN_TYPE=website  /* Run store or run website */
    

    8、多货币的设置
    view或website设置多货币
    再选择下方的currency Setup:

    依次设置基础货币、默认货币、所允许的货币
    在Allowed Currencies选择多个值后,保存,实现多货币的设置
    在去设置货币汇率。这个如果不设置的话,在前台不会出现货币转换的选项:

    这里可以设置货币的汇率以及货币的符号
    货币汇率:

    货币符号:

    设置好后,保存,在前台就可以看见货币转为的选项了。
    下面还有一种多域名的做法(又称二级目录)
    假设我们的网站现在有个vip的站点(只有允许vip用户访问)
    1、登录后台system->configuration,选择对应的website或store view ,选择左侧的 web 标签:


    注意:{{secure_base_url}}/de有个斜线,设置的时候不要漏掉。
    按上图配置好后,点击保存。
    2、回到项目的根目录中,新建一个de的文件夹(这里的de为你在后台配置web下Base Link URL后面追加的那个de),创建如下:


    将更目录的index.php的内容copy到de文件下的inde.php,文件.htaccess也一样从根目录的.htaccess 拷贝到de文件夹下的.htaccess
    3、修改de文件下的index.php;

    <?php
    /**
     * Magento
     *
     * NOTICE OF LICENSE
     *
     * This source file is subject to the Open Software License (OSL 3.0)
     * that is bundled with this package in the file LICENSE.txt.
     * It is also available through the world-wide-web at this URL:
     * http://opensource.org/licenses/osl-3.0.php
     * If you did not receive a copy of the license and are unable to
     * obtain it through the world-wide-web, please send an email
     * to license@magentocommerce.com so we can send you a copy immediately.
     *
     * DISCLAIMER
     *
     * Do not edit or add to this file if you wish to upgrade Magento to newer
     * versions in the future. If you wish to customize Magento for your
     * needs please refer to http://www.magentocommerce.com for more information.
     *
     * @category   Mage
     * @package    Mage
     * @copyright  Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
     * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
     */
    
    if (version_compare(phpversion(), '5.2.0', '<')===true) {
        echo  '<div style="font:12px/1.35em arial, helvetica, sans-serif;"><div style="margin:0 0 25px 0; border-bottom:1px solid #ccc;"><h3 style="margin:0; font-size:1.7em; font-weight:normal; text-transform:none; text-align:left; color:#2f2f2f;">Whoops, it looks like you have an invalid PHP version.</h3></div><p>Magento supports PHP 5.2.0 or newer. <a href="http://www.magentocommerce.com/install" target="">Find out</a> how to install</a> Magento using PHP-CGI as a work-around.</p></div>';
        exit;
    }
    
    /**
     * Error reporting
     */
    error_reporting(E_ALL | E_STRICT);
    
    /**
     * Compilation includes configuration file
     */
    $compilerConfig = '../includes/config.php';
    if (file_exists($compilerConfig)) {
        include $compilerConfig;
    }
    
    $mageFilename = '../app/Mage.php';
    $maintenanceFile = '../maintenance.flag';
    
    if (!file_exists($mageFilename)) {
        if (is_dir('downloader')) {
            header("Location: downloader");
        } else {
            echo $mageFilename." was not found";
        }
        exit;
    }
    
    if (file_exists($maintenanceFile)) {
        include_once dirname(__FILE__) . '/errors/503.php';
        exit;
    }
    
    require_once $mageFilename;
    
    #Varien_Profiler::enable();
    
    if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) {
        Mage::setIsDeveloperMode(true);
    }
    
    #ini_set('display_errors', 1);
    
    umask(0);
    
    /* Store or website code */
    $mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : '';
    
    /* Run store or run website */
    $mageRunType = isset($_SERVER['MAGE_RUN_TYPE']) ? $_SERVER['MAGE_RUN_TYPE'] : 'store';
    
    /*de为 website or store view code*/
    /*如果该站点为website的话,将store改为wensite即可*/
    Mage::run('de', 'store');
    

    4、然后在浏览器中输入www.xample.com/de就可以访问相应的store view或website了

  • 订阅支付解决方案:Laravel Cashier(Braintree)

    订阅支付解决方案:Laravel Cashier(Braintree)

    简介

    Laravel Cashier Braintree 为通过 Braintree 实现订阅支付服务提供了一个优雅的流式接口。它封装了几乎所有你恐惧编写的样板化的订阅支付代码。除了基本的订阅管理外,Cashier 还支持处理优惠券、订阅升级/替换、订阅「数量」、取消宽限期,甚至生成 PDF 发票。

    注:该文档适用于 Cashier 与 Braintree 的集成,如果你在使用 Stripe,请参考 Stripe 集成文档。

    注:如果你只需要一次性支付,并不提供订阅,就不应该使用 Cashier,而是直接使用 Braintree SDK。

    注意事项

    对于绝大多数操作而言,Cashier 的 Stripe 和 Braintree 实现功能都是一样的,两个服务都提供了通过信用卡进行订阅支付的功能,Braintree 还支持通过 Paypal 进行支付。不过,Braintree 缺少了一些 Stripe 所支持的功能,在决定使用 Stripe 还是 Braintree 之前,需要权衡以下因素:

    • Braintree 支持 Paypal 而 Stripe 不支持;
    • Braintree 不支持在订阅上调用 increment 和 decrement 方法,这是 Braintree 的局限,而不是 Cashier 的;
    • Braintree 不支持基于百分比的折扣,这也是 Braintree 的局限,而不是 Cashier 的。

    安装

    首先,需要通过 Composer 安装适用于 Braintree 的 Cashier 扩展包:1 composer require laravel/cashier-braintree

    配置

    计划信用优惠券

    在使用基于 Braintree 的 Cashier 之前,需要在 Braintree 的控制面板中定义一个 plan-credit 折扣,这个折扣将会用于从年到月或者从月到年支付的优惠额度比例分配。

    配置在 Braintree 控制面板中的这个折扣值可以是你希望的任何值,Cashier 将会在每次使用优惠券的时候通过自定义的值来重写这个默认定义的值。该优惠券之所以是必须的是因为 Braintree 不支持本地根据订阅时长进行优惠额度的按比例分配。

    数据库迁移

    使用 Cashier 之前,需要准备好数据库。我们需要添加额外的字段到 users 表并创建一个新的 subscriptions 表用于存放所有用户订阅:

    Schema::table(‘users’, function ($table) {
    $table->string(‘braintree_id’)->nullable();
    $table->string(‘paypal_email’)->nullable();
    $table->string(‘card_brand’)->nullable();
    $table->string(‘card_last_four’)->nullable();
    $table->timestamp(‘trial_ends_at’)->nullable();
    });

    Schema::create(‘subscriptions’, function ($table) {
    $table->increments(‘id’);
    $table->integer(‘user_id’);
    $table->string(‘name’);
    $table->string(‘braintree_id’);
    $table->string(‘braintree_plan’);
    $table->integer(‘quantity’);
    $table->timestamp(‘trial_ends_at’)->nullable();
    $table->timestamp(‘ends_at’)->nullable();
    $table->timestamps();
    });

    迁移被创建之后,只需要执行 Artisan 命令 migrate 即可。

    Billable 模型

    接下来,添加 Billable Trait 到模型定义:1

    use Laravel\Cashier\Billable;

    2

    ​

    3

    class User extends Authenticatable

    4

    {

    5

        use Billable;

    6

    }

    API 密钥

    接下来,需要在配置文件 services.php 中配置如下选项:1

    'braintree' => [

    2

        'model'  => App\User::class,

    3

        'environment' => env('BRAINTREE_ENV'),

    4

        'merchant_id' => env('BRAINTREE_MERCHANT_ID'),

    5

        'public_key' => env('BRAINTREE_PUBLIC_KEY'),

    6

        'private_key' => env('BRAINTREE_PRIVATE_KEY'),

    7

    ],

    然后你需要在服务提供者 AppServiceProvider 的 boot 方法中添加对 Braintree SDK 的调用:1

    \Braintree_Configuration::environment(config('services.braintree.environment'));

    2

    \Braintree_Configuration::merchantId(config('services.braintree.merchant_id'));

    3

    \Braintree_Configuration::publicKey(config('services.braintree.public_key'));

    4

    \Braintree_Configuration::privateKey(config('services.braintree.private_key'));

    货币配置

    Cashier 默认货币是美元(USD),你可以在某个服务提供者的 boot 方法中通过调用 Cashier::useCurrency 方法来更改默认的货币, useCurrency 方法接收两个字符串参数:货币及货币符号:1

    use Laravel\Cashier\Cashier;

    2

    ​

    3

    Cashier::useCurrency('rmb', '¥');

    订阅

    创建订阅

    要创建一个订阅,首先要获取一个账单模型的实例,通常是 App\User 的实例。获取到该模型实例之后,你可以使用 newSubscription 方法来创建该模型的订阅:1

    $user = User::find(1);

    2

    ​

    3

    $user->newSubscription('main', 'premium')->create($token);

    第一个传递给 newSubscription 方法的参数是该订阅的名字,如果应用只有一个订阅,可以将其称作 main 或 primary,第二个参数用于指定用户订阅的 Braintree 计划,该值对应 Braintree 中相应计划的 id。

    create 方法接收信用卡/源令牌,会自动创建这个订阅,同时更新数据库中 对应订阅的客户 ID 和其它相关的账单信息。

    额外的用户信息

    如果你想要指定额外的客户信息,你可以将其作为第二个参数传递给 create 方法:1

    $user->newSubscription('main', 'monthly')->create($stripeToken, [

    2

        'email' => $email,

    3

    ]);

    要了解更多 Braintree 支持的字段,可以查看相应的Braintree文档。

    优惠券

    如果你想要在创建订阅的时候使用优惠券,可以使用 withCoupon 方法:1

    $user->newSubscription('main', 'monthly')

    2

         ->withCoupon('code')

    3

         ->create($token);

    检查订阅状态

    用户订阅你的应用后,你可以使用各种便利的方法来简单检查订阅状态。首先,如果用户有一个有效的订阅,则 subscribed 方法返回 true,即使订阅现在处于试用期:1

    if ($user->subscribed('main')) {

    2

        //

    3

    }

    subscribed 方法还可以用于路由中间件,基于用户订阅状态允许你对路由和控制器的访问进行过滤:1

    public function handle($request, Closure $next){

    2

        if ($request->user() && ! $request->user()->subscribed('main')) {

    3

            // This user is not a paying customer...

    4

            return redirect('billing');

    5

        }

    6

    ​

    7

        return $next($request);

    8

    }

    如果你想要判断一个用户是否还在试用期,可以使用 onTrial 方法,该方法对于还处于试用期的用户显示警告信息很有用:1

    if ($user->->subscription('main')->onTrial()) {

    2

        //

    3

    }

    subscribedToPlan 方法可用于判断用户是否基于 Stripe/Braintree ID 订阅了给定的计划,在本例中,我们会判断用户的 main 订阅是否订阅了 monthly 计划:1

    if ($user->subscribedToPlan('monthly', 'main')) {

    2

        //

    3

    }

    recurring 方法可用于判定用户当前是否已经订阅并且不在试用期:1

    if ($user->subscription('main')->recurring()) {

    2

        //

    3

    }

    已取消的订阅状态

    要判断用户是否曾经是有效的订阅者,但现在取消了订阅,可以使用 cancelled 方法:1

    if ($user->subscription('main')->cancelled()) {

    2

        //

    3

    }

    你还可以判断用户是否曾经取消过订阅,但现在仍然在「宽限期」直到完全失效。例如,如果一个用户在3月5号取消了一个实际有效期到3月10号的订阅,该用户处于「宽限期」直到3月10号。注意 subscribed 方法在此期间仍然返回 true。1

    if ($user->subscription('main')->onGracePeriod()) {

    2

        //

    3

    }

    要判断用户已经取消订阅并且不在「宽限期」内,可以使用 ended 方法:1

    if ($user->subscription('main')->ended()) {

    2

        //

    3

    }

    修改计划

    用户订阅应用后,偶尔想要改变到新的订阅计划,要将用户切换到新的订阅, 传递计划标识到 swap 方法:1

    $user = App\User::find(1);

    2

    $user->subscription('main')->swap('provider-plan-id');

    如果用户在试用,试用期将会被维护。还有,如果订阅存在多个,数量也可以被维护。

    如果你想要切换计划并取消用户所在的所有试用期,你可以使用 skipTrial 方法:1

    $user->subscription('main')

    2

         ->skipTrial()

    3

         ->swap('provider-plan-id');

    订阅税金

    要指定用户支付订阅的税率,实现账单模型的 taxPercentage 方法,并返回一个在0到100之间的数值,不要超过两位小数:1

    public function taxPercentage() {

    2

        return 20;

    3

    }

    这将使你可以在模型基础上使用税率,对跨越不同国家不同税率的用户很有用。

    注: taxPercentage 方法只能用于订阅支付,如果你使用 Cashier 生成一次性账单,需要手动指定税率。

    取消订阅

    要取消订阅,可以调用用户订阅上的 cancel 方法:1

    $user->subscription('main')->cancel();

    当订阅被取消时,Cashier 将会自动设置数据库中的 ends_at 字段。该字段用于了解 subscribed 方法什么时候开始返回 false。例如,如果客户3月1号份取消订阅,但订阅直到3月5号才会结束,那么 subscribed 方法继续返回 true 直到3月5号。

    你可以使用 onGracePeriod 方法判断用户是否已经取消订阅但仍然在“宽限期”:1

    if ($user->subscription('main')->onGracePeriod()) {

    2

        //

    3

    }

    如果你想要立即取消订阅,调用用户订阅上的方法 cancelNow 即可:1

    $user->subscription('main')->cancelNow();

    恢复订阅

    如果用户已经取消订阅但想要恢复该订阅,可以使用 resume 方法,前提是该用户必须在宽限期内:1

    $user->subscription('main')->resume();

    如果该用户取消了一个订阅然后在订阅失效之前恢复了这个订阅,则不会立即支付该账单,取而代之的,他们的订阅只是被重新激活,并回到正常的支付周期。

    订阅试用期

    带信用卡信息

    如果你想要在提供给用户试用期的同时预先收集支付方式信息,可以在创建订阅的时候使用 trialDays 方法:1

    $user = User::find(1);

    2

    ​

    3

    $user->newSubscription('main', 'monthly')

    4

         ->trialDays(10)

    5

         ->create($token);

    该方法会在数据库订阅记录上设置试用期结束日期,以便告知 Braintree 在此之前不要计算用户的账单信息。

    注:如果用户的订阅没有在试用期结束之前取消,则会在试用期结束时立即支付,所以要确保通知用户试用期结束时间。

    可以使用用户实例或订阅实例上的 onTrial 方法判断用户是否处于试用期,下面两个例子作用是等价的:1

    if ($user->onTrial('main')) {

    2

        //

    3

    }

    4

    ​

    5

    if ($user->subscription('main')->onTrial()) {

    6

        //

    7

    }

    不带信用卡信息

    如果你不想在提供试用期的时候收集用户支付方式信息,只需设置用户记录的 trial_ends_at 字段为期望的试用期结束日期即可,这通常在用户注册期间完成:1

    $user = User::create([

    2

        // Populate other user properties...

    3

        'trial_ends_at' => Carbon::now()->addDays(10),

    4

    ]);

    注:确保已添加 trial_ends_at 日期修改器到模型定义。

    Cashier 将这种类型的试用期看作「一般体验」,因为这种使用并没有附加到任何已经在的订阅,如果当前日期没有超过 trial_ends_at 的值, User 实例上的 onTrial 方法将返回 true:1

    if ($user->onTrial()) {

    2

        // User is within their trial period...

    3

    }

    如果你想要知道用户是否在“一般”试用期并且还没有创建实际的订阅还可以使用 onGenericTrial 方法:1

    if ($user->onGenericTrial()) {

    2

        // User is within their "generic" trial period...

    3

    }

    一旦你准备好为用户创建实际的订阅,可以使用 newSubscription 方法:1

    $user = User::find(1);

    2

    ​

    3

    $user->newSubscription('main', 'monthly')->create($token);

    顾客

    创建顾客

    少数情况下,你可能希望创建一个没有开始订阅的 Braintree 顾客,这可以通过 createAsStripeCustomer 方法来实现:1

    $user->createAsStripeCustomer();

    一旦在 Braintree 中创建这样的顾客后,需要在稍晚时候让他开始订阅。

    信用卡

    更新信用卡

    updateCard 方法可用于更新用户的信用卡信息,该方法接收一个 Braintree 令牌并设置新的信用卡作为支付源:1

    $user->updateCard($token);

    处理 Webhooks

    Braintree 可以通过 webhook 通知应用各种事件,要处理 Braintree webhook,需要定义一个指向 Cashier webhook 控制器的路由,这个控制器将会处理所有输入 webhook 请求并将它们分发到合适的控制器方法:1

    Route::post(

    2

        'braintree/webhook',

    3

        '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook'

    4

    );

    注:注册好控制器后,还要在 Braintree 控制面板中配置 webhook URL。

    默认情况下,这个控制器将会自动对支付失败次数(这个次数可以在 Braintree 设置中定义)过多的订阅进行取消;不过,我们很快会发现,你可以扩展这个控制器来处理任何你想要处理的 webhook 事件。

    Webhooks & CSRF 防护

    由于 webhook 需要绕开 Laravel 的 CSRF 保护,所以需要将其罗列到 VerifyCsrfToken 中间件的排除列表或者将其置于 web 中间件组之外:1

    protected $except = [

    2

        'braintree/*',

    3

    ];

    定义 Webhook 事件处理器

    Cashier 会基于支付失败次数自动取消订阅,但是如果你想要处理额外的 webhook 事件,扩展 Webhook 控制器即可。定义的方法名需要与 Cashier 约定的格式保持一致,特别是方法名需要以 handle 开头并且是想要处理的 webhook 的驼峰格式。例如,如果你想要处理 dispute_opened webhook,则需要添加一个 handleDisputeOpened 方法到控制器:1

    <?php

    2

    ​

    3

    namespace App\Http\Controllers;

    4

    ​

    5

    use Braintree\WebhookNotification;

    6

    use Laravel\Cashier\Http\Controllers\WebhookController as CashierController;

    7

    ​

    8

    class WebhookController extends CashierController

    9

    {

    10

        /**

    11

         * Handle a new dispute.

    12

         *

    13

         * @param  \Braintree\WebhookNotification  $webhook

    14

         * @return \Symfony\Component\HttpFoundation\Responses

    15

         */

    16

        public function handleDisputeOpened(WebhookNotification $webhook)

    17

        {

    18

            // Handle The Webhook...

    19

        }

    20

    }

    失败的订阅

    如果用户的信用卡过期怎么办?不用担心 —— Cashier webhook 控制器可以轻松为你取消该用户的订阅,正如上面所提到的,你所需要做的只是将路由指向该控制器:1

    Route::post(

    2

        'braintree/webhook',

    3

        '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook'

    4

    );

    就是这样,失败的支付将会被控制器捕获和处理,该控制器将会在 Braintree 判断订阅支付失败次数(通常是3次)达到上限时取消该用户的订阅。不要忘了,你需要在 Braintree 控制面板设置中配置 webhook URI。

    一次性支付

    简单支付

    注:必须传递完整的美元金额到 charge 方法。

    如果你想要使用订阅客户的信用卡一次性结清账单,可以使用账单模型实例上的 charge 方法:1

    $user->charge(1);

    charge 方法接收一个数组作为第二个参数,允许你传递任何你想要传递的底层 Braintree 账单创建参数,创建账单时我们可以参考 Braintree 文档提供的可用选项:1

    $user->charge(1, [

    2

        'custom_option' => $value,

    3

    ]);

    如果支付失败 charge 方法将抛出异常,如果支付成功,该方法会返回完整的 Braintree 响应:1

    try {

    2

        $response = $user->charge(1);

    3

    } catch (Exception $e) {

    4

        //

    5

    }

    带发票的支付

    有时候你需要创建一个一次性支付并且同时生成对应发票以便为用户提供一个PDF单据, invoiceFor 方法可以帮助我们实现这个需求。例如,让我们为用户的「一次性费用」生成一张$5.00的发票:1

    $user->invoiceFor('One Time Fee', 5);

    该单据会通过用户信用卡立即支付, invoiceFor 方法还可以接收一个数组作为第三个参数,该数组包含发票项目的计费选项。在调用 invoiceFor 方法时必须包含 description 选项:1

    $user->invoiceFor('One Time Fee', 5, [

    2

        'description' => 'your invoice description here',

    3

    ]);

    发票

    你可以使用 invoices 方法轻松获取账单模型的发票数组:1

    $invoices = $user->invoices();

    2

    ​

    3

    // Include pending invoices in the results...

    4

    $invoices = $user->invoicesIncludingPending();

    当列出客户发票时,你可以使用发票的辅助函数来显示相关的发票信息。例如,你可能想要在表格中列出每张发票,从而方便用户下载它们:1

    <table>

    2

        @foreach ($invoices as $invoice)

    3

        <tr>

    4

            <td>{{ $invoice->date()->toFormattedDateString() }}</td>

    5

            <td>{{ $invoice->total() }}</td>

    6

            <td><a href="/user/invoice/{{ $invoice->id }}">Download</a></td>

    7

        </tr>

    8

        @endforeach

    9

    </table>

    生成 PDF 发票

    在路由或控制器中,使用 downloadInvoice 方法生成发票的 PDF 下载,该方法将会自动生成相应的 HTTP 响应发送下载到浏览器:1

    use Illuminate\Http\Request;

    2

    ​

    3

    Route::get('user/invoice/{invoice}', function (Request $request, $invoiceId) {

    4

        return $request->user()->downloadInvoice($invoiceId, [

    5

            'vendor'  => 'Your Company',

    6

            'product' => 'Your Product',

    7

        ]);

    8

    });

    Braintree

  • linux 如何添加php gd扩展 (阿里云主机linux添加PHP扩展)全网最强教程

    linux 如何添加php gd扩展 (阿里云主机linux添加PHP扩展)全网最强教程

    linux系统篇

    1.CentOS系统

    关于GD扩展

    gd扩展是一个开源的图像处理库,它通过提供一系列用来处理图片的API,使其可以用来创建图表、图形、缩略图以及其他图像的处理操作。gd扩展支持JPG、PNG、GIF等常见的图片格式,所以在安装php-gd扩展之前,我们需要安装libpng、jpegsrc、freetype这三款软件。下面安装步骤中,具体的路径设置大家根据自己的实际情况进行调整。

    一,首先安装以下内容

    安装 freetype

    wget http://ftp.twaren.net/Unix/NonGNU/freetype/freetype-2.5.5.tar.gz
    tar -xf freetype-2.5.5.tar.gz
    cd freetype-2.5.5
    ./configure --prefix=/usr/local/freetype
    make && make install

    安装jpegsrc

    wget http://www.ijg.org/files/jpegsrc.v9.tar.gz
    tar zxvf jpegsrc.v9.tar.gz
    cd jpeg-9
    ./configure --prefix=/usr/local/jpeg
    make && make install

    安装libpng

    wget http://jaist.dl.sourceforge.net/project/libpng/libpng16/1.6.31/libpng-1.6.31.tar.gz
    tar zxvf libpng-1.6.31.tar.gz 
    cd libpng-1.6.31
    ./configure --prefix=/usr/local/libpng
    make && make install

    二,安装GD扩展

    首先最基本的

    第一:先安装库

    yum -y install libjpeglibjpeg-devel libpng libpng-devel freetype freetype-devel

    第二:进入PHP源码目录下的etc/gd目录

    find / -name gd

    cd /usr/local/php-7.1.16/ext/gd

    执行phpize

    find / -name phpize

    /usr/local/php/bin/phpize

    执行configure:

    注:这里的–with-php-config目录根据自己php的安装路径配置

    find / -name php-config

    ./configure –with-png-dir –with-freetype-dir –with-jpeg-dir –with-gd –with-php-config=/usr/local/php/bin/php-config

    注意了:

    configure: error: jpeglib.h not found

    解决方案:

    执行

    rpm -qa | grep libjpeg

    yum -y install libjpeg-devel

    yum list installed | grep libjpeg

    rpm -ql libjpeg-turbo

    再次执行

    ./configure –with-png-dir –with-freetype-dir –with-jpeg-dir –with-gd –with-php-config=/usr/local/php/bin/php-config

    执行:make && make install

    cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/

    ls

    第三步:修改php.ini

    重启服务 php-rpm

    phpinfo() 查看

    以上是Linux添加PHP扩展的一个实例,如果添加其他扩展遇到其他问题无法解决时请加群讨论智者无惑,仁者无忧,勇者无惧资料来源:https://yq.aliyun.com/articles/277841?spm=5176.10695662.1996646101.searchclickresult.28d7650dugGjcZhttps://www.cnblogs.com/guiyishanren/p/11101839.html