Discuz如何存储远程附件到OSS

前言

网站远程附件功能是指将用户上传的附件直接存储到远端的存储服务器,一般是通过FTP的方式存储到远程的FTP服务器。

目前Discuz论坛、phpwind论坛、Wordpress个人网站等都支持远程附件功能。

本文介绍如何基于Discuz论坛存储远程附件。

准备工作

申请OSS账号,并且创建一个public-read的bucket。这里需要权限为public-read是因为后面需要匿名访问。

详细步骤

测试所用Discuz版本为Discuz! X3.1,下面是作者的详细设置流程.

  • 登录Discuz站点,进入管理界面后,先点击全局,再点击上传设置,如下图所示。
  • 选择远程附件,然后开始设置。
  1. 需要选择启用远程附件。
  2. 启用SSL链接为
  3. FTP服务器地址, 即运行ossftp工具的地址,一般填127.0.0.1即可。
  4. FTP服务的端口号,默认为2048
  5. FTP登录用户名,格式为AccessKeyID/BukcetName, 注意这里的’/‘不是’‘的意思。
  6. FTP的登录密码,为AceessKeySecrete
  7. 被动模式连接,选择默认的即可。

8.远程附件目录,填 . 表示在Bucket的根目录下创建上传目录。

9.远程访问URL, 填 http://BucketName.Endpoint 即可。

这里测试所用bucket为test-hz-jh-002, 属于杭州区域的,所以这里填写的是http://test-hz-jh-002.oss-cn-hangzhou.aliyuncs.com
注意BucketName要和Endpoint匹配。

10.超时时间,设置为0即可,表示服务默认。

11.设置好后,可以点击测试远程附件,如果成功则会出现如下画面。

  • 发帖验证

好了,现在我们去论坛发帖试试。随意找个板块,发贴时上传图片附件如下所示。

在图片上右键点击,选择在“新建标签页中打开图片”,如下所示。

ossfs让阿里云oss对象存储挂在到服务器

下载

http://store.eyearth.com/?dl=d5cd1b8b8722c08a732c91e686f16b19

https://github.com/aliyun/ossfs.git

https://github.com/aliyun/ossfs?spm=5176.doc32196.2.5.PCoKOq#简介

简介

ossfs 能让您在Linux/Mac OS X 系统中把Aliyun OSS bucket 挂载到本地文件 系统中,您能够便捷的通过本地文件系统操作OSS 上的对象,实现数据的共享。

功能

ossfs 基于s3fs 构建,具有s3fs 的全部功能。主要功能包括:

  • 支持POSIX 文件系统的大部分功能,包括文件读写,目录,链接操作,权限, uid/gid,以及扩展属性(extended attributes)
  • 通过OSS 的multipart 功能上传大文件。
  • MD5 校验保证数据完整性。

安装

预编译的安装包

我们为常见的linux发行版制作了安装包:

  • Ubuntu-14.04
  • CentOS-7.0/6.5/5.11

请从版本发布页面选择对应的安装包下载安装,建议选择最新版本。

  • 对于Ubuntu,安装命令为:
sudo apt-get update
sudo apt-get install gdebi-core
sudo gdebi your_ossfs_package
  • 对于CentOS6.5及以上,安装命令为:
sudo yum localinstall your_ossfs_package
  • 对于CentOS5,安装命令为:
sudo yum localinstall your_ossfs_package --nogpgcheck

源码安装

如果没有找到对应的安装包,您也可以自行编译安装。编译前请先安装下列依赖库:

Ubuntu 14.04:

sudo apt-get install automake autotools-dev g++ git libcurl4-gnutls-dev \
                     libfuse-dev libssl-dev libxml2-dev make pkg-config

CentOS 7.0:

sudo yum install automake gcc-c++ git libcurl-devel libxml2-devel \
                 fuse-devel make openssl-devel

然后您可以在github上下载源码并编译安装:

git clone https://github.com/aliyun/ossfs.git
cd ossfs
./autogen.sh
./configure
make
sudo make install

运行

设置bucket name, access key/id信息,将其存放在/etc/passwd-ossfs 文件中, 注意这个文件的权限必须正确设置,建议设为640。

echo my-bucket:my-access-key-id:my-access-key-secret > /etc/passwd-ossfs
chmod 640 /etc/passwd-ossfs

将oss bucket mount到指定目录

ossfs my-bucket my-mount-point -ourl=my-oss-endpoint

示例

my-bucket这个bucket挂载到/tmp/ossfs目录下,AccessKeyId是faint, AccessKeySecret是123,oss endpoint是http://oss-cn-hangzhou.aliyuncs.com

echo my-bucket:faint:123 > /etc/passwd-ossfs
chmod 640 /etc/passwd-ossfs
mkdir /tmp/ossfs
ossfs my-bucket /tmp/ossfs -ourl=http://oss-cn-hangzhou.aliyuncs.com

卸载bucket:

umount /tmp/ossfs # root user
fusermount -u /tmp/ossfs # non-root user

常用设置

  • 使用ossfs --version来查看当前版本,使用ossfs -h来查看可用的参数
  • 如果使用ossfs的机器是阿里云ECS,可以使用内网域名来避免流量收费提高速度
      ossfs my-bucket /tmp/ossfs -ourl=http://oss-cn-hangzhou-internal.aliyuncs.com
    
  • 在linux系统中,updatedb会定期地扫描文件系统,如果不想 ossfs的挂载目录被扫描,可参考FAQ设置跳过挂载目录
  • 如果你没有使用eCryptFs等需要XATTR的文件系统,可 以通过添加-o noxattr参数来提升性能
  • ossfs允许用户指定多组bucket/access_key_id/access_key_secret信息。当 有多组信息,写入passwd-ossfs的信息格式为:
      bucket1:access_key_id1:access_key_secret1
      bucket2:access_key_id2:access_key_secret2
    
  • 生产环境中推荐使用supervisor来启动并监控ossfs进程,使 用方法见FAQ

高级设置

  • 可以添加-f -d参数来让ossfs运行在前台并输出debug日志
  • 可以使用-o kernel_cache参数让ossfs能够利用文件系统的page cache,如 果你有多台机器挂载到同一个bucket,并且要求强一致性,请不要使用此 选项

遇到错误

遇到错误不要慌:) 按如下步骤进行排查:

  1. 如果有打印错误信息,尝试阅读并理解它
  2. 查看/var/log/syslog或者/var/log/messages中有无相关信息
     grep 's3fs' /var/log/syslog
     grep 'ossfs' /var/log/syslog
    
  3. 重新挂载ossfs,打开debug log:
     ossfs ... -o dbglevel=debug -f -d > /tmp/fs.log 2>&1
    

    然后重复你出错的操作,出错后将/tmp/fs.log保留,自己查看或者发给我

局限性

ossfs提供的功能和性能和本地文件系统相比,具有一些局限性。具体包括:

  • 随机或者追加写文件会导致整个文件的重写。
  • 元数据操作,例如list directory,性能较差,因为需要远程访问oss服务器。
  • 文件/文件夹的rename操作不是原子的。
  • 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。
  • 不支持hard link。
  • 不适合用在高并发读/写的场景,这样会让系统的load升高

参与开发

  1. 开发流程参考:https://github.com/rockuw/oss-sdk-status#development-oss-members-only
  2. 提交代码后,确保travis CI是PASS的
  3. 每发布一个新的版本:
  • 运行scripts/build-pkg.py生成相应的安装包
  • Release页面发布一个版本
  • 将生成的安装包上传到相应的Release下面

常见问题

FAQ

相关链接

  • ossfs wiki
  • s3fs – 通过fuse接口,mount s3 bucket到本地文件系统。

联系我们

License

Copyright (C) 2010 Randy Rizun rrizun@gmail.com

Copyright (C) 2015 Haoran Yang yangzhuodog1982@gmail.com

Licensed under the GNU GPL version 2

ThinkPHP集成支付宝

 

本文来自

http://www.itinfor.cn/

ThinkPHP集成支付宝demo_采用自定义类形式

 

 

针对近期小伙伴询问ThinkPHP集成支付宝的人数较多,特此编写一篇较详细且易理解的教程

对应dmeo源码本人已搁到github上了,欢迎大家下载使用。

先上一张支付页面欣赏欣赏,(*^__^*)(*^__^*)

对应的github下载地址为:https://github.com/paopao7/ThinkPHP_Alipay_Demo

为保证页面效果,请采用虚拟主机的形式进行访问。

以下所有图片可点击放大后进行查看

相关版本说明:

ThinkPHP版本为3.2.3完整版

支付宝demo为截止到该文章发表前官方最新版

应官方版本要求,特将本地PHP版本修改为5以上

官方要求:

因本人使用的mac下的php开发的集成换成Mamp,所以截图为Mamp下的php版本

Mamp版本号:

Mamp下php版本号:

若您使用的为其他开发环境,也请务必将php的版本修改为5及以上

1、首先需下载ThinkPHP,具体要去哪里下载,就不需要我多说明了吧。我选择的版本是3.2.3完整版

下载链接在此:http://www.thinkphp.cn/down/610.html

2、下载支付宝demo

此处我们以电脑网站支付为例,其他demo也类似,此处就不再赘述了

下载链接在此:https://docs.open.alipay.com/270/106291/

3、将下载下来的ThinkPHP完整版搁到我们的网站根目录下

我的网站根目录是wwwroot,我将此次的项目命名为AlipayClass,该名称的意思是以自定义类的形式去执行支付宝支付,当然你想命名为什么名称都可以。

4、将下载来的支付宝demo搁到ThinkPHP的三方框架下,关于ThinkPHP的三方类库说明见此地址:

http://document.thinkphp.cn/manual_3_2.html#lib_extend

搁进去的具体操作如下图所示:

5、此处先补充下电脑网站支付的配置及流程,若你已了解,可直接跳转至下一节。

1)、首先我们可以通过执行支付宝官方demo来了解其支付的流程

2)、我们还是跟之前将官方demo搁到我们网站的根目录下:

3)、在进行本地调试之前,安装官方的说法,请先阅读下该demo目录下的readme.txt,此处就不展开了

4)、阅读完成后,先别急着在本地运行,先对需要的数据进行配置

需要配置的数据如下图所示:

针对以上信息的获取,请参考本人的另一篇文章,文章地址:

支付宝电脑网站支付 appid等参数的获取

5)、请注意以上参数中的?notify_url、return_url,需为外网地址,不然支付宝无法调用到,也就无法进行跳转及验签了。

6)、以上信息配置完成后,我们就可以愉快的在本地跑起来了

7)、接下来是对整个支付过程的讲解,若您已了解,请跳过。

  • 首先我们打开项目所在的index.php文件,会发现付款功能是将填写的相关参数提交到?pagepay下面的pagepay.php文件,如下图红色框中的内容所示。

  • 以下为提交页面的参数和后端接受的参数对应说明

  • 以下就针对上述文件进行分析,首先该文件引入了我们在一开始填写appid等参数的配置文件,然后将前台页面填写的订单号、支付金额等参数获取到。再将这些参数通过对应的set方法写入$payRequestBuilder,以供AlipayTradeService文件下的pagePay方法使用。

  • 下图为AlipayTradeService文件的pagePay方法所在页面。然后该方法又去调用了aopclientRequestExecute方法,也就是第94行的方法。我们会发现在调用aopclientRequestExecute方法的时候,第二个参数为true,因此它会调用$aop下的pageExecute方法,也就是第109行代码。

  • 继续往下走。若下图所示,我们已经找到了pageExecute方法所在的定义。该方法先判断文件编码,然后获取到需要加密的一些参数,然后调用该文件下的generateSign方法进行加密,也就是第385行代码。

  • 继续往下走,最终代码来到第119行,该方法为调用我们之前配置好的公钥和私钥,然后使用openssl_sign方法进行加密,将加密后的参数(sign)进行返回。
  • 请注意openssl_sign方式为php自带方法,需进去到php.ini文件下进行配置,具体配置过程此处就不再赘述了。可参考该文章:
    http://www.jb51.net/article/50173.htm

  • 好的,我们了解了支付宝是如何进行加密操作了,那就继续往下走。

  • 因为传入的$httpmethod的值是POST,因此代码会走到397行,也就是上图中红色框的部分。顺着往下走,就找到了该方法的定义,根据上方注释,很容易就了解到该方法是将支付需要的参数循环填入form表单中,然后将整个表单进行返回。为了获取其中上传的参数,我特定将返回的数据进行了写文件操作。

  • 该文件会生成在项目目录下的pagepay目录下

  • 生成的内容如下图所示:

  • 实际提交的参数,就是支付宝电脑网站支付api下的aplipy.trade.page.pay方法所需要提交的参数。具体链接为:https://docs.open.alipay.com/common/105901
  • 至此整个demo的支付流程已讲解完毕。

8)到了激动人心的时刻了,若相关配置正确无误,则会出现以下界面。

是不是感到非常的熟悉和亲切呢。若未出现,请根据错误提示自行进行百度。

9)针对有小伙伴反馈在出现该页面之前会出现一个错误界面,然后一闪而过,如下图所示:

出现这个问题的原因是因为本地环境缺少时区导致的。具体解决方法请参考该链接:http://jingyan.baidu.com/article/2a138328a95186074b134f4f.html

6、官方demo的说明至此结束了,接下来是对官方demo进行封装。此处已将支付宝demo搁到三方框架下。因为下载的代码中未包含控制器等文件夹,所以需先进行在浏览器下执行下。在进行接下来操作的时候,请先将demo文件夹下的config.php文件配置完成,否则无法进行支付。如下图所示:

7、执行完成后,会发现对应的Application已经有了控制器等文件夹。

8、接下来是搭建支付页面以及支付记录页面,这两项操作就不在此进行赘述了。页面搭建的时候,记得预留下支付金融的input,该参数需要传递到服务器端进行处理。

9、服务器端在接收到用户输入的支付金额的时候,会先对用户输入的值进判断。验证无误后,会执行生成订单号以及写入订单表等操作,具体见下图:其中具体的操作的请点击下图方大进行查看或去到文章的顶部将源码下载下来进行研究。

10、以上操作均无误的情况下,将会出现我们所熟悉的界面,此处就不在赘述了。

11、若在支付的过程中,遇到和Tp框架的C方法冲突的时候,可直接将支付宝demo的C方法修改为任何方法名即可。

12、支付过程到此结束,接下来是支付宝回调以及验签的说明。在进行验签操作之前,请先填写好支付宝demo文件夹下config。php文件中的notify_url地址且要是外网能够访问的。

13、接下来是对验签功能的讲解。支付宝在你支付成功后,会异步访问你在配置文件里面填写的地址,也就是下图中的方法。

你可以通过$_POST获取所有的返回数据,也可以通过$_POST[‘参数名’]获取某个特定的数据。

在获取到支付宝全部的数据之后,第一步要做的就是对支付宝返回的数据进行验签,也就是下图中第66行处的代码。

验签完成后,就是你自己的业务逻辑什么的,例如修改订单状态以及修改对应用户余额什么的,具体要做哪些操作了,就看个人需要了。

此处需要注意的是,成功或失败返回的结果为 echo “success”;或echo “fail”; 该行代码切记不要别做任何修改。

14、好了Tp框架集成支付宝电脑网站支付并以自定义类的形式的功能说明到此结束。


如果还有什么不明白的地方,欢迎加我QQ进行咨询,请注明技术咨询

本人QQ:980569038

TP集成支付宝群:594955172

也可以扫码本人微信:

腾讯云主机端口开放的方法

进入腾讯云后台 新建安全组


选择放通所有端口模板


新建此安全组规则

给实例添加安全组规则

点击确定绑定安全组规则即可正常访问面板

如果觉得放行所有端口不安全 那么可以参考以下教程 来自定义放行端口

点新增一行即可自定义规则 把规则弄成与图中相同 新建安全组并添加到实例中即可正常访问,如果更换了ftp端口 数据端口 面板端口 phpmyadmin端口 记得也要在安全组放行相应端口