PHP实现微信对账单处理


Posted in PHP onOctober 01, 2018

最近要做支付对账,即检查第三方支付与数据库中账单是否一一对应,涉及到微信对账单的处理,成功时,微信账单接口返回数据以文本表格的方式返回,第一行为表头,后面各行为对应的字段内容,字段内容跟查询订单或退款结果一致,具体字段说明可查阅相应接口。

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 个字段为账单的汇总信息。因此通过循环就可以遍历整个账单。

大家有更好的解决方案,欢迎把代码贴出来一起交流!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
十天学会php之第四天
Oct 09 PHP
一个php作的文本留言本的例子(一)
Oct 09 PHP
杏林同学录(六)
Oct 09 PHP
NT IIS下用ODBC连接数据库
Oct 09 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
Nov 10 PHP
phpize的深入理解
Jun 03 PHP
php基于单例模式封装mysql类完整实例
Oct 18 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 PHP
PHP用swoole+websocket和redis实现web一对一聊天
Nov 05 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
Jan 26 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 PHP
PHP中关于php.ini参数优化详解
Feb 28 PHP
php提取微信账单的有效信息
Oct 01 #PHP
YII分模块加载路由的实现方法
Oct 01 #PHP
php实现微信公众号企业转账功能
Oct 01 #PHP
详解json在php中的应用
Sep 30 #PHP
php实现数组重复数字统计实例
Sep 30 #PHP
PHP APP微信提现接口代码
Sep 30 #PHP
PHP实现微信提现功能
Sep 30 #PHP
You might like
PHP array_multisort()函数的使用札记
2011/07/03 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
php接口隔离原则实例分析
2019/11/11 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
js+css在交互上的应用
2010/07/18 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
js中键盘事件实例简析
2015/01/10 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
js实现右键菜单功能
2016/11/28 Javascript
深入理解选择框脚本[推荐]
2016/12/13 Javascript
原生js检测页面加载完毕的实例
2018/09/11 Javascript
原生JS实现轮播图效果
2018/10/12 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
[01:15:12]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#4Newbee VS CDEC
2016/03/03 DOTA
python多进程操作实例
2014/11/21 Python
Python基础入门之seed()方法的使用
2015/05/15 Python
简单实现python画圆功能
2018/01/25 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
对python中Json与object转化的方法详解
2018/12/31 Python
python getpass实现密文实例详解
2019/09/24 Python
Python 给下载文件显示进度条和下载时间的实现
2020/04/02 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
VSCODE配置Markdown及Markdown基础语法详解
2021/01/19 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
美国著名的家居用品购物网站:Bed Bath & Beyond
2018/01/05 全球购物
小学国庆节活动方案
2014/02/11 职场文书
个人公开承诺书
2014/03/28 职场文书
就业协议书怎么填
2014/04/11 职场文书
节能减排倡议书
2014/04/15 职场文书
幼儿园亲子活动总结
2014/04/26 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server