主要介绍相关订单的查询,简化针对不同类型订单(支付的、退单的、转款的)的查询工作。

payment 项目2.x版本

微信并未提供一个统一的查询接口。对应每种查询均需要不同的api。为了便于大家在项目中使用,忽略细节。对以上三种进行了封装。通过工厂的方式降低调用成本。

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
$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',
];

use Payment\QueryContext;
use Payment\Common\PayException;
use Payment\Config;

$query = new QueryContext();

// 通过交易号查询, 推荐
$data = [
//'order_no' => '2016011402433464',// 商户订单号
'transaction_id' => '4007572001201607098672633287',// 微信订单查询 微信退款单查询
//'trans_no' => '1007570439201601142692427764', // 微信批量转款查询
];

try {
// 微信订单查询
$query->initQuery(Config::WEIXIN, $wxconfig);

// 微信退款订单状态查询
//$query->initQuery(Config::WEIXIN_REFUND, $wxconfig);

// 微信企业付款查询
//$query->initQuery(Config::WEIXIN_TRANS, $wxconfig);

$ret = $query->query($data);

} catch (PayException $e) {
echo $e->errorMessage();exit;
}

订单查询非常简单。对于微信支付订单以及退款订单可以根据微信支付的流水号进行查询。对于微信支付的订单还可根据商户的订单号进行查询。但是强烈建议通过微信自身的流水号进行查询。

对于批量转款查询。需要提供再转款时,生产的转款单号(此单号是由商家自行生产的)。这里我也蛮迷惑,为什么不提供使用微信返回的转款流水号进行查询呢?

接下来对返回值进行解释,以下结构为一个顶层结构

参数 参数名 参数说明 是否必须
is_success 成功标识 请求是否成功,T:成功,F:失败
error 错误提示 只有is_success=F时才返回
response 响应数据 查询成功后返回的数据,一个数组,is_success=T时返回

微信支付订单返回值

支付订单中关于 response 中包含字段的描述

参数 参数名 参数说明 是否必须
amount 交易金额 本次订单总金额,单位为元,最多两位小数
channel 支付渠道 本处取值: wx
order_no 商户网站唯一订单号 商户生成的订单号,必须确保在系统中唯一
buyer_id 用户标识 用户在商户appid下的唯一标识
trade_state 交易状态 支付成功与否,可取值:success not_pay
transaction_id 微信交易号 微信系统中的交易流水号,可用于查询订单状态
time_end 交易付款时间 格式为2016-07-28 16:01:01

微信退款订单

退款有以下两点需要注意

  • 交易时间超过一年的订单无法提交退款;
  • 微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。一笔退款失败后重新提交,要采用原来的退款单号。总退款金额不能超过用户实际支付金额。

由于一笔支付订单,可能存在多笔退单的情况,因此退款记录将返回一个数组

退款订单中关于 response 中包含字段的描述

参数 参数名 参数说明 是否必须
amount 交易金额 本次订单总金额,单位为元,最多两位小数
order_no 商户网站唯一订单号 商户生成的订单号,必须确保在系统中唯一
transaction_id 微信交易号 微信系统中的交易流水号,可用于查询订单状态
refund_data 退款数据 其结构是一个数组,每一个元素包含一个退单信息

refund_data 中包含字段的描述

参数 参数名 参数说明 是否必须
refund_no 商户退款单号 商户退款单号
refund_id 微信退款单号 微信退款单号
refund_channel 退款渠道 ORIGINAL—原路退款 BALANCE—退回到余额
refund_fee 退款金额 退款总金额,单位为元,可以做部分退款
refund_status 退款状态 SUCCESS—退款成功 FAIL—退款失败 PROCESSING—退款处理中 NOTSURE—未确定,需要商户原退款单号重新发起 CHANGE—转入代发
recv_accout 退款入账账户 退款入账账户

转款订单查询结果

'trans_id'  => $data['detail_id'],// 付款单号
'trans_status'  => $data['status'],// 转账状态
'reason'    => $data['reason'],// 失败原因
'buyer_id'   => $data['openid'],
'trans_name'   => $data['transfer_name'],// 收款用户姓名
'trans_time'   => $data['transfer_time'],
'desc'   => $data['desc'],// 付款描述
参数 参数名 参数说明 是否必须
amount 付款金额 付款金额 单位元
order_no 商户单号 商户使用查询API填写的单号的原路返回.
trans_id 付款单号 调用企业付款API时,微信系统内部产生的单号
trans_status 转账状态 SUCCESS:转账成功 FAILED:转账失败 PROCESSING:处理中
reason 失败原因 如果失败则有失败原因
buyer_id 收款用户openid 收款用户openid
trans_name 收款用户姓名 真实姓名,如果是需要实名验证,则会返回
trans_time 转账时间 发起转账的时间 格式:2015-04-21 20:00:00
desc 付款描述 付款时候的描述