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中利用XML技术构造远程服务(下)
Oct 09 PHP
如何使用动态共享对象的模式来安装PHP
Oct 09 PHP
ie6 动态缩略图不显示的原因
Jun 21 PHP
用PHP查询搜索引擎排名位置的代码
Jan 05 PHP
php 无法载入mysql扩展
Mar 12 PHP
php中使用cookie来保存用户登录信息的实现代码
Mar 08 PHP
php数字游戏 计算24算法
Jun 10 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
Jun 17 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
Aug 10 PHP
PHP采集类Snoopy抓取图片实例
Jun 19 PHP
CodeIgniter配置之config.php用法实例分析
Jan 19 PHP
Yii2框架中一些折磨人的坑
Dec 15 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
UCenter Home二次开发指南
2009/05/28 PHP
php实现的Cookies操作类实例
2014/09/24 PHP
PHP.ini安全配置检测工具pcc简单介绍
2015/07/02 PHP
Redis构建分布式锁
2017/03/28 PHP
PHP levenshtein()函数用法讲解
2019/03/08 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
2019/09/30 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
转一个日期输入控件,支持FF
2007/04/27 Javascript
JavaScript面向对象编程
2008/03/02 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
iframe子页面与父页面在同域或不同域下的js通信
2014/05/07 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
浅谈javascript面向对象程序设计
2015/01/21 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
JS逻辑运算符短路操作实例分析
2018/07/09 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
Python实现读取并保存文件的类
2017/05/11 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
详解python中init方法和随机数方法
2019/03/13 Python
Django 开发环境与生产环境的区分详解
2019/07/26 Python
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
2019/10/27 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
Tensorflow中的降维函数tf.reduce_*使用总结
2020/04/20 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
2020/05/22 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
2020/11/24 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
Bibloo匈牙利:女装、男装、童装及鞋子和配饰
2019/04/14 全球购物
毕业生个人求职自荐信
2014/02/26 职场文书
阅兵口号
2014/06/19 职场文书
2014年乡镇团委工作总结
2014/12/18 职场文书
高中教师个人工作总结
2015/02/10 职场文书
父母教会我观后感
2015/06/17 职场文书
Python OpenCV超详细讲解读取图像视频和网络摄像头
2022/04/02 Python