Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
jamesyang1999
ShopXO
提交
d460819d
ShopXO
项目概览
jamesyang1999
/
ShopXO
与 Fork 源项目一致
Fork自
纵之格 / ShopXO
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
ShopXO
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d460819d
编写于
3月 15, 2019
作者:
D
devil_gong
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
新增支付宝新版本支付接口
上级
c0b9c68d
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
712 addition
and
291 deletion
+712
-291
extend/payment/Alipay.php
extend/payment/Alipay.php
+225
-291
extend/payment/AlipayAncient.php
extend/payment/AlipayAncient.php
+487
-0
未找到文件。
extend/payment/Alipay.php
浏览文件 @
d460819d
...
...
@@ -11,7 +11,7 @@
namespace
payment
;
/**
* 支付宝支付
* 支付宝支付
- 新版本接口
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
...
...
@@ -50,10 +50,10 @@ class Alipay
// 基础信息
$base
=
[
'name'
=>
'支付宝'
,
// 插件名称
'version'
=>
'0.0.
1
'
,
// 插件版本
'version'
=>
'0.0.
2
'
,
// 插件版本
'apply_version'
=>
'不限'
,
// 适用系统版本描述
'apply_terminal'
=>
[
'pc'
,
'h5'
],
// 适用终端 默认全部 ['pc', 'h5', 'app', 'alipay', 'weixin', 'baidu']
'desc'
=>
'适用PC+H5,即时到帐支付方式,买家的交易资金直接打入卖家支付宝账户,快速回笼交易资金。 <a href="http://www.alipay.com/" target="_blank">立即申请</a>'
,
// 插件描述(支持html)
'desc'
=>
'
***新版本接口***
适用PC+H5,即时到帐支付方式,买家的交易资金直接打入卖家支付宝账户,快速回笼交易资金。 <a href="http://www.alipay.com/" target="_blank">立即申请</a>'
,
// 插件描述(支持html)
'author'
=>
'Devil'
,
// 开发者
'author_url'
=>
'http://shopxo.net/'
,
// 开发者主页
];
...
...
@@ -64,117 +64,39 @@ class Alipay
'element'
=>
'input'
,
'type'
=>
'text'
,
'default'
=>
''
,
'name'
=>
'a
ccount
'
,
'placeholder'
=>
'
支付宝账号
'
,
'title'
=>
'
支付宝账号
'
,
'name'
=>
'a
ppid
'
,
'placeholder'
=>
'
应用ID
'
,
'title'
=>
'
应用ID
'
,
'is_required'
=>
0
,
'message'
=>
'请填写
支付宝账号
'
,
'message'
=>
'请填写
应用ID
'
,
],
[
'element'
=>
'input'
,
'type'
=>
'text'
,
'default'
=>
''
,
'name'
=>
'partner'
,
'placeholder'
=>
'合作者身份 partner ID'
,
'title'
=>
'合作者身份 partner ID'
,
'element'
=>
'textarea'
,
'name'
=>
'rsa_public'
,
'placeholder'
=>
'应用公钥'
,
'title'
=>
'应用公钥'
,
'is_required'
=>
0
,
'message'
=>
'请填写合作者身份 partner ID'
,
'rows'
=>
6
,
'message'
=>
'请填写应用公钥'
,
],
[
'element'
=>
'input'
,
'type'
=>
'text'
,
'default'
=>
''
,
'name'
=>
'key'
,
'placeholder'
=>
'交易安全校验码 key'
,
'title'
=>
'交易安全校验码 key'
,
'element'
=>
'textarea'
,
'name'
=>
'rsa_private'
,
'placeholder'
=>
'应用私钥'
,
'title'
=>
'应用私钥'
,
'is_required'
=>
0
,
'rows'
=>
6
,
'message'
=>
'请填写应用私钥'
,
],
[
'element'
=>
'textarea'
,
'name'
=>
'out_rsa_public'
,
'placeholder'
=>
'支付宝公钥'
,
'title'
=>
'支付宝公钥'
,
'is_required'
=>
0
,
'message'
=>
'请填写交易安全校验码 key'
,
'rows'
=>
6
,
'message'
=>
'请填写支付宝公钥'
,
],
// [
// 'element' => 'input', // 表单标签
// 'type' => 'text', // input类型
// 'default' => '', // 默认值
// 'name' => 'testinput', // name名称
// 'placeholder' => '测试输入框不需要验证', // input默认显示文字
// 'title' => '测试输入框不需要验证', // 展示title名称
// 'is_required' => 0, // 是否需要强制填写/选择
// 'message' => '请填写测试输入框不需要验证', // 错误提示(is_required=1方可有效)
// ],
// [
// 'element' => 'textarea',
// 'default' => '',
// 'name' => 'rsa_private',
// 'placeholder' => 'RSA证书',
// 'title' => 'RSA证书',
// 'is_required' => 0,
// 'minlength' => 10, // 最小输入字符(is_required=1方可有效)
// //'maxlength' => 300, // 最大输入字符, 填则不限(is_required=1方可有效)
// 'rows' => 6,
// ],
// [
// 'element' => 'input',
// 'type' => 'checkbox',
// 'element_data' => [
// ['value'=>1, 'name'=>'选项1'],
// ['value'=>2, 'name'=>'选项2',],
// ['value'=>3, 'name'=>'选项3'],
// ['value'=>4, 'name'=>'选项4']
// ],
// 'is_block' => 1, // 是否每个选项行内展示(默认0)
// 'minchecked' => 2, // 最小选项(默认以is_required=1至少一项,则0)
// 'maxchecked' => 3, // 最大选项
// 'name' => 'checkbox',
// 'title' => '多选项测试', // 展示title名称
// 'is_required' => 1, // 是否需要强制填写/选择
// 'message' => '请选择多选项测试选择 至少选择2项最多选择3项', // 错误提示信息
// ],
// [
// 'element' => 'input',
// 'type' => 'radio',
// 'element_data' => [
// ['value'=>1, 'name'=>'选项1',],
// ['value'=>2, 'name'=>'选项2'],
// ['value'=>3, 'name'=>'选项3'],
// ['value'=>4, 'name'=>'选项4']
// ],
// 'is_block' => 1, // 是否每个选项行内展示(默认0)
// 'name' => 'radio',
// 'title' => '单选项测试', // 展示title名称
// 'is_required' => 1, // 是否需要强制填写/选择
// 'message' => '请选择单选项测试',
// ],
// [
// 'element' => 'select',
// 'placeholder' => '选一个撒1',
// 'is_multiple' => 0, // 是否开启多选(默认0 关闭)
// 'element_data' => [
// ['value'=>1, 'name'=>'选项1'],
// ['value'=>2, 'name'=>'选项2'],
// ['value'=>3, 'name'=>'选项3'],
// ['value'=>4, 'name'=>'选项4']
// ],
// 'name' => 'select1',
// 'title' => '下拉单选测试', // 展示title名称
// 'is_required' => 1, // 是否需要强制填写/选择
// 'message' => '请选择下拉单选测试',
// ],
// [
// 'element' => 'select',
// 'placeholder' => '选一个撒2',
// 'is_multiple' => 1, // 是否开启多选(默认0 关闭)
// 'element_data' => [
// ['value'=>1, 'name'=>'选项1'],
// ['value'=>2, 'name'=>'选项2'],
// ['value'=>3, 'name'=>'选项3'],
// ['value'=>4, 'name'=>'选项4']
// ],
// 'minchecked' => 2, // 最小选项(默认以is_required=1至少一项,则0)
// 'maxchecked' => 3, // 最大选项
// 'name' => 'select2',
// 'title' => '下拉多选测试', // 展示title名称
// 'is_required' => 1, // 是否需要强制填写/选择
// 'message' => '请选择下拉多选测试 至少选择2项最多选择3项',
// ],
];
return
[
...
...
@@ -226,262 +148,274 @@ class Alipay
*/
private
function
PayMobile
(
$params
=
[])
{
// 获取请求token
$ret
=
$this
->
GetRequestToken
(
$params
);
if
(
$ret
[
'code'
]
!=
0
)
{
return
$ret
;
}
// 拼接wap数据
$req_data
=
'<auth_and_execute_req><request_token>'
.
$ret
[
'data'
]
.
'</request_token></auth_and_execute_req>'
;
// 支付参数
$parameter
=
array
(
'service'
=>
'alipay.wap.auth.authAndExecute'
,
'format'
=>
'xml'
,
'v'
=>
'2.0'
,
'partner'
=>
$this
->
config
[
'partner'
],
'sec_id'
=>
'MD5'
,
'req_data'
=>
$req_data
,
'request_token'
=>
$ret
[
'data'
]
'app_id'
=>
$this
->
config
[
'appid'
],
'method'
=>
'alipay.trade.wap.pay'
,
'format'
=>
'JSON'
,
'charset'
=>
'utf-8'
,
'sign_type'
=>
'RSA2'
,
'timestamp'
=>
date
(
'Y-m-d H:i:s'
),
'version'
=>
'1.0'
,
'return_url'
=>
$params
[
'call_back_url'
],
'notify_url'
=>
$params
[
'notify_url'
],
);
$biz_content
=
array
(
'product_code'
=>
'QUICK_WAP_WAY'
,
'subject'
=>
$params
[
'name'
],
'out_trade_no'
=>
$params
[
'order_no'
],
'total_amount'
=>
$params
[
'total_price'
],
);
$parameter
[
'biz_content'
]
=
json_encode
(
$biz_content
,
JSON_UNESCAPED_UNICODE
);
// 生成签名参数+签名
$parameter
[
'sign'
]
=
$this
->
MyRsaSign
(
$this
->
GetSignContent
(
$parameter
));
$param
=
$this
->
GetParamSign
(
$parameter
);
$url
=
'http://wappaygw.alipay.com/service/rest.htm?'
.
$param
[
'urlcode'
]
.
'&sign='
.
md5
(
$param
[
'sign'
]);
return
DataReturn
(
'处理成功'
,
0
,
$url
);
// 输出执行form表单post提交
exit
(
$this
->
BuildRequestForm
(
$parameter
));
}
/**
* [
GetRequestToken 获取临时token
]
* [
PayWeb PC支付
]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-28T00:
43:36
+0800
* @datetime 2018-09-28T00:
23:04
+0800
* @param [array] $params [输入参数]
*/
private
function
GetRequestToken
(
$params
=
[])
private
function
PayWeb
(
$params
=
[])
{
// 支付参数
$parameter
=
array
(
'service'
=>
'alipay.wap.trade.create.direct'
,
'format'
=>
'xml'
,
'v'
=>
'2.0'
,
'partner'
=>
$this
->
config
[
'partner'
],
'req_id'
=>
$params
[
'order_no'
],
'sec_id'
=>
'MD5'
,
'req_data'
=>
$this
->
GetReqData
(
$params
),
'app_id'
=>
$this
->
config
[
'appid'
],
'method'
=>
'alipay.trade.page.pay'
,
'format'
=>
'JSON'
,
'charset'
=>
'utf-8'
,
'sign_type'
=>
'RSA2'
,
'timestamp'
=>
date
(
'Y-m-d H:i:s'
),
'version'
=>
'1.0'
,
'return_url'
=>
$params
[
'call_back_url'
],
'notify_url'
=>
$params
[
'notify_url'
],
);
$biz_content
=
array
(
'product_code'
=>
'FAST_INSTANT_TRADE_PAY'
,
'subject'
=>
$params
[
'name'
],
'out_trade_no'
=>
$params
[
'order_no'
],
'total_fee'
=>
$params
[
'total_price'
],
'seller_account_name'
=>
$this
->
config
[
'account'
],
'call_back_url'
=>
$params
[
'call_back_url'
],
'notify_url'
=>
$params
[
'notify_url'
],
'out_user'
=>
$params
[
'out_user'
],
'merchant_url'
=>
isset
(
$params
[
'merchant_url'
])
?
$params
[
'merchant_url'
]
:
$params
[
'call_back_url'
],
'total_amount'
=>
$params
[
'total_price'
],
);
$parameter
[
'biz_content'
]
=
json_encode
(
$biz_content
,
JSON_UNESCAPED_UNICODE
);
// 生成签名参数+签名
$parameter
[
'sign'
]
=
$this
->
MyRsaSign
(
$this
->
GetSignContent
(
$parameter
));
// 输出执行form表单post提交
exit
(
$this
->
BuildRequestForm
(
$parameter
));
}
$param
=
$this
->
GetParamSign
(
$parameter
);
$ret
=
urldecode
(
file_get_contents
(
'http://wappaygw.alipay.com/service/rest.htm?'
.
$param
[
'urlcode'
]
.
'&sign='
.
md5
(
$param
[
'sign'
])));
// 把切割后的字符串数组变成变量与数值组合的数组
$para_split
=
explode
(
'&'
,
$ret
);
$para_text
=
[];
foreach
(
$para_split
as
$item
)
/**
* 支付回调处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-09-19
* @desc description
* @param [array] $params [输入参数]
*/
public
function
Respond
(
$params
=
[])
{
//获得第一个=字符的位置
$npos
=
strpos
(
$item
,
'='
);
//获得字符串长度
$nlen
=
strlen
(
$item
);
//获得变量名
$key
=
substr
(
$item
,
0
,
$npos
);
//获得数值
$value
=
substr
(
$item
,
$npos
+
1
,
$nlen
-
$npos
-
1
);
//放入数组中
$para_text
[
$key
]
=
$value
;
$data
=
empty
(
$_POST
)
?
$_GET
:
array_merge
(
$_GET
,
$_POST
);
ksort
(
$data
);
// 参数字符串
$prestr
=
''
;
foreach
(
$data
AS
$key
=>
$val
)
{
if
(
$key
!=
'sign'
&&
$key
!=
'sign_type'
&&
$key
!=
'code'
)
{
$prestr
.
=
"
$key
=
$val
&"
;
}
}
if
(
empty
(
$para_text
[
'res_data'
]))
$prestr
=
substr
(
$prestr
,
0
,
-
1
);
// 签名
if
(
!
$this
->
OutRsaVerify
(
$prestr
,
$data
[
'sign'
]))
{
return
DataReturn
(
'
支付宝异常错误
'
,
-
1
);
return
DataReturn
(
'
签名校验失败
'
,
-
1
);
}
$req
=
Xml_Array
(
$para_text
[
'res_data'
]);
if
(
empty
(
$req
[
'request_token'
]
))
// 支付状态
if
(
!
empty
(
$data
[
'trade_no'
])
||
(
isset
(
$data
[
'trade_status'
])
&&
in_array
(
$data
[
'trade_status'
],
[
'TRADE_SUCCESS'
,
'TRADE_FINISHED'
])
))
{
return
DataReturn
(
'支付
宝异常错误'
,
-
1
);
return
DataReturn
(
'支付
成功'
,
0
,
$this
->
ReturnData
(
$data
)
);
}
return
DataReturn
(
'处理
成功'
,
0
,
$req
[
'request_token'
]
);
return
DataReturn
(
'处理
异常错误'
,
-
100
);
}
/**
* [
GetReqData 订单信息拼接
]
* [
ReturnData 返回数据统一格式
]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-
09-28T00:46:02
+0800
* @param
[array] $params [输入参数
]
* @datetime 2018-
10-06T16:54:24
+0800
* @param
[array] $data [返回数据
]
*/
private
function
GetReqData
(
$params
=
[]
)
private
function
ReturnData
(
$data
)
{
return
'<direct_trade_create_req>
<subject>'
.
$params
[
'name'
]
.
'</subject>
<out_trade_no>'
.
$params
[
'order_no'
]
.
'</out_trade_no>
<total_fee>'
.
$params
[
'total_price'
]
.
'</total_fee>
<seller_account_name>'
.
$this
->
config
[
'account'
]
.
'</seller_account_name>
<call_back_url>'
.
$params
[
'call_back_url'
]
.
'</call_back_url>
<notify_url>'
.
$params
[
'notify_url'
]
.
'</notify_url>
<out_user>'
.
$params
[
'out_user'
]
.
'</out_user>
<merchant_url>'
.
(
isset
(
$params
[
'merchant_url'
])
?
$params
[
'merchant_url'
]
:
$params
[
'call_back_url'
])
.
'</merchant_url>
<pay_expire>3600</pay_expire>
<agent_id>0</agent_id>
</direct_trade_create_req>'
;
// 返回数据固定基础参数
$data
[
'trade_no'
]
=
$data
[
'trade_no'
];
// 支付平台 - 订单号
$data
[
'buyer_user'
]
=
$data
[
'seller_id'
];
// 支付平台 - 用户
$data
[
'out_trade_no'
]
=
$data
[
'out_trade_no'
];
// 本系统发起支付的 - 订单号
$data
[
'subject'
]
=
isset
(
$data
[
'subject'
])
?
$data
[
'subject'
]
:
''
;
// 本系统发起支付的 - 商品名称
$data
[
'pay_price'
]
=
$data
[
'total_amount'
];
// 本系统发起支付的 - 总价
return
$data
;
}
/**
*
[PayWeb PC支付]
*
建立请求,以表单HTML形式构造(默认)
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-28T00:23:04+0800
* @param [array] $params [输入参数]
* @date 2019-03-15
* @desc description
* @param [array] $params [请求参数数组]
* @return [string] [提交表单HTML文本]
*/
private
function
PayWeb
(
$params
=
[]
)
private
function
BuildRequestForm
(
$params
)
{
$parameter
=
array
(
'service'
=>
'create_direct_pay_by_user'
,
'partner'
=>
$this
->
config
[
'partner'
],
'_input_charset'
=>
'utf-8'
,
'notify_url'
=>
$params
[
'notify_url'
],
'return_url'
=>
$params
[
'call_back_url'
],
/* 业务参数 */
'subject'
=>
$params
[
'name'
],
'out_trade_no'
=>
$params
[
'order_no'
],
'price'
=>
$params
[
'total_price'
],
'quantity'
=>
1
,
'payment_type'
=>
1
,
$html
=
"<form id='alipaysubmit' name='alipaysubmit' action='https://openapi.alipay.com/gateway.do?charset=utf-8' method='POST'>"
;
while
(
list
(
$key
,
$val
)
=
each
(
$params
))
{
if
(
!
empty
(
$val
))
{
$val
=
str_replace
(
"'"
,
"'"
,
$val
);
$html
.
=
"<input type='hidden' name='"
.
$key
.
"' value='"
.
$val
.
"'/>"
;
}
}
/* 物流参数 */
// 'logistics_type' => 'EXPRESS',
// 'logistics_fee' => 0,
// 'logistics_payment' => 'BUYER_PAY_AFTER_RECEIVE',
//submit按钮控件请不要含有name属性
$html
.
=
"<input type='submit' value='ok' style='display:none;''></form>"
;
/* 买卖双方信息 */
'seller_email'
=>
$this
->
config
[
'account'
],
);
$html
.
=
"<script>document.forms['alipaysubmit'].submit();</script>"
;
$param
=
$this
->
GetParamSign
(
$parameter
);
$url
=
'https://mapi.alipay.com/gateway.do?'
.
$param
[
'urlcode'
]
.
'&sign='
.
md5
(
$param
[
'sign'
])
.
'&sign_type=MD5'
;
return
DataReturn
(
'处理成功'
,
0
,
$url
);
return
$html
;
}
/**
*
[GetParamSign 签名生成]
*
获取签名内容
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-28T00:28:07+0800
* @param [array] $params [输入参数]
* @date 2019-03-15
* @desc description
* @param [array] $params [需要签名的参数]
*/
p
rivate
function
GetParamSign
(
$params
=
[]
)
p
ublic
function
GetSignContent
(
$params
)
{
$urlcode
=
''
;
$url
=
''
;
ksort
(
$params
);
foreach
(
$params
AS
$key
=>
$val
)
$string
=
""
;
$i
=
0
;
foreach
(
$params
as
$k
=>
$v
)
{
$urlcode
.
=
"
$key
="
.
urlencode
(
$val
)
.
"&"
;
$url
.
=
"
$key
=
$val
&"
;
}
$result
=
array
(
'urlcode'
=>
substr
(
$urlcode
,
0
,
-
1
),
'url'
=>
substr
(
$url
,
0
,
-
1
),
'sign'
=>
''
,
);
if
(
!
empty
(
$this
->
config
[
'key'
]))
if
(
!
empty
(
$v
)
&&
"@"
!=
substr
(
$v
,
0
,
1
))
{
$result
[
'sign'
]
=
$result
[
'url'
]
.
$this
->
config
[
'key'
];
if
(
$i
==
0
)
{
$string
.
=
"
$k
"
.
"="
.
"
$v
"
;
}
else
{
$string
.
=
"&"
.
"
$k
"
.
"="
.
"
$v
"
;
}
return
$result
;
$i
++
;
}
}
unset
(
$k
,
$v
);
return
$string
;
}
/**
*
支付回调处理
*
[MyRsaSign 签名字符串]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date
2018-09-19
* @
desc description
* @
param [array] $params [输入参数
]
* @date
time 2017-09-24T08:38:28+0800
* @
param [string] $prestr [需要签名的字符串]
* @
return [string] [签名结果
]
*/
public
function
Respond
(
$params
=
[])
{
if
(
empty
(
$this
->
config
))
private
function
MyRsaSign
(
$prestr
)
{
return
DataReturn
(
'配置有误'
,
-
1
);
$res
=
"-----BEGIN RSA PRIVATE KEY-----
\n
"
;
$res
.
=
wordwrap
(
$this
->
config
[
'rsa_private'
],
64
,
"
\n
"
,
true
);
$res
.
=
"
\n
-----END RSA PRIVATE KEY-----"
;
return
openssl_sign
(
$prestr
,
$sign
,
$res
,
OPENSSL_ALGO_SHA256
)
?
base64_encode
(
$sign
)
:
null
;
}
$data
=
empty
(
$_POST
)
?
$_GET
:
array_merge
(
$_GET
,
$_POST
);
ksort
(
$data
);
$sign
=
''
;
if
(
isset
(
$data
[
'sec_id'
])
&&
$data
[
'sec_id'
]
==
'MD5'
)
{
$data_xml
=
json_decode
(
json_encode
((
array
)
simplexml_load_string
(
$data
[
'notify_data'
])),
true
);
$data
=
array_merge
(
$data
,
$data_xml
);
$sign
=
'service='
.
$data
[
'service'
]
.
'&v='
.
$data
[
'v'
]
.
'&sec_id='
.
$data
[
'sec_id'
]
.
'¬ify_data='
.
$data
[
'notify_data'
];
}
else
{
foreach
(
$data
AS
$key
=>
$val
)
/**
* [MyRsaDecrypt RSA解密]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2017-09-24T09:12:06+0800
* @param [string] $content [需要解密的内容,密文]
* @return [string] [解密后内容,明文]
*/
private
function
MyRsaDecrypt
(
$content
)
{
if
(
$key
!=
'sign'
&&
$key
!=
'sign_type'
&&
$key
!=
'code'
)
$res
=
"-----BEGIN PUBLIC KEY-----
\n
"
;
$res
.
=
wordwrap
(
$this
->
config
[
'rsa_public'
],
64
,
"
\n
"
,
true
);
$res
.
=
"
\n
-----END PUBLIC KEY-----"
;
$res
=
openssl_get_privatekey
(
$res
);
$content
=
base64_decode
(
$content
);
$result
=
''
;
for
(
$i
=
0
;
$i
<
strlen
(
$content
)
/
128
;
$i
++
)
{
$sign
.
=
"
$key
=
$val
&"
;
}
$data
=
substr
(
$content
,
$i
*
128
,
128
);
openssl_private_decrypt
(
$data
,
$decrypt
,
$res
,
OPENSSL_ALGO_SHA256
);
$result
.
=
$decrypt
;
}
$sign
=
substr
(
$sign
,
0
,
-
1
);
openssl_free_key
(
$res
);
return
$result
;
}
// 签名校验
if
(
!
isset
(
$data
[
'sign'
])
||
md5
(
$sign
.
$this
->
config
[
'key'
])
!=
$data
[
'sign'
])
/**
* [OutRsaVerify 支付宝验证签名]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2017-09-24T08:39:50+0800
* @param [string] $prestr [需要签名的字符串]
* @param [string] $sign [签名结果]
* @return [boolean] [正确true, 错误false]
*/
private
function
OutRsaVerify
(
$prestr
,
$sign
)
{
return
DataReturn
(
'签名校验失败'
,
-
1
)
;
}
// 支付状态
$s
tatus
=
isset
(
$data
[
'trade_status'
])
?
$data
[
'trade_status'
]
:
$data
[
'result'
]
;
switch
(
$status
)
$res
=
"-----BEGIN PUBLIC KEY-----
\n
"
;
$res
.
=
wordwrap
(
$this
->
config
[
'out_rsa_public'
],
64
,
"
\n
"
,
true
);
$res
.
=
"
\n
-----END PUBLIC KEY-----"
;
$pkeyid
=
openssl_pkey_get_public
(
$res
);
$s
ign
=
base64_decode
(
$sign
)
;
if
(
$pkeyid
)
{
case
'TRADE_SUCCESS'
:
case
'TRADE_FINISHED'
:
case
'success'
:
return
DataReturn
(
'支付成功'
,
0
,
$this
->
ReturnData
(
$data
));
break
;
$verify
=
openssl_verify
(
$prestr
,
$sign
,
$pkeyid
,
OPENSSL_ALGO_SHA256
);
openssl_free_key
(
$pkeyid
);
}
return
DataReturn
(
'处理异常错误'
,
-
100
)
;
return
(
isset
(
$verify
)
&&
$verify
==
1
)
?
true
:
false
;
}
/**
* [
ReturnData 返回数据统一格式
]
* [
SyncRsaVerify 同步返回签名验证
]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 201
8-10-06T16:54:24
+0800
* @datetime 201
7-09-25T13:13:39
+0800
* @param [array] $data [返回数据]
* @param [boolean] $key [数据key]
*/
private
function
ReturnData
(
$data
)
private
function
SyncRsaVerify
(
$data
,
$key
)
{
// 兼容web版本支付参数
$buyer_user
=
isset
(
$data
[
'buyer_logon_id'
])
?
$data
[
'buyer_logon_id'
]
:
(
isset
(
$data
[
'buyer_email'
])
?
$data
[
'buyer_email'
]
:
''
);
$pay_price
=
isset
(
$data
[
'total_amount'
])
?
$data
[
'total_amount'
]
:
(
isset
(
$data
[
'total_fee'
])
?
$data
[
'total_fee'
]
:
''
);
// 返回数据固定基础参数
$data
[
'trade_no'
]
=
isset
(
$data
[
'trade_no'
])
?
$data
[
'trade_no'
]
:
''
;
// 支付平台 - 订单号
$data
[
'buyer_user'
]
=
$buyer_user
;
// 支付平台 - 用户
$data
[
'out_trade_no'
]
=
isset
(
$data
[
'out_trade_no'
])
?
$data
[
'out_trade_no'
]
:
''
;
// 本系统发起支付的 - 订单号
$data
[
'subject'
]
=
isset
(
$data
[
'subject'
])
?
$data
[
'subject'
]
:
''
;
// 本系统发起支付的 - 商品名称
$data
[
'pay_price'
]
=
$pay_price
;
// 本系统发起支付的 - 总价
return
$data
;
$string
=
json_encode
(
$data
[
$key
],
JSON_UNESCAPED_UNICODE
);
return
$this
->
OutRsaVerify
(
$string
,
$data
[
'sign'
]);
}
}
?>
\ No newline at end of file
extend/payment/AlipayAncient.php
0 → 100755
浏览文件 @
d460819d
<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace
payment
;
/**
* 支付宝支付 - 老版本接口
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-09-19
* @desc description
*/
class
AlipayAncient
{
// 插件配置参数
private
$config
;
/**
* 构造方法
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-09-17
* @desc description
* @param [array] $params [输入参数(支付配置参数)]
*/
public
function
__construct
(
$params
=
[])
{
$this
->
config
=
$params
;
}
/**
* 配置信息
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-09-19
* @desc description
*/
public
function
Config
()
{
// 基础信息
$base
=
[
'name'
=>
'支付宝'
,
// 插件名称
'version'
=>
'0.0.1'
,
// 插件版本
'apply_version'
=>
'不限'
,
// 适用系统版本描述
'apply_terminal'
=>
[
'pc'
,
'h5'
],
// 适用终端 默认全部 ['pc', 'h5', 'app', 'alipay', 'weixin', 'baidu']
'desc'
=>
'***老版本接口*** 适用PC+H5,即时到帐支付方式,买家的交易资金直接打入卖家支付宝账户,快速回笼交易资金。 <a href="http://www.alipay.com/" target="_blank">立即申请</a>'
,
// 插件描述(支持html)
'author'
=>
'Devil'
,
// 开发者
'author_url'
=>
'http://shopxo.net/'
,
// 开发者主页
];
// 配置信息
$element
=
[
[
'element'
=>
'input'
,
'type'
=>
'text'
,
'default'
=>
''
,
'name'
=>
'account'
,
'placeholder'
=>
'支付宝账号'
,
'title'
=>
'支付宝账号'
,
'is_required'
=>
0
,
'message'
=>
'请填写支付宝账号'
,
],
[
'element'
=>
'input'
,
'type'
=>
'text'
,
'default'
=>
''
,
'name'
=>
'partner'
,
'placeholder'
=>
'合作者身份 partner ID'
,
'title'
=>
'合作者身份 partner ID'
,
'is_required'
=>
0
,
'message'
=>
'请填写合作者身份 partner ID'
,
],
[
'element'
=>
'input'
,
'type'
=>
'text'
,
'default'
=>
''
,
'name'
=>
'key'
,
'placeholder'
=>
'交易安全校验码 key'
,
'title'
=>
'交易安全校验码 key'
,
'is_required'
=>
0
,
'message'
=>
'请填写交易安全校验码 key'
,
],
// [
// 'element' => 'input', // 表单标签
// 'type' => 'text', // input类型
// 'default' => '', // 默认值
// 'name' => 'testinput', // name名称
// 'placeholder' => '测试输入框不需要验证', // input默认显示文字
// 'title' => '测试输入框不需要验证', // 展示title名称
// 'is_required' => 0, // 是否需要强制填写/选择
// 'message' => '请填写测试输入框不需要验证', // 错误提示(is_required=1方可有效)
// ],
// [
// 'element' => 'textarea',
// 'default' => '',
// 'name' => 'rsa_private',
// 'placeholder' => 'RSA证书',
// 'title' => 'RSA证书',
// 'is_required' => 0,
// 'minlength' => 10, // 最小输入字符(is_required=1方可有效)
// //'maxlength' => 300, // 最大输入字符, 填则不限(is_required=1方可有效)
// 'rows' => 6,
// ],
// [
// 'element' => 'input',
// 'type' => 'checkbox',
// 'element_data' => [
// ['value'=>1, 'name'=>'选项1'],
// ['value'=>2, 'name'=>'选项2',],
// ['value'=>3, 'name'=>'选项3'],
// ['value'=>4, 'name'=>'选项4']
// ],
// 'is_block' => 1, // 是否每个选项行内展示(默认0)
// 'minchecked' => 2, // 最小选项(默认以is_required=1至少一项,则0)
// 'maxchecked' => 3, // 最大选项
// 'name' => 'checkbox',
// 'title' => '多选项测试', // 展示title名称
// 'is_required' => 1, // 是否需要强制填写/选择
// 'message' => '请选择多选项测试选择 至少选择2项最多选择3项', // 错误提示信息
// ],
// [
// 'element' => 'input',
// 'type' => 'radio',
// 'element_data' => [
// ['value'=>1, 'name'=>'选项1',],
// ['value'=>2, 'name'=>'选项2'],
// ['value'=>3, 'name'=>'选项3'],
// ['value'=>4, 'name'=>'选项4']
// ],
// 'is_block' => 1, // 是否每个选项行内展示(默认0)
// 'name' => 'radio',
// 'title' => '单选项测试', // 展示title名称
// 'is_required' => 1, // 是否需要强制填写/选择
// 'message' => '请选择单选项测试',
// ],
// [
// 'element' => 'select',
// 'placeholder' => '选一个撒1',
// 'is_multiple' => 0, // 是否开启多选(默认0 关闭)
// 'element_data' => [
// ['value'=>1, 'name'=>'选项1'],
// ['value'=>2, 'name'=>'选项2'],
// ['value'=>3, 'name'=>'选项3'],
// ['value'=>4, 'name'=>'选项4']
// ],
// 'name' => 'select1',
// 'title' => '下拉单选测试', // 展示title名称
// 'is_required' => 1, // 是否需要强制填写/选择
// 'message' => '请选择下拉单选测试',
// ],
// [
// 'element' => 'select',
// 'placeholder' => '选一个撒2',
// 'is_multiple' => 1, // 是否开启多选(默认0 关闭)
// 'element_data' => [
// ['value'=>1, 'name'=>'选项1'],
// ['value'=>2, 'name'=>'选项2'],
// ['value'=>3, 'name'=>'选项3'],
// ['value'=>4, 'name'=>'选项4']
// ],
// 'minchecked' => 2, // 最小选项(默认以is_required=1至少一项,则0)
// 'maxchecked' => 3, // 最大选项
// 'name' => 'select2',
// 'title' => '下拉多选测试', // 展示title名称
// 'is_required' => 1, // 是否需要强制填写/选择
// 'message' => '请选择下拉多选测试 至少选择2项最多选择3项',
// ],
];
return
[
'base'
=>
$base
,
'element'
=>
$element
,
];
}
/**
* 支付入口
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-09-19
* @desc description
* @param [array] $params [输入参数]
*/
public
function
Pay
(
$params
=
[])
{
// 参数
if
(
empty
(
$params
))
{
return
DataReturn
(
'参数不能为空'
,
-
1
);
}
// 配置信息
if
(
empty
(
$this
->
config
))
{
return
DataReturn
(
'支付缺少配置'
,
-
1
);
}
// 手机/PC
if
(
IsMobile
())
{
$ret
=
$this
->
PayMobile
(
$params
);
}
else
{
$ret
=
$this
->
PayWeb
(
$params
);
}
return
$ret
;
}
/**
* [PayMobile wap手机支付]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-28T00:41:09+0800
* @param [array] $params [输入参数]
*/
private
function
PayMobile
(
$params
=
[])
{
// 获取请求token
$ret
=
$this
->
GetRequestToken
(
$params
);
if
(
$ret
[
'code'
]
!=
0
)
{
return
$ret
;
}
// 拼接wap数据
$req_data
=
'<auth_and_execute_req><request_token>'
.
$ret
[
'data'
]
.
'</request_token></auth_and_execute_req>'
;
$parameter
=
array
(
'service'
=>
'alipay.wap.auth.authAndExecute'
,
'format'
=>
'xml'
,
'v'
=>
'2.0'
,
'partner'
=>
$this
->
config
[
'partner'
],
'sec_id'
=>
'MD5'
,
'req_data'
=>
$req_data
,
'request_token'
=>
$ret
[
'data'
]
);
$param
=
$this
->
GetParamSign
(
$parameter
);
$url
=
'http://wappaygw.alipay.com/service/rest.htm?'
.
$param
[
'urlcode'
]
.
'&sign='
.
md5
(
$param
[
'sign'
]);
return
DataReturn
(
'处理成功'
,
0
,
$url
);
}
/**
* [GetRequestToken 获取临时token]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-28T00:43:36+0800
* @param [array] $params [输入参数]
*/
private
function
GetRequestToken
(
$params
=
[])
{
$parameter
=
array
(
'service'
=>
'alipay.wap.trade.create.direct'
,
'format'
=>
'xml'
,
'v'
=>
'2.0'
,
'partner'
=>
$this
->
config
[
'partner'
],
'req_id'
=>
$params
[
'order_no'
],
'sec_id'
=>
'MD5'
,
'req_data'
=>
$this
->
GetReqData
(
$params
),
'subject'
=>
$params
[
'name'
],
'out_trade_no'
=>
$params
[
'order_no'
],
'total_fee'
=>
$params
[
'total_price'
],
'seller_account_name'
=>
$this
->
config
[
'account'
],
'call_back_url'
=>
$params
[
'call_back_url'
],
'notify_url'
=>
$params
[
'notify_url'
],
'out_user'
=>
$params
[
'out_user'
],
'merchant_url'
=>
isset
(
$params
[
'merchant_url'
])
?
$params
[
'merchant_url'
]
:
$params
[
'call_back_url'
],
);
$param
=
$this
->
GetParamSign
(
$parameter
);
$ret
=
urldecode
(
file_get_contents
(
'http://wappaygw.alipay.com/service/rest.htm?'
.
$param
[
'urlcode'
]
.
'&sign='
.
md5
(
$param
[
'sign'
])));
// 把切割后的字符串数组变成变量与数值组合的数组
$para_split
=
explode
(
'&'
,
$ret
);
$para_text
=
[];
foreach
(
$para_split
as
$item
)
{
//获得第一个=字符的位置
$npos
=
strpos
(
$item
,
'='
);
//获得字符串长度
$nlen
=
strlen
(
$item
);
//获得变量名
$key
=
substr
(
$item
,
0
,
$npos
);
//获得数值
$value
=
substr
(
$item
,
$npos
+
1
,
$nlen
-
$npos
-
1
);
//放入数组中
$para_text
[
$key
]
=
$value
;
}
if
(
empty
(
$para_text
[
'res_data'
]))
{
return
DataReturn
(
'支付宝异常错误'
,
-
1
);
}
$req
=
Xml_Array
(
$para_text
[
'res_data'
]);
if
(
empty
(
$req
[
'request_token'
]))
{
return
DataReturn
(
'支付宝异常错误'
,
-
1
);
}
return
DataReturn
(
'处理成功'
,
0
,
$req
[
'request_token'
]);
}
/**
* [GetReqData 订单信息拼接]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-28T00:46:02+0800
* @param [array] $params [输入参数]
*/
private
function
GetReqData
(
$params
=
[])
{
return
'<direct_trade_create_req>
<subject>'
.
$params
[
'name'
]
.
'</subject>
<out_trade_no>'
.
$params
[
'order_no'
]
.
'</out_trade_no>
<total_fee>'
.
$params
[
'total_price'
]
.
'</total_fee>
<seller_account_name>'
.
$this
->
config
[
'account'
]
.
'</seller_account_name>
<call_back_url>'
.
$params
[
'call_back_url'
]
.
'</call_back_url>
<notify_url>'
.
$params
[
'notify_url'
]
.
'</notify_url>
<out_user>'
.
$params
[
'out_user'
]
.
'</out_user>
<merchant_url>'
.
(
isset
(
$params
[
'merchant_url'
])
?
$params
[
'merchant_url'
]
:
$params
[
'call_back_url'
])
.
'</merchant_url>
<pay_expire>3600</pay_expire>
<agent_id>0</agent_id>
</direct_trade_create_req>'
;
}
/**
* [PayWeb PC支付]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-28T00:23:04+0800
* @param [array] $params [输入参数]
*/
private
function
PayWeb
(
$params
=
[])
{
$parameter
=
array
(
'service'
=>
'create_direct_pay_by_user'
,
'partner'
=>
$this
->
config
[
'partner'
],
'_input_charset'
=>
'utf-8'
,
'notify_url'
=>
$params
[
'notify_url'
],
'return_url'
=>
$params
[
'call_back_url'
],
/* 业务参数 */
'subject'
=>
$params
[
'name'
],
'out_trade_no'
=>
$params
[
'order_no'
],
'price'
=>
$params
[
'total_price'
],
'quantity'
=>
1
,
'payment_type'
=>
1
,
/* 物流参数 */
// 'logistics_type' => 'EXPRESS',
// 'logistics_fee' => 0,
// 'logistics_payment' => 'BUYER_PAY_AFTER_RECEIVE',
/* 买卖双方信息 */
'seller_email'
=>
$this
->
config
[
'account'
],
);
$param
=
$this
->
GetParamSign
(
$parameter
);
$url
=
'https://mapi.alipay.com/gateway.do?'
.
$param
[
'urlcode'
]
.
'&sign='
.
md5
(
$param
[
'sign'
])
.
'&sign_type=MD5'
;
return
DataReturn
(
'处理成功'
,
0
,
$url
);
}
/**
* [GetParamSign 签名生成]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-28T00:28:07+0800
* @param [array] $params [输入参数]
*/
private
function
GetParamSign
(
$params
=
[])
{
$urlcode
=
''
;
$url
=
''
;
ksort
(
$params
);
foreach
(
$params
AS
$key
=>
$val
)
{
$urlcode
.
=
"
$key
="
.
urlencode
(
$val
)
.
"&"
;
$url
.
=
"
$key
=
$val
&"
;
}
$result
=
array
(
'urlcode'
=>
substr
(
$urlcode
,
0
,
-
1
),
'url'
=>
substr
(
$url
,
0
,
-
1
),
'sign'
=>
''
,
);
if
(
!
empty
(
$this
->
config
[
'key'
]))
{
$result
[
'sign'
]
=
$result
[
'url'
]
.
$this
->
config
[
'key'
];
}
return
$result
;
}
/**
* 支付回调处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-09-19
* @desc description
* @param [array] $params [输入参数]
*/
public
function
Respond
(
$params
=
[])
{
if
(
empty
(
$this
->
config
))
{
return
DataReturn
(
'配置有误'
,
-
1
);
}
$data
=
empty
(
$_POST
)
?
$_GET
:
array_merge
(
$_GET
,
$_POST
);
ksort
(
$data
);
$sign
=
''
;
if
(
isset
(
$data
[
'sec_id'
])
&&
$data
[
'sec_id'
]
==
'MD5'
)
{
$data_xml
=
json_decode
(
json_encode
((
array
)
simplexml_load_string
(
$data
[
'notify_data'
])),
true
);
$data
=
array_merge
(
$data
,
$data_xml
);
$sign
=
'service='
.
$data
[
'service'
]
.
'&v='
.
$data
[
'v'
]
.
'&sec_id='
.
$data
[
'sec_id'
]
.
'¬ify_data='
.
$data
[
'notify_data'
];
}
else
{
foreach
(
$data
AS
$key
=>
$val
)
{
if
(
$key
!=
'sign'
&&
$key
!=
'sign_type'
&&
$key
!=
'code'
)
{
$sign
.
=
"
$key
=
$val
&"
;
}
}
$sign
=
substr
(
$sign
,
0
,
-
1
);
}
// 签名校验
if
(
!
isset
(
$data
[
'sign'
])
||
md5
(
$sign
.
$this
->
config
[
'key'
])
!=
$data
[
'sign'
])
{
return
DataReturn
(
'签名校验失败'
,
-
1
);
}
// 支付状态
$status
=
isset
(
$data
[
'trade_status'
])
?
$data
[
'trade_status'
]
:
$data
[
'result'
];
switch
(
$status
)
{
case
'TRADE_SUCCESS'
:
case
'TRADE_FINISHED'
:
case
'success'
:
return
DataReturn
(
'支付成功'
,
0
,
$this
->
ReturnData
(
$data
));
break
;
}
return
DataReturn
(
'处理异常错误'
,
-
100
);
}
/**
* [ReturnData 返回数据统一格式]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-10-06T16:54:24+0800
* @param [array] $data [返回数据]
*/
private
function
ReturnData
(
$data
)
{
// 兼容web版本支付参数
$buyer_user
=
isset
(
$data
[
'buyer_logon_id'
])
?
$data
[
'buyer_logon_id'
]
:
(
isset
(
$data
[
'buyer_email'
])
?
$data
[
'buyer_email'
]
:
''
);
$pay_price
=
isset
(
$data
[
'total_amount'
])
?
$data
[
'total_amount'
]
:
(
isset
(
$data
[
'total_fee'
])
?
$data
[
'total_fee'
]
:
''
);
// 返回数据固定基础参数
$data
[
'trade_no'
]
=
isset
(
$data
[
'trade_no'
])
?
$data
[
'trade_no'
]
:
''
;
// 支付平台 - 订单号
$data
[
'buyer_user'
]
=
$buyer_user
;
// 支付平台 - 用户
$data
[
'out_trade_no'
]
=
isset
(
$data
[
'out_trade_no'
])
?
$data
[
'out_trade_no'
]
:
''
;
// 本系统发起支付的 - 订单号
$data
[
'subject'
]
=
isset
(
$data
[
'subject'
])
?
$data
[
'subject'
]
:
''
;
// 本系统发起支付的 - 商品名称
$data
[
'pay_price'
]
=
$pay_price
;
// 本系统发起支付的 - 总价
return
$data
;
}
}
?>
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录