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 字符截取 解决中文的截取问题,不用mb系列
Sep 29 PHP
php中explode与split的区别介绍
Oct 03 PHP
php 伪静态之IIS篇
Jun 02 PHP
ThinkPHP CURD方法之field方法详解
Jun 18 PHP
详解PHP+AJAX无刷新分页实现方法
Nov 03 PHP
php常用图片处理类
Mar 16 PHP
PHP设计模式之工厂方法设计模式实例分析
Apr 25 PHP
PHP PDOStatement::bindParam讲解
Jan 30 PHP
laravel 判断查询数据库返回值的例子
Oct 11 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
Oct 18 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 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 常用算法和时间复杂度
2013/07/01 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
2013/04/07 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
2013/07/10 Javascript
jquery实现带复选框的表格行选中删除时高亮显示
2013/08/01 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
解决JS中乘法的浮点错误的方法
2014/01/03 Javascript
jQuery.prop() 使用详解
2015/07/19 Javascript
js操作数组函数实例小结
2015/12/10 Javascript
js实现获取鼠标当前的位置
2016/12/14 Javascript
微信小程序 出现47001 data format error原因解决办法
2017/03/10 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
vue日历/日程提醒/html5本地缓存功能
2019/09/02 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
[48:00]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第二场 11.04
2020/11/04 DOTA
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
Currentbody西班牙:美容仪专家
2019/09/28 全球购物
请说出你所知道的线程同步的方法
2013/04/19 面试题
高中生自我评价个人范文
2013/11/09 职场文书
学校清明节活动总结
2014/07/04 职场文书
先进基层党组织材料
2014/12/25 职场文书
JAVA API 实用类 String详解
2021/10/05 Java/Android
Spring事务管理下synchronized锁失效问题的解决方法
2022/03/31 Java/Android