最近要做支付對賬,即檢查第三方支付與數據庫中賬單是否一一對應,涉及到微信對賬單的處理,成功時,微信賬單接口返回數據以文本表格的方式返回,第一行為表頭,后面各行為對應的字段內容,字段內容跟查詢訂單或退款結果一致,具體字段說明可查閱相應接口。
Ps:至於如何調用微信接口下載對賬單,在微信的官方SDK包中就有現成的方法,直接調用即可。注意對賬單接口一次只能查詢一天的數據。代碼大致如下:
1 // 引入微信sdk文件 2 require_once APP_DIR . '/ome/lib/wxpay/lib/WxPay.Api.php'; 3 require_once APP_DIR . '/ome/lib/wxpay/log.php'; 4 5 // 實列化下載對賬單對象 6 $input = new WxPayDownloadBill(); 7 // 對賬單日期 8 $input->SetBill_date(date("Ymd", strtotime("-1 day"))); 9 // 對賬單類型 10 $input->SetBill_type('ALL'); 11 // 獲取賬單信息 12 $downloadBillResult = WxPayApi::downloadBill($input);
打印$downloadBillResult就會發現他是一個數據文本(string),本文程序需要實現的功能就是從這個字符串從提取每一筆訂單中的有效信息,參考代碼如下:
1 /** 2 * 微信對賬單數據處理 3 * @param $response 對賬單數據 4 * @return array 返回結果 5 */ 6 public function deal_WeChat_response($response){ 7 $result = array(); 8 $response = str_replace(","," ",$response); 9 $response = explode(PHP_EOL, $response); 10 11 foreach ($response as $key=>$val){ 12 if(strpos($val, '`') !== false){ 13 $data = explode('`', $val); 14 array_shift($data); // 刪除第一個元素並下標從0開始 15 if(count($data) == 24){ // 處理賬單數據 16 $result['bill'][] = array( 17 'pay_time' => $data[0], // 支付時間 18 'APP_ID' => $data[1], // app_id 19 'MCH_ID' => $data[2], // 商戶id 20 'IMEI' => $data[4], // 設備號 21 'order_sn_wx' => $data[5], // 微信訂單號 22 'order_sn_sh' => $data[6], // 商戶訂單號 23 'user_tag' => $data[7], // 用戶標識 24 'pay_type' => $data[8], // 交易類型 25 'pay_status' => $data[9], // 交易狀態 26 'bank' => $data[10], // 付款銀行 27 'money_type' => $data[11], // 貨幣種類 28 'total_amount' => $data[12], // 總金額 29 'coupon_amount' => $data[13], // 代金券或立減優惠金額 30 'refund_number_wx' => $data[14], // 微信退款單號 31 'refund_number_sh' => $data[15], // 商戶退款單號 32 'refund_amount' => $data[16], // 退款金額 33 'coupon_refund_amount' => $data[17], // 代金券或立減優惠退款金額 34 'refund_type' => $data[18], // 退款類型 35 'refund_status' => $data[19], // 退款狀態 36 'goods_name' => $data[20], // 商品名稱 37 'service_charge' => $data[22], // 手續費 38 'rate' => $data[23], // 費率 39 ); 40 } 41 if(count($data) == 5){ // 統計數據 42 $result['summary'] = array( 43 'order_num' => $data[0], // 總交易單數 44 'turnover' => $data[1], // 總交易額 45 'refund_turnover' => $data[2], // 總退款金額 46 'coupon_turnover' => $data[3], // 總代金券或立減優惠退款金額 47 'rate_turnover' => $data[4], // 手續費總金額 48 ); 49 } 50 } 51 } 52 return $result; 53 }
返回的數據分為2部分,bill節點下存放的是具體流水數據,summary節點下存放的是統計數據
主要的思路是微信賬單返回的結果格式是固定的,可以用 '`',換行符(PHP_EOL)實現字符串的分割,然后每 24 個 字段為一個訂單的描述信息,最后 6 個字段為賬單的匯總信息。因此通過循環就可以遍歷整個賬單。
大家有更好的解決方案,歡迎把代碼貼出來一起交流!