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 相关文章推荐
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
Jan 29 PHP
PHP生成Gif图片验证码
Oct 27 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
May 10 PHP
php上传图片之时间戳命名(保存路径)
Aug 15 PHP
phplot生成图片类用法详解
Jan 06 PHP
php内存缓存实现方法
Jan 24 PHP
php获取本周开始日期和结束日期的方法
Mar 09 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
Jul 09 PHP
php实现可运算的验证码
Nov 10 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
Nov 15 PHP
php中namespace及use用法分析
Dec 06 PHP
浅谈PHP的反射机制
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
swfupload 多文件上传实现代码
2008/08/27 PHP
php模块memcache和memcached区别分析
2011/06/14 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
WEB 前端开发中防治重复提交的实现方法
2016/10/26 Javascript
JS中把函数作为另一函数的参数传递方法(总结)
2017/06/28 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
javascript实现小型区块链功能
2019/04/03 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
2019/05/07 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
python利用hook技术破解https的实例代码
2013/03/25 Python
python基础教程之基本内置数据类型介绍
2014/02/20 Python
Python常用的文件及文件路径、目录操作方法汇总介绍
2015/05/21 Python
python实现RSA加密(解密)算法
2016/02/17 Python
Python在线运行代码助手
2016/07/15 Python
python方向键控制上下左右代码
2018/01/20 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
python3.8动态人脸识别的实现示例
2020/09/21 Python
利用css3-animation实现逐帧动画效果
2016/03/10 HTML / CSS
医学专业毕业生推荐信
2013/11/14 职场文书
中文专业毕业生自荐信
2014/05/24 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
2014年接待工作总结
2014/11/26 职场文书
入党函调证明材料
2014/12/24 职场文书
投资公司董事长岗位职责
2015/04/16 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
vue实现简单数据双向绑定
2021/04/28 Vue.js
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android