php 获取文件哈希值(Hash)

HASH是根据文件的内容的数据通过逻辑运算得到的数值, 不同的文件(即使是相同的文件名)得到的HASH值是不同的, 所以HASH值就成了每一个文件在EMULE里的身份证. 不同HASH值的文件在EMULE里被认为是不同的文件,相同的HASH值的文件的内容肯定是完全相同(即使文件名不同). HASH值还有文件校验的功能,相当于文件的校验码. 所以还可以用来检查文件下载是否正确(所以EMULE下载完毕时,都会在HASH文件一遍, 检查文件是否出错)。

文件的Hash值在下载文件的校验方面有很大的用途,Hash值是文件内容的通过二进制码进行一系列的变换生成出来的,即使文件名发生变化,Hash的值也不会发生改变。因此在开发的过程中一般比较两个文件是否相同都是去比较两个文件的Hash值。

先上代码,后面解释。


运行结果:

d67d1c2dce86470f8fd81c7154d4999f

hash_file
hash_file — 使用给定文件的内容生成哈希值 。环境要求PHP 5 >= 5.1.2, PHP 7, PECL hash >= 1.1

说明
string hash_file ( string$algo , string$filename [, bool$raw_output = false ] )

参数
algo 要使用的哈希算法的名称,例如:”md5″,”sha256″,”haval160,4″ 等。

filename 要进行哈希运算的文件路径。支持 fopen 封装器。

raw_output设置为 TRUE,输出格式为原始的二进制数据。 设置为 FALSE,输出小写的 16 进制字符串。

返回值
如果 raw_output 设置为 TRUE, 则返回原始二进制数据表示的信息摘要, 否则返回 16 进制小写字符串格式表示的信息摘要。

拓展
md5_file() – 计算指定文件的 MD5 散列值

sha1_file() – 计算文件的 sha1 散列值

地址:http://demo.i5code.com/index.php?a=shows&catid=4&id=44

声明:本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。

Yii2 向 ajax 返回 json 数组

use yii\web\Response;

配置文件设置默认返回类型

首先在返回之前代码中添加返回头信息

Yii::$app->response->format=Response::FORMAT_JSON;
返回的时候直接return数组就行了

return [‘code’=>false,’message’=>$msg];

/**
 * 中文提醒公告接口,返回三天数据
 * @return json
 */
public  function actionIndex()
{
    Yii::$app->response->format=Response::FORMAT_JSON;
    $data=Blog::find()
        ->select(['title','url'])
        ->where(['status' =>'1'])
        ->limit(3)
        ->orderBy('create_time DESC')
        ->asarray()
        ->all();
    $message=count($data)?"Success":"No data";
    return ['code'=>200,'data'=>$data,'message'=>$message];
}

js中

$.ajax({
type: “POST”,
data:$(‘#form’).serialize(),
async: false,
dataType:’json’,
error: function(request) {
alert(data.message);
},
success: function(data) {
layer.msg(data.message,{icon:data.code?6:5,time:1000},function(){
alert(data.message);
});
}
});

ajax json form 表单

http://www.yiichina.com/doc/guide/2.0/runtime-responses

ShadowsocksR一键安装脚本

本脚本适用环境:
系统支持:CentOS,Debian,Ubuntu
内存要求:≥128M
日期:2017 年 07 月 27 日

关于本脚本:
一键安装 ShadowsocksR 服务端。
请下载与之配套的客户端程序来连接。
(以下客户端只有 Windows 客户端和 Python 版客户端可以使用 SSR 新特性,其他原版客户端只能以兼容的方式连接 SSR 服务器)

默认配置:
服务器端口:自己设定(如不设定,默认为 8989)
密码:自己设定(如不设定,默认为 teddysun.com)
加密方式:自己设定(如不设定,默认为 aes-256-cfb)
协议(Protocol):自己设定(如不设定,默认为 origin)
混淆(obfs):自己设定(如不设定,默认为 plain)

客户端下载:
Windows / OS X
Linux
Android / iOS
OpenWRT

使用方法:
使用root用户登录,运行以下命令:

wget –no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR.sh
chmod +x shadowsocksR.sh
./shadowsocksR.sh 2>&1 | tee shadowsocksR.log
安装完成后,脚本提示如下:

Congratulations, ShadowsocksR server install completed!
Your Server IP :your_server_ip
Your Server Port :your_server_port
Your Password :your_password
Your Protocol :your_protocol
Your obfs :your_obfs
Your Encryption Method:your_encryption_method

Welcome to visit:https://shadowsocks.be/9.html
Enjoy it!
卸载方法:
使用 root 用户登录,运行以下命令:

./shadowsocksR.sh uninstall
安装完成后即已后台启动 ShadowsocksR ,运行:

/etc/init.d/shadowsocks status
可以查看 ShadowsocksR 进程是否已经启动。
本脚本安装完成后,已将 ShadowsocksR 自动加入开机自启动。

使用命令:
启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
状态:/etc/init.d/shadowsocks status

配置文件路径:/etc/shadowsocks.json
日志文件路径:/var/log/shadowsocks.log
代码安装目录:/usr/local/shadowsocks

多用户配置示例:

{
“server”:”0.0.0.0″,
“server_ipv6”: “[::]”,
“local_address”:”127.0.0.1″,
“local_port”:1080,
“port_password”:{
“8989”:”password1″,
“8990”:”password2″,
“8991”:”password3″
},
“timeout”:300,
“method”:”aes-256-cfb”,
“protocol”: “origin”,
“protocol_param”: “”,
“obfs”: “plain”,
“obfs_param”: “”,
“redirect”: “”,
“dns_ipv6”: false,
“fast_open”: false,
“workers”: 1
}
如果你想修改配置文件,请参考:
https://github.com/breakwa11/shadowsocks-rss/wiki/Server-Setup
https://github.com/breakwa11/shadowsocks-rss/blob/master/ssr.md
https://github.com/breakwa11/shadowsocks-rss/wiki/config.json

更新日志:
2017 年 07 月 27 日:
1、新增:可选协议(protocol)auth_chain_b 。使用该协议需更新到最新版(4.7.0)ShadowsocksR 版客户端;
2、修改:更新 ShadowsocksR 源码下载地址。

2017 年 07 月 22 日:
1、新增:安装时可选 13 种加密方式的其中之一(none 是不加密)。如下所示:

none
aes-256-cfb
aes-192-cfb
aes-128-cfb
aes-256-cfb8
aes-192-cfb8
aes-128-cfb8
aes-256-ctr
aes-192-ctr
aes-128-ctr
chacha20-ietf
chacha20
rc4-md5
rc4-md5-6
2、新增:安装时可选 7 种协议(protocol)的其中之一。如下所示:

origin
verify_deflate
auth_sha1_v4
auth_sha1_v4_compatible
auth_aes128_md5
auth_aes128_sha1
auth_chain_a
auth_chain_b
3、新增:安装时可选 9 种混淆(obfs)的其中之一。如下所示:

plain
http_simple
http_simple_compatible
http_post
http_post_compatible
tls1.2_ticket_auth
tls1.2_ticket_auth_compatible
tls1.2_ticket_fastauth
tls1.2_ticket_fastauth_compatible
2016 年 08 月 13 日:
1、新增多用户配置示例。注意:如果你新增了端口,也要将该端口从防火墙(iptables 或 firewalld)中打开。

2016 年 05 月 12 日:
1、新增在 CentOS 下的防火墙规则设置。
windows工具
https://github.com/shadowsocksr-backup/shadowsocksr-csharp

开启Redis 允许外网IP 访问

在 Linux 中安装了redis 服务,当在客户端通过远程连接的方式连接时,报could not connect错误。
错误的原因很简单,就是没有连接上redis服务,由于redis采用的安全策略,默认会只准许本地访问。
需要通过简单配置,完成允许外网访问。
修改redis的配置文件,将所有bind信息全部屏蔽。
# bind 192.168.1.100 10.0.0.1
# bind 192.168.1.8
# bind 127.0.0.1
修改完成后,需要重新启动redis服务。
redis-server redis.conf
如果iptables 没有开启6379端口,用这个方法开启端口
命令:/sbin/iptables -I INPUT -p tcp –dport 6379 -j ACCEPT
保存防火墙修改命令:/etc/rc.d/init.d/iptables save
通过iptables 允许指定的外网ip访问
//只允许127.0.0.1访问6379
iptables -A INPUT -s 127.0.0.1 -p tcp –dport 6379 -j ACCEPT
//其他ip访问全部拒绝
iptables -A INPUT -p TCP –dport 6379 -j REJECT
未配置拒绝前

配置拒绝后

QueryList 简单、 灵活、强大的PHP采集工具,让采集更简单一点。 phpquery

How to use?

试试更优雅的采集方式吧!

QueryList的出现让PHP做采集从未如此简单。得益于phpQuery,让使用QueryList几乎没有任何学习成本,只要会CSS3选择器就可以轻松使用QueryList了,和jQuery选择器用法完全通用,它让PHP做采集像jQuery选择元素一样简单。

初探

看看PHP用QueryList做采集到底有多简洁吧!

array(‘jQuery选择器’,’要采集的属性’),
‘image’ => array(‘img’,’src’)
))->data;
//打印结果
print_r($data);

//采集某页面所有的超链接
//可以先手动获取要采集的页面源码
$html = file_get_contents(‘http://cms.querylist.cc/google/list_1.html’);
//然后可以把页面源码或者HTML片段传给QueryList
$data = QueryList::Query($html,array(
‘link’ => array(‘a’,’href’)
))->data;
//打印结果
print_r($data);

/**
* 在线测试采集并查看采集结果:http://querylist.cc/page-Querytest.html
*/
进阶

上面的采集结果有很多“杂质”,一定不会满足你的要求,来获取我们真正想要的结果。

array(‘.post_content img’,’src’)
))->data;
//打印结果
print_r($data);

//采集该页面文章列表中所有[文章]的超链接
$data = QueryList::Query(‘http://cms.querylist.cc/google/list_1.html’,array(
‘link’ => array(‘h2>a’,’href’,”,function($content){
//利用回调函数补全相对链接
$baseUrl = ‘http://cms.querylist.cc’;
return $baseUrl.$content;
})),’.cate_list li’)->data;
//打印结果
print_r($data);
全貌

正如你看到的那样,QueryList只有一个主要的方法Query,学会了使用Query方法也就意味着你已经熟练了QueryList!

array(‘h1′,’text’),
//采集文章发布日期,这里用到了QueryList的过滤功能,过滤掉span标签和a标签
‘date’ => array(‘.pt_info’,’text’,’-span -a’,function($content){
//用回调函数进一步过滤出日期
$arr = explode(‘ ‘,$content);
return $arr[0];
}),
//采集文章正文内容,利用过滤功能去掉文章中的超链接,但保留超链接的文字,并去掉版权、JS代码等无用信息
‘content’ => array(‘.post_content’,’html’,’a -.content_copyright -script’,function($content){
//利用回调函数下载文章中的图片并替换图片路径为本地路径
//使用本例请确保当前目录下有image文件夹,并有写入权限
//由于QueryList是基于phpQuery的,所以可以随时随地使用phpQuery,当然在这里也可以使用正则或者其它方式达到同样的目的
$doc = phpQuery::newDocumentHTML($content);
$imgs = pq($doc)->find(‘img’);
foreach ($imgs as $img) {
$src = ‘http://cms.querylist.cc’.pq($img)->attr(‘src’);
$localSrc = ‘image/’.md5($src).’.jpg’;
$stream = file_get_contents($src);
file_put_contents($localSrc,$stream);
pq($img)->attr(‘src’,$localSrc);
}
return $doc->htmlOuter();
})
);
$rang = ‘.content’;
$ql = QueryList::Query($page,$reg,$rang);
$data = $ql->getData();
//打印结果
print_r($data);
扩展

QueryList的功能很单一,就是Query,但扩展让QueryList变得无限可能!

‘http://cms.querylist.cc/news/list_2.html’,
‘referrer’=>’http://cms.querylist.cc’,
‘method’ => ‘GET’,
‘params’ => [‘var1’ => ‘testvalue’, ‘var2’ => ‘somevalue’],
‘user_agent’=>’Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0’,
‘cookiePath’ => ‘./cookie.txt’,
‘timeout’ =>’30’
])->setQuery([‘link’ => [‘h2>a’,’href’,”,function($content){
//利用回调函数补全相对链接
$baseUrl = ‘http://cms.querylist.cc’;
return $baseUrl.$content;
}]],’.cate_list li’)->getData(function($item){
return $item[‘link’];
});

//多线程扩展
QueryList::run(‘Multi’,[
‘list’ => $urls,
‘curl’ => [
‘opt’ => array(
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_AUTOREFERER => true,
),
//设置线程数
‘maxThread’ => 100,
//设置最大尝试数
‘maxTry’ => 3
],
‘success’ => function($a){
//采集规则
$reg = array(
//采集文章标题
‘title’ => array(‘h1′,’text’),
//采集文章发布日期,这里用到了QueryList的过滤功能,过滤掉span标签和a标签
‘date’ => array(‘.pt_info’,’text’,’-span -a’,function($content){
//用回调函数进一步过滤出日期
$arr = explode(‘ ‘,$content);
return $arr[0];
}),
//采集文章正文内容,利用过滤功能去掉文章中的超链接,但保留超链接的文字,并去掉版权、JS代码等无用信息
‘content’ => array(‘.post_content’,’html’,’a -.content_copyright -script’,function($content){
//利用回调函数下载文章中的图片并替换图片路径为本地路径
//使用本例请确保当前目录下有image文件夹,并有写入权限
//由于QueryList是基于phpQuery的,所以可以随时随地使用phpQuery,当然在这里也可以使用正则或者其它方式达到同样的目的
$doc = phpQuery::newDocumentHTML($content);
$imgs = pq($doc)->find(‘img’);
foreach ($imgs as $img) {
$src = pq($img)->attr(‘src’);
$localSrc = ‘image/’.md5($src).’.jpg’;
$stream = file_get_contents($src);
file_put_contents($localSrc,$stream);
pq($img)->attr(‘src’,$localSrc);
}
return $doc->htmlOuter();
})
);
$rang = ‘.content’;
$ql = QueryList::Query($a[‘content’],$reg,$rang);
$data = $ql->getData();
//打印结果,实际操作中这里应该做入数据库操作
print_r($data);
}
]);

https://querylist.cc/

tar jxvf是什么指令

tar jxvf 是解压指今
解压以bzip2压缩的文件

-j 解压命令(*.bz)
-x  释放
-v 释放时的信息
-f  指定解压文件

看看下面这些
           tar -cvf a.tar a                  创建文件a的tar包

           tar -tvf a.tar                     查看tar包包含的文件

           tar -xvf a.tar                     释放tar包文件

           tar -rvf a.tar b                   追加文件b到tar包a.tar

           tar -Avf a.tar c.tar            追加c.tar包到a.tar包 

           tar -zcvf a.tar.gz a            创建文件a的gzip压缩的tar包 

           tar -ztvf a.tar.gz               查看文件a的tar压缩包内容               

           tar -zxvf aa.tar.gz             释放aa.tar.gz包的内容

           tar -jcvf aa.tar.bz2 aa        创建文件a的bzip压缩的tar包 

           tar -jtvf aa.tar.bz2             查看文件a的tar压缩包内容

           tar -jxvf aa.tar.bz2             释放aa.tar.bz2包的内

lnmp1.3-full安装包安装lnmp环境,如何安装PHP扩展

1. 如果已经安装LNMP套件,请按以下步骤处理

a. 跳转到fileinfo源代码目录` cd /root/downloads/lnmp1.2-full/src/php-7.0.7/ext/fileinfo/`  (里面全是压缩包,可以先解压你想要安装的扩展所对应的php版本)
b. 执行 `/usr/local/php/bin/phpize`
c. 执行 `./configure –with-php-config=/usr/local/php/bin/php-config`
d. 执行 `make && make install`
e. 修改php.ini文件 `vi /usr/local/php/etc/php.ini` 在末尾增加`extension = fileinfo.so`即可
f. 重启php-fpm ,`/etc/init.d/php-fpm reload`(service php-fpm restart)

————————————————————————————————————————————–

近期在开发新项目时,需要使用到上传文件功能。我使用的上传附件管理是第三方的库laravel-stapler,使用也是挺方便的。但是因为线上服务器使用的是lnmp安装套件,在正式使用时会出现fileinfo插件不可用的问题,这是因为lnmp套件下安装php 5.6.9时默认不开放fileinfo支持。这里可以用以下两种方法解决:

1. 如果尚未安装lnmp套件,请按以下步骤处理。

a. 打开`cd /root/downloads/lnmp1.2-full/include/php.sh`文件,路径请参考自己安装的路径。
b. 找到函数`Install_PHP_56()`,然后修改编译选项`–disable-fileinfo`,将这里修改为`–enable-fileinfo`
c. 执行安装过程

2. 如果已经安装LNMP套件,请按以下步骤处理

a. 跳转到fileinfo源代码目录` cd /root/downloads/lnmp1.2-full/src/php-5.6.9/ext/fileinfo/`
b. 执行 `/usr/local/php/bin/phpize`
c. 执行 `./configure –with-php-config=/usr/local/php/bin/php-config`
d. 执行 `make && make install`
e. 修改php.ini文件 `vi /usr/local/php/etc/php.ini` 在末尾增加`extension = fileinfo.so`即可
f. 重启php-fpm ,`/etc/init.d/php-fpm reload`

采用以上两个步骤均可解决fileinfo扩展不存在的问题,也可以自行手动编译安装。

作者:letonode
链接:http://www.jianshu.com/p/17e3abcce44a
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

微信支付宝支付接口

开发了多次支付宝与微信支付后,很自然产生一种反感,惰性又来了,想在网上找相关的轮子,可是一直没有找到一款自己觉得逞心如意的,要么使用起来太难理解,要么文件结构太杂乱,只有自己撸起袖子干了。

欢迎 Star,欢迎 PR!

特点

  • 命名不那么乱七八糟
  • 隐藏开发者不需要关注的细节
  • 根据支付宝、微信最新 API 开发而成
  • 高度抽象的类,免去各种拼json与xml的痛苦
  • 符合 PSR 标准,你可以各种方便的与你的框架集成
  • 文件结构清晰易理解,可以随心所欲添加本项目中没有的支付网关
  • 方法使用更优雅,不必再去研究那些奇怪的的方法名或者类名是做啥用的

运行环境

  • PHP 7.0+
  • composer

支持的支付网关

由于各支付网关参差不齐,所以我们抽象了两个方法 driver()gateway()

两个方法的作用如下:

driver() : 确定支付平台,如 alipay,wechat;

gateway(): 确定支付网关。通过此方法,确定支付平台下的支付网关。例如,支付宝下有 「电脑网站支付」,「手机网站支付」,「APP 支付」三种支付网关,通过传入 web,wap,app 确定。

详细思路可以查看源代码。

1、支付宝

  • 电脑支付
  • 手机网站支付
  • APP 支付

SDK 中对应的 driver 和 gateway 如下表所示:

driver gateway 描述
alipay web 电脑支付
alipay wap 手机网站支付
alipay app APP 支付

2、微信

  • 公众号支付
  • 小程序支付
  • H5 支付
  • 扫码支付
  • 刷卡支付

SDK 中对应的 driver 和 gateway 如下表所示:

driver gateway 描述
wechat mp 公众号支付
wechat miniapp 小程序支付
wechat wap H5 支付
wechat scan 扫码支付
wechat pos 刷卡支付

支持的方法

所有网关均支持以下方法

  • pay (支付接口)
  • refund (退款接口)
  • close (关闭订单接口)
  • verify (验证服务器返回消息是否合法)

安装

composer required yansongda/pay

使用说明

0、一个完整的例子:

use Yansongda\Pay\Pay;

$config = [
    'alipay' => [
        'app_id' => '2016082000295641',
        'notify_url' => 'http://yansongda.cn/alipay_notify.php',
        'return_url' => 'http://yansongda.cn/return.php',
        'ali_public_key' => 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWJKrQ6SWvS6niI+4vEVZiYfjkCfLQfoFI2nCp9ZLDS42QtiL4Ccyx8scgc3nhVwmVRte8f57TFvGhvJD0upT4O5O/lRxmTjechXAorirVdAODpOu0mFfQV9y/T9o9hHnU+VmO5spoVb3umqpq6D/Pt8p25Yk852/w01VTIczrXC4QlrbOEe3sr1E9auoC7rgYjjCO6lZUIDjX/oBmNXZxhRDrYx4Yf5X7y8FRBFvygIE2FgxV4Yw+SL3QAa2m5MLcbusJpxOml9YVQfP8iSurx41PvvXUMo49JG3BDVernaCYXQCoUJv9fJwbnfZd7J5YByC+5KM4sblJTq7bXZWQIDAQAB',
        'private_key' => 'MIIEpAIBAAKCAQEAs6+F2leOgOrvj9jTeDhb5q46GewOjqLBlGSs/bVL4Z3fMr3p+Q1Tux/6uogeVi/eHd84xvQdfpZ87A1SfoWnEGH5z15yorccxSOwWUI+q8gz51IWqjgZxhWKe31BxNZ+prnQpyeMBtE25fXp5nQZ/pftgePyUUvUZRcAUisswntobDQKbwx28VCXw5XB2A+lvYEvxmMv/QexYjwKK4M54j435TuC3UctZbnuynSPpOmCu45ZhEYXd4YMsGMdZE5/077ZU1aU7wx/gk07PiHImEOCDkzqsFo0Buc/knGcdOiUDvm2hn2y1XvwjyFOThsqCsQYi4JmwZdRa8kvOf57nwIDAQABAoIBAQCw5QCqln4VTrTvcW+msB1ReX57nJgsNfDLbV2dG8mLYQemBa9833DqDK6iynTLNq69y88ylose33o2TVtEccGp8Dqluv6yUAED14G6LexS43KtrXPgugAtsXE253ZDGUNwUggnN1i0MW2RcMqHdQ9ORDWvJUCeZj/AEafgPN8AyiLrZeL07jJz/uaRfAuNqkImCVIarKUX3HBCjl9TpuoMjcMhz/MsOmQ0agtCatO1eoH1sqv5Odvxb1i59c8Hvq/mGEXyRuoiDo05SE6IyXYXr84/Nf2xvVNHNQA6kTckj8shSi+HGM4mO1Y4Pbb7XcnxNkT0Inn6oJMSiy56P+CpAoGBAO1O+5FE1ZuVGuLb48cY+0lHCD+nhSBd66B5FrxgPYCkFOQWR7pWyfNDBlmO3SSooQ8TQXA25blrkDxzOAEGX57EPiipXr/hy5e+WNoukpy09rsO1TMsvC+v0FXLvZ+TIAkqfnYBgaT56ku7yZ8aFGMwdCPL7WJYAwUIcZX8wZ3dAoGBAMHWplAqhe4bfkGOEEpfs6VvEQxCqYMYVyR65K0rI1LiDZn6Ij8fdVtwMjGKFSZZTspmsqnbbuCE/VTyDzF4NpAxdm3cBtZACv1Lpu2Om+aTzhK2PI6WTDVTKAJBYegXaahBCqVbSxieR62IWtmOMjggTtAKWZ1P5LQcRwdkaB2rAoGAWnAPT318Kp7YcDx8whOzMGnxqtCc24jvk2iSUZgb2Dqv+3zCOTF6JUsV0Guxu5bISoZ8GdfSFKf5gBAo97sGFeuUBMsHYPkcLehM1FmLZk1Q+ljcx3P1A/ds3kWXLolTXCrlpvNMBSN5NwOKAyhdPK/qkvnUrfX8sJ5XK2H4J8ECgYAGIZ0HIiE0Y+g9eJnpUFelXvsCEUW9YNK4065SD/BBGedmPHRC3OLgbo8X5A9BNEf6vP7fwpIiRfKhcjqqzOuk6fueA/yvYD04v+Da2MzzoS8+hkcqF3T3pta4I4tORRdRfCUzD80zTSZlRc/h286Y2eTETd+By1onnFFe2X01mwKBgQDaxo4PBcLL2OyVT5DoXiIdTCJ8KNZL9+kV1aiBuOWxnRgkDjPngslzNa1bK+klGgJNYDbQqohKNn1HeFX3mYNfCUpuSnD2Yag53Dd/1DLO+NxzwvTu4D6DCUnMMMBVaF42ig31Bs0jI3JQZVqeeFzSET8fkoFopJf3G6UXlrIEAQ==',
    ],
];

$config_biz = [
    'out_trade_no' => '1',
    'total_amount' => '1',
    'subject' => 'test subject',
];

$pay = new Pay($config);
return $pay->dirver('alipay')->gateway('web')->pay($config_biz);

1、准备配置参数

$config = [
    'alipay' => [
        'app_id' => '',             // 支付宝提供的 APP_ID
        'ali_public_key' => '',     // 支付宝公钥,1行填写
        'private_key' => '',        // 自己的私钥,1行填写
    ],
];
$config_biz = [
    'out_trade_no' => '12',                 // 订单号
    'total_amount' => '13',                 // 订单金额,单位:元
    'subject' => 'test subject',   // 订单商品标题
];

2、在代码中使用

$pay = new Pay($config);
return $pay->dirver('alipay')->gateway('web')->pay($config_biz);

返回值

pay (支付接口)

返回 跳转到支付宝进行支付的 Html 代码。在正式项目中,直接 return 即可。

refund (退款接口)

true/false

close (关闭订单接口)

true/false

错误详情

使用非跳转接口(如, refund 接口,close 接口)时,如果有错误产生,会抛出 GatewayException 错误。

各个支付网关配置说明

由于支付网关不同,每家参数参差不齐,为了方便,我们抽象定义了两个参数:$config,$config_biz,分别为全局参数,业务参数。但是,所有配置参数均为官方标准参数,无任何差别。

「业务参数」为订单相关的参数,「全局参数」为除订单相关参数以外的全局性参数。

具体参数列表请查看每个支付网关的使用说明。

1、支付宝 – 电脑网站支付

最小配置参数

$config = [
    'alipay' => [
        'app_id' => '',             // 支付宝提供的 APP_ID
        'ali_public_key' => '',     // 支付宝公钥,1行填写
        'private_key' => '',        // 自己的私钥,1行填写
    ],
];
$config_biz = [
    'out_trade_no' => '12',                 // 订单号
    'total_amount' => '13',                 // 订单金额,单位:元
    'subject' => 'test subject',   // 订单商品标题
];

所有配置参数

所有参数均为官方标准参数,无任何差别。点击这里 查看官方文档。

$config = [
    'alipay' => [
        'app_id' => '',             // 支付宝提供的 APP_ID
        'ali_public_key' => '',     // 支付宝公钥,1行填写
        'private_key' => '',        // 自己的私钥,1行填写
        'return_url' => '',         // 同步通知 url,*强烈建议加上本参数*
        'notify_url' => '',         // 异步通知 url,*强烈建议加上本参数*
    ],
];
$config_biz = [
    'out_trade_no' => '',
    'total_amount' => '',                 
    'subject' => '',

    // 订单描述
    'body' => '',

    // 订单包含的商品列表信息,Json格式: {"show_url":"https://或http://打头的商品的展示地址"} ,在支付时,可点击商品名称跳转到该地址      
    'goods_detail' => '',

    // 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。该参数在请求到支付宝时开始计时。
    'timeout_express' => '',                
    
    // 禁用渠道,用户不可用指定渠道支付当有多个渠道时用“,”分隔注:与enable_pay_channels互斥
    'disable_pay_channels' => '',

    // 可用渠道,用户只能在指定渠道范围内支付当有多个渠道时用“,”分隔注:与disable_pay_channels互斥
    'enable_pay_channels' => '',

    // 公用回传参数,如果请求时传递了该参数,则返回给商户时会回传该参数。支付宝只会在异步通知时将该参数原样返回。本参数必须进行UrlEncode之后才可以发送给支付宝
    'passback_params' => '',

    // 业务扩展参数,详见 [业务扩展参数说明](https://docs.open.alipay.com/#kzcs)
    'extend_params' => '',

    // 商品主类型:0—虚拟类商品,1—实物类商品(默认)注:虚拟类商品不支持使用花呗渠道
    'goods_type' => '',

    // 获取用户授权信息,可实现如免登功能。获取方法请查阅:用户信息授权
    'auth_token' => '',

    /**
     *  PC扫码支付的方式,支持前置模式和跳转模式。
     *
     *  前置模式是将二维码前置到商户的订单确认页的模式。需要商户在自己的页面中以iframe方式请求支付宝页面。具体分为以下几种:
     *  0:订单码-简约前置模式,对应iframe宽度不能小于600px,高度不能小于300px;
     *  1:订单码-前置模式,对应iframe宽度不能小于300px,高度不能小于600px;
     *  3:订单码-迷你前置模式,对应iframe宽度不能小于75px,高度不能小于75px;
     *  4:订单码-可定义宽度的嵌入式二维码,商户可根据需要设定二维码的大小。
     *
     *  跳转模式下,用户的扫码界面是由支付宝生成的,不在商户的域名下。
     *  2:订单码-跳转模式
     */
    'qr_pay_mode' => '',

    // 商户自定义二维码宽度 注:qr_pay_mode=4时该参数生效
    'qrcode_width' => ''
];

2、支付宝 – 手机网站支付

最小配置参数

$config = [
    'alipay' => [
        'app_id' => '',             // 支付宝提供的 APP_ID
        'ali_public_key' => '',     // 支付宝公钥,1行填写
        'private_key' => '',        // 自己的私钥,1行填写
    ],
];
$config_biz = [
    'out_trade_no' => '12',                 // 订单号
    'total_amount' => '13',                 // 订单金额,单位:元
    'subject' => 'test subject',   // 订单商品标题
];

所有配置参数

该网关大部分参数和 「电脑支付」 相同,具体请参考 官方文档

3、支付宝 – APP 支付

最小配置参数

$config = [
    'alipay' => [
        'app_id' => '',             // 支付宝提供的 APP_ID
        'notify_url' => '',         // 支付宝异步通知地址
        'ali_public_key' => '',     // 支付宝公钥,1行填写
        'private_key' => '',        // 自己的私钥,1行填写
    ],
];
$config_biz = [
    'out_trade_no' => '12',                 // 订单号
    'total_amount' => '13',                 // 订单金额,单位:元
    'subject' => 'test subject',   // 订单商品标题
];

所有配置参数

该网关大部分参数和 「电脑支付」 相同,具体请参考 官方文档

4、微信 – 公众号支付

最小配置参数

TODO

所有配置参数

所有参数均为官方标准参数,无任何差别。点击这里 查看官方文档。

5、微信 – 小程序支付

由于「小程序支付」和「公众号支付」都使用的是 JSAPI,所以,该网关大部分参数和 「公众号支付」 相同。

6、微信 – H5 支付

TODO

7、微信 – 扫码支付

TODO

8、微信 – 刷卡支付

TODO

代码贡献

由于测试及使用环境的限制,本项目中只开发了「支付宝」和「微信支付」的相关支付网关。

如果您有其它支付网关的需求,或者发现本项目中需要改进的代码,欢迎 Fork 并提交 PR!

LICENSE

 

转自 https://git.oschina.net/yansongda/pay

分享4个网址二维码API接口

说明:把url=后面的网址改成你的,四种任选一。
http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://goonls.com
http://b.bshare.cn/barCode?site=weixin&url=http://goonls.com
http://s.jiathis.com/qrcode.php?url=http://goonls.com
http://www.kuaizhan.com/common/encode-png?large=true&data=http://goonls.com
说明:下面是EMLOG程序专用的,把代码复制到EMLOG模板echo_log.php你需要的位置即可。
http://b.bshare.cn/barCode?site=weixin&url=<?php echo Url::log($logid);?>
http://s.jiathis.com/qrcode.php?url=<?php echo Url::log($logid);?>

xampp 配置多个虚拟站点

在xampp环境中,为了更方便的管理我们的多个项目,就需要我们通过配置相关文件来设置多个虚拟站点,下面我们就一起来看看这些虚拟站点是怎么配置出来的吧!

工具/原料

  • xampp虚拟环境
  • hosts文件
  • httpd-vhosts.conf 文件
  • httpd.conf 文件

方法/步骤

  1. 1

    首先安装xampp环境(这里就不详细介绍了,非常简单),在浏览器地址栏中输入:localhost 能正常访问,如下图所示:

  2. 2

    在电脑中找到hosts文件,路径为:C:/WINDOWS/system32/drivers/etc/hosts  将hosts文件中对应 127.0.0.1 加入你要设置的域名,如下图:

  3. 3

    找到xampp的安装目录,并按照路径:xampp\apache\conf\httpd.conf 找到httpd.conf 文件,并在文件中找到 Include conf/extra/httpd-vhosts.conf 确认前面没有加# 如下图:

  4. 4

    按照路径:xampp\apache\conf\extra\httpd-vhosts.conf 找到httpd-vhosts.conf 文件并在此文件末尾添加内容:

    <VirtualHost *:80>DocumentRoot “C:/xampp/htdocs/thinkphp”ServerName www.tp.com</VirtualHost>

    如下图所示:

  5. 5

    通过以上设置,在浏览器地址栏中输入:www.tp.com 就能看到配置的虚拟目录成功了,如下图:

    END

注意事项

  • hosts文件为系统文件,有时候修改后可能不能保存,需要参考对应系统下修改hosts文件教程
  • 配置多个站点可以掠过httpd.conf 文件只需要配置hosts和httpd-vhosts.conf 两个文件