支付成功的订单,都需要通过第三方的回调来告知自身服务器,任务已经完成,为了让使用者专注自身的业务,这个接口封装了一些基础处理,如:验签、数据解析等

payment 项目2.x版本

经过这一段时间,终于把支付宝支付相关接口完成了。文档将陆续更新。这里先把回调的文档补充完成。这样结合之前 提供的 支付宝即时到帐接口 才能形成一个闭环。完成一次完整的支付流程。

回调接口介绍

支付服务商(支付宝、微信、PayPal等)处理完支付数据后。会将处理的结果数据通过服务器主动通知的方式通知给商户网站。这些处理结果数据就是服务器异步通知参数。

简单来说,就是支付成功后,支付服务商告诉你,钱已经到账了,你应该把别个买的东西给别个了。

由于本次发布的接口主要都是与支付宝相关,因此本次回调的部分代码也主要先上支付宝的。微信等后期开发完成将更新相关文档。

针对不同的回调,我提供了统一的调用方式,让客户端专注自己的业务。不在处理支付相关的签名验证、来源验证的问题。下面代码是统一的回调处理代码

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

// 支付宝配置文件
$aliconfig = [
'partner' => '2088xxxxx',// 请填写自己的支付宝账号信息
'md5_key' => 'xxxxxxx',// 此密码无效,请填写自己对应设置的值
'rsa_private_key' => dirname(__FILE__) . DIRECTORY_SEPARATOR . 'rsa_private_key.pem',
"notify_url" => 'http://test.helei.com/pay-notify.html',
"return_url" => 'http://test.helei.com/return-url.html',
"time_expire" => '14',

// 转款接口,必须配置以下两项
'account' => 'xxxxxxx@126.com',
'account_name' => 'xxxxxxxxxxxx',
];

// 微信配置文件
$wxconfig = [
'app_id' => 'wxxxx', // 公众账号ID
'mch_id' => 'xxxx',// 商户id
'md5_key' => 'xxxxxx',// md5 秘钥

'notify_url' => 'http://test.helei.com/pay-notify.html',
'time_expire' => '14',

// 涉及资金流动时,需要提供该文件
'cert_path' => dirname(__FILE__) . DIRECTORY_SEPARATOR . 'wx' . DIRECTORY_SEPARATOR . 'apiclient_cert.pem',
'key_path' => dirname(__FILE__) . DIRECTORY_SEPARATOR . 'wx' . DIRECTORY_SEPARATOR . 'apiclient_key.pem',
];

// 获取异步通知上下文
$notify = new NotifyContext();

// 客户端的业务逻辑类。处理如:订单更新
$callback = new TestNotify();

try {
// 支付宝回调
//$notify->initNotify(Config::ALI, $aliconfig);

// 微信回调
$notify->initNotify(Config::WEIXIN, $wxconfig);
$notify->notify($callback);
} catch (PayException $e) {
echo $e->errorMessage();exit;
}

客户端类 TestNotify 的注意事项 ,一定要继承 PayNotifyInterface 这个类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

use Payment\Notify\PayNotifyInterface;

class TestNotify implements PayNotifyInterface
{

/**
* 客户端的业务逻辑,
* @param array $data
* @return bool 返回值一定是bool值
* @author helei
*/

public function notifyProcess(array $data)
{

// 一般支付的处理业务
1. 检查订单是否存在
2. 检查金额是否正确
3. 检查订单是否已经处理过(防止重复通知)
4. 更新订单


return true;
}

}

TestNotify::notifyProcess() 方法中,我注释了常规的订单处理流程。这个地方客户端可根据自己的情况进行适当调整。只是返回结果一定需要 布尔值

现在的重点是 TestNotify::notifyProcess() 方法中的参数 $data 中具体包含的值。根据不同的回调业务,返回的值也不一样。具体请往下看。

支付宝回调通知类型

支付宝的回调,与支付相关的对应三种类型。

  • trade_status_sync 支付行为相关的异步通知
  • batch_refund_notify 有密批量退款的异步通知
  • batch_trans_notify 有密批量付款到支付宝账号的通知

trade_status_sync 异步通知返回数据

该回调发生在:移动支付、即时到帐、手机网站支付接口调用后,如果支付成功,支付宝会发起回调接口。

返回的对应数据如下表

参数 参数名 参数说明 必须
subject 商品名称 订单的关键字
body 商品描述 提交订单时的body值
amount 交易金额 本次订单总金额
channel 支付渠道 本处取值: ali
order_no 商户网站唯一订单号 商户生成的订单号,必须确保在系统中唯一
buyer_id 买家支付宝账户号 可以是Email或手机号码。
trade_state 交易状态 支付成功与否,可取值:success not_pay
transaction_id 支付宝交易号 支付宝系统中的交易流水号,可用于查询订单状态
time_end 交易付款时间 格式为2016-07-28 16:01:01
notify_time 通知时间 格式为2016-07-28 16:01:01
notify_type 通知类型 此处为:trade 表示交易
extra_param 商户自定义参数 仅即时到帐支持

传入到 TestNotify::notifyProcess() 中的数组,包括以上key。可根据以上内容进行业务处理。

batch_refund_notify 异步通知返回数据

本类回调发生在操作退款后,支付宝会通知服务器是否退款成功。退款的界面,如下图:

image

输入支付密码后,就可完成退款。退款后支付宝会向商户服务器进行异步通知。他返回的数据如下:

参数 参数名 参数说明 必须
channel 渠道 本处取值: ali
refund_no 商户网站唯一退单号 商户生成的退单号,必须确保在系统中唯一
success_num 退款成功总数 0<= success_num<= 总退款笔数
notify_time 通知时间 格式为2016-07-28 16:01:01
notify_type 通知类型 此处为:trade 表示交易

batch_trans_notify 异步通知返回数据

该回调发生在批量付款后。返回的数据如下:

参数 参数名 参数说明 必须
channel 渠道 本处取值: ali
trans_no 商户网站唯一转账单号 商户生成的转账单号,必须确保在系统中唯一
pay_name 付款账号姓名 如果是个人为昵称,公司则为公司名称
pay_account 付款账号 邮箱或者手机号码
notify_time 通知时间 格式为2016-07-28 16:01:01
notify_type 通知类型 此处为:trade 表示交易
success 转账成功的详细信息 返回的是一个数组
fail 转账失败的详细信息 返回的是一个数组

备注:

  • success返回的数组中,单条记录格式如下:

流水号^收款方账号^收款账号姓名^付款金额^成功标识(S)^成功原因(null)^支付宝内部流水号^完成时间。

  • fail返回数据中的单条记录格式如下:

流水号^收款方账号^收款账号姓名^付款金额^失败标识(F)^失败原因^支付宝内部流水号^完成时间。

OK。到此支付宝相关的回调通知数据,已经全部处理完成。这里需要大家注意一个问题,上面的数据并不是完整的支付宝返回数据。大部分经过了我的简化,如果有需要的参数,没有返回可执行修改源码或者联系我。

微信支付回调

微信的回调代码部分与支付宝相同。不同的主要是返回值

参数 参数名 参数说明 必须
amount 订单金额 微信默认为分,此处以处理为元,两位小数
channel 支付渠道 可取之为:ali wx 此处为wx
order_no 商户订单号 商户系统的订单号,与请求一致。
buyer_id 用户标识 用户在商户appid下的唯一标识
trade_state 交易状态 表示交易成功,返回值:success
transaction_id 微信支付订单号 微信支付订单号
time_end 支付完成时间 支付完成时间,格式为yyyy-MM-dd HH:mm:ss
notify_time 异步通知发生时间 支付完成时间,格式为yyyy-MM-dd HH:mm:ss
notify_type 通知类型 此处为:trade 表示交易
extra_param 商户自定义参数 仅即时到帐支持

大家可以对比支付宝中异步通知的返回数据。对相关数据均做了命令统一、数据单位格式统一。方便再业务中进行统一处理。