forked from iqianfang/yii2alipay
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Alipay.php
220 lines (176 loc) · 9.1 KB
/
Alipay.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
<?php
namespace iqianfang\yii2alipay;
use Yii;
use common\models\Order;
use yii\base\Component;
use yii\helpers\Url;
/**
* Created by PhpStorm.
* User: 山东千方信息科技 qianfang.me
* Date: 2016/12/6
* Time: 16:56
*/
class Alipay extends Component
{
public $config = []; //配置数组
public $_config = []; //固定配置数组
/**
* 设置一些固定的配置
*/
public function init()
{
parent::init(); // TODO: Change the autogenerated stub
//ca证书路径地址,用于curl中ssl校验
//请保证cacert.pem文件在当前文件夹目录中
$this->config['cacert'] = __DIR__ . '\\cacert.pem';
// 支付类型 ,无需修改
$this->config['payment_type'] = '1';
// 产品类型,无需修改
$this->config['service'] = 'create_direct_pay_by_user';
$this->config['notify_url'] = Yii::$app->urlManager->createAbsoluteUrl($this->config['notify_url']);
$this->config['return_url'] = Yii::$app->urlManager->createAbsoluteUrl($this->config['return_url']);
}
/**
* @param Order $order
* @return \提交表单HTML文本
* @author WangTao <[email protected]>
*/
public function submit($order)
{
require_once("lib/alipay_submit.class.php");
//$alipay_config = array_merge($this->config,$this->_config);
$alipay_config = $this->config;
//构造要请求的参数数组,无需改动
$parameter = array(
"service" => $alipay_config['service'],
"partner" => $alipay_config['partner'],
"seller_id" => $alipay_config['seller_id'],
"payment_type" => $alipay_config['payment_type'],
"notify_url" => $alipay_config['notify_url'],
"return_url" => $alipay_config['return_url'],
"anti_phishing_key" => $alipay_config['anti_phishing_key'],
"exter_invoke_ip" => $alipay_config['exter_invoke_ip'],
"out_trade_no" => $order->sn,
"subject" => '购买课程',
"total_fee" => $order->amount,
"body" => '',
"_input_charset" => trim(strtolower($alipay_config['input_charset']))
//其他业务参数根据在线开发文档,添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.kiX33I&treeId=62&articleId=103740&docType=1
//如"参数名"=>"参数值"
);
$alipaySubmit = new \AlipaySubmit($alipay_config);
return $alipaySubmit->buildRequestForm($parameter, "post", "确认");
}
/**
* 异步通知处理
* @author WangTao <[email protected]>
*/
public function asyNotify()
{
require_once("lib/alipay_notify.class.php");
//计算得出通知验证结果
$alipayNotify = new \AlipayNotify($this->config);
$verify_result = $alipayNotify->verifyNotify();
if ($verify_result) {//验证成功
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
//商户订单号
$out_trade_no = $_POST['out_trade_no'];
//支付宝交易号
$trade_no = $_POST['trade_no'];
//交易状态
$trade_status = $_POST['trade_status'];
if ($_POST['trade_status'] == 'TRADE_FINISHED') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
//如果有做过处理,不执行商户的业务程序
//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
$order = Order::find()->where(['sn' => $out_trade_no])->one();
if ($order && $order->order_status == 0) {
if ($this->config['seller_id'] == $_POST['seller_id'] && $order->amount == $_POST['total_fee']) {
$order->order_status = 1;
$order->save();
}
}
} else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
//如果有做过处理,不执行商户的业务程序
//注意:
//付款完成后,支付宝系统发送该交易状态通知
//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
$order = Order::find()->where(['sn' => $out_trade_no])->one();
if ($order && $order->order_status == 0) {
if ($this->config['seller_id'] == $_POST['seller_id'] && $order->amount == $_POST['total_fee']) {
$order->order_status = 1;
$order->save();
}
}
}
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
echo "success"; //请不要修改或删除
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
} else {
//验证失败
echo "fail";
//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}
}
/**
* 同步通知处理
* @author WangTao <[email protected]>
*/
public function syNotify()
{
require_once("lib/alipay_notify.class.php");
$data = ['status' => false, 'msg' => ''];
//计算得出通知验证结果
$alipayNotify = new \AlipayNotify($this->config);
$verify_result = $alipayNotify->verifyReturn();
if ($verify_result) {//验证成功
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代码
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
//商户订单号
$out_trade_no = $_GET['out_trade_no'];
//支付宝交易号
$trade_no = $_GET['trade_no'];
//交易状态
$trade_status = $_GET['trade_status'];
if ($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
$order = Order::find()->where(['sn' => $out_trade_no])->one();
if ($order && $order->order_status == 0) {
if ($this->config['seller_id'] == $_GET['seller_id'] && $order->amount == $_GET['total_fee']) {
$order->order_status = 1;
$order->save();
}
}
} else {
$data['msg'] = "订单支付失败! --" . $_GET['trade_status'];
}
//echo "验证成功<br />";
$data['status'] = true;
$data['msg'] = "订单支付成功!";
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
} else {
//验证失败
//如要调试,请看alipay_notify.php页面的verifyReturn函数
$data['msg'] = "订单支付失败! --验证失败";
}
return $data;
}
}