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模板引擎SMARTY
Oct 09 PHP
无数据库的详细域名查询程序PHP版(2)
Oct 09 PHP
MYSQL数据库初学者使用指南
Nov 16 PHP
php横向重复区域显示二法
Sep 25 PHP
PHP 反射机制实现动态代理的代码
Oct 22 PHP
一个PHP数组应该有多大的分析
Jul 30 PHP
php中的注释、变量、数组、常量、函数应用介绍
Nov 16 PHP
浅析PHP中的字符串编码转换(自动识别原编码)
Jul 02 PHP
PHP多维数组遍历方法(2种实现方法)
Dec 10 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
php如何比较两个浮点数是否相等详解
Feb 12 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 UTF8 文件的签名问题
2009/10/30 PHP
PHP句法规则详解 入门学习
2011/11/09 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
非常实用的php验证码类
2016/05/15 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
浅谈php://filter的妙用
2019/03/05 PHP
PHP实现简单用户登录界面
2019/10/23 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
json 入门基础教程 推荐
2009/10/31 Javascript
javascript如何判断输入的url是否正确
2014/04/11 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
RequireJS使用注意细节
2016/05/15 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
关于react-router的几种配置方式详解
2017/07/24 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
Python tcp传输代码实例解析
2020/03/18 Python
python3跳出一个循环的实例操作
2020/08/18 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
全面解析HTML5中的标准属性与自定义属性
2016/02/18 HTML / CSS
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
德国旅行、体验和活动的预订平台:Watado
2019/12/04 全球购物
Android面试宝典
2013/08/06 面试题
职业生涯规划怎么写
2013/12/29 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
工程索赔意向书
2014/08/30 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
2015年高中班级工作总结
2015/07/21 职场文书