最近要做支付对账,即检查第三方支付与数据库中账单是否一一对应,涉及到微信对账单的处理,成功时,微信账单接口返回数据以文本表格的方式返回,第一行为表头,后面各行为对应的字段内容,字段内容跟查询订单或退款结果一致,具体字段说明可查阅相应接口。
Ps:至于如何调用微信接口下载对账单,在微信的官方SDK包中就有现成的方法,直接调用即可。注意对账单接口一次只能查询一天的数据。代码大致如下:
// 引入微信sdk文件require_once APP_DIR . '/ome/lib/wxpay/lib/WxPay.Api.php';require_once APP_DIR . '/ome/lib/wxpay/log.php';// 实列化下载对账单对象$input = new WxPayDownloadBill();// 对账单日期$input->SetBill_date(date("Ymd", strtotime("-1 day")));// 对账单类型$input->SetBill_type('ALL');// 获取账单信息$downloadBillResult = WxPayApi::downloadBill($input);
打印$downloadBillResult就会发现他是一个数据文本(string),本文程序需要实现的功能就是从这个字符串从提取每一笔订单中的有效信息,参考代码如下:
/*** 微信对账单数据处理* @param $response 对账单数据* @return array 返回结果*/public function deal_WeChat_response($response){$result = array();$response = str_replace(","," ",$response);$response = explode(PHP_EOL, $response);foreach ($response as $key=>$val){if(strpos($val, '`') !== false){$data = explode('`', $val);array_shift($data); // 删除第一个元素并下标从0开始if(count($data) == 24){ // 处理账单数据$result['bill'][] = array('pay_time' => $data[0], // 支付时间'APP_ID'=> $data[1], // app_id'MCH_ID'=> $data[2], // 商户id'IMEI' => $data[4], // 设备号'order_sn_wx'=> $data[5], // 微信订单号'order_sn_sh'=> $data[6], // 商户订单号'user_tag' => $data[7], // 用户标识'pay_type' => $data[8], // 交易类型'pay_status' => $data[9], // 交易状态'bank' => $data[10], // 付款银行'money_type' => $data[11], // 货币种类'total_amount' => $data[12], // 总金额'coupon_amount' => $data[13], // 代金券或立减优惠金额'refund_number_wx'=> $data[14], // 微信退款单号'refund_number_sh'=> $data[15], // 商户退款单号'refund_amount' => $data[16], // 退款金额'coupon_refund_amount' => $data[17], // 代金券或立减优惠退款金额'refund_type'=> $data[18], // 退款类型'refund_status' => $data[19], // 退款状态'goods_name' => $data[20], // 商品名称'service_charge' => $data[22], // 手续费'rate' => $data[23], // 费率);}if(count($data) == 5){ // 统计数据$result['summary'] = array('order_num' => $data[0], // 总交易单数'turnover' => $data[1], // 总交易额'refund_turnover' => $data[2], // 总退款金额'coupon_turnover' => $data[3], // 总代金券或立减优惠退款金额'rate_turnover' => $data[4], // 手续费总金额);}}}return $result;}
返回的数据分为2部分,bill节点下存放的是具体流水数据,summary节点下存放的是统计数据
主要的思路是微信账单返回的结果格式是固定的,可以用 '`',换行符(PHP_EOL)实现字符串的分割,然后每 24 个 字段为一个订单的描述信息,最后 6 个字段为账单的汇总信息。因此通过循环就可以遍历整个账单。
大家有更好的解决方案,欢迎把代码贴出来一起交流!