微信并未提供一个统一的查询接口。对应每种查询均需要不同的api。为了便于大家在项目中使用,忽略细节。对以上三种进行了封装。通过工厂的方式降低调用成本。
$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 | 付款描述 | 付款时候的描述 | 是 |