一、情景简述

之前做了微信付款到企业银行卡的功能,但是,给客户打款后,次日才能到账,为及时进行反馈,于是又做了"查询给企业付款是否到账"的功能。这块,我直接写了一个类,进行处理,下面,就是整个类的代码!微信文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_3

二、相关注意

1、这里涉及到一些敏感配置的,都在配置文件里,还有,"查询给企业付款是否到账"需要用到证书,这个需要提前准备,切记!
2、partner_trade_no参数,是在打款给客户银行卡账号时生成的一串字符,你可以自己存储,也可以从微信端返回的结果数据中获取。
3、查询是否到账,到账的情况是return_code、result_code、err_code全为true时,pay_succ_time不为空,表示已到账!

三、核心代码

<?php  defined('BASEPATH') OR exit('No direct script access allowed');/*** 查询给企业付款是否到账 - Service** @desc 查看打款到银行卡的钱是否到账,如果,到账,更新distribute_log表 is_received 为 1* @author NangongYi* @time 2019/09/28 01:38:59**/class Check_account_service extends FIT_Service
{/*** 字符池*/const STING_POOL = '23456789ABCDEFGHJKLMNPQRSTUVWXYabcdefghijkmnpqrstuvwxy';/*** 字符长度*/const STR_LENGTH = 18;/*** 构造方法 - 继承父类*/public function __construct (){parent::__construct();}/*** 微信 API - 配置参数*/private function get_api_config_param(){$this->load->config('dict/dict_distribute.php');return $this->config->item('API_CONFIG');}/*** 查看订单分账是否到账* @param string $partner_trade_no : 分账时生成的唯一码* @return bool*/private function check_order_distribute_is_received($partner_trade_no){// 配置参数$api_config = $this->get_api_config_param();// 随机字符串$nonce_str = $this->product_random_str();// 准备数据$data = ['mch_id'=>$api_config['mch_id'], 'partner_trade_no'=>$partner_trade_no, 'nonce_str'=>$nonce_str];// 签名$sign = $this->product_sign_str($data);// xml数据整合$xmlData = $this->xml($data, $sign);// 数据请求$result = $this->curl_post_we_chat($api_config['query_bank'], $xmlData, true);// 结果处理if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS' && $result['err_code'] == 'SUCCESS'){$success = ['is_received'=>1, 'received_time'=>$result['pay_succ_time']]; // 成功,返回到账时间,状态为 1return !empty($result['pay_succ_time']) ? $success : false;}else{$error = ['is_received'=>-1, 'rec_error_reason'=>$result['reason']]; // 失败,返回失败原因,状态为 -1,异常return $error;}}/*** xml数据 - 整合* @param array $data : 微信配置参数* @param string $sign : 生成签名* @return string*/private function xml($data, $sign){$xmlData="<xml><mch_id>".$data['mch_id']."</mch_id><nonce_str>".$data['nonce_str']."</nonce_str><partner_trade_no>".$data['partner_trade_no']."</partner_trade_no><sign>".$sign."</sign></xml>";return $xmlData;}/*** 遍历所有的分账日志表中未付款记录,并进行标记* @desc 判断,如果到账,更新 distribute_log 表 is_received = 1*/public function process_no_received_orders(){$this->load->dao("order_dao");$no_received_orders = $this->order_dao->get_no_received_orders();if(!$no_received_orders){return [];}$no_received_orders = $this->process_partner_trade_no($no_received_orders);$w_orderids = array_column($no_received_orders, null, 'partner_trade_no');$flag = 1;foreach ($w_orderids as $key=>$val) {// 过滤掉微信订单id为空的数据if(empty($val['partner_trade_no'])) continue;// 查看分账是否到账$res = $this->check_order_distribute_is_received($key);if(!$res) continue;// 如果到账,更改分账订单的状态为已分账 1$up_log = $this->order_dao->update_distribute_log_received($val['orderid'], $res);if(!$up_log) $flag --;}return $flag;}/*** 处理返回数据,返回 partner_trade_no* @param array $data : 订单数据* @return array*/private function process_partner_trade_no($data){foreach ($data as $key=>$val) {$data[$key]['partner_trade_no'] = $this->get_partner_trade_no($val['plg_log_info']);}return $data;}/*** 从json对象字符串中,返回 partner_trade_no* @param string $string : json对象* @return string*/private function get_partner_trade_no($string){$result = json_decode(substr($string,strrpos($string, '=')+1),true);return $result['partner_trade_no'];}/*** cURL方式POST数据到微信* @param string $url : 请求地址* @param array $data : 发送数据* @return mixed*/private function curl_post_we_chat($url, $data, $ssl = false){$api_config = $this->get_api_config_param();$ch = curl_init ();curl_setopt ( $ch, CURLOPT_URL, $url );curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, "POST" );curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );if($ssl) {curl_setopt ( $ch,CURLOPT_SSLCERT,$api_config['sslcert']);curl_setopt ( $ch,CURLOPT_SSLKEY,$api_config['sslkey']);}curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 );curl_setopt ( $ch, CURLOPT_AUTOREFERER, 1 );curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );$result = curl_exec($ch);if (curl_errno($ch)) {return 'Errno: '.curl_error($ch);}curl_close($ch);return $this->xmlToArray($result);}/*** 生成签名* @param array $paramArray : 微信请求参数* @param bool $isencode* @return mixed*/private function product_sign_str($paramArray, $isencode=false){$api_config = $this->get_api_config_param();$paramStr = '';ksort($paramArray);$i = 0;foreach ($paramArray as $key => $value){if ($key == 'Signature'){continue;}if ($i == 0){$paramStr .= '';}else{$paramStr .= '&';}$paramStr .= $key . '=' . ($isencode?urlencode($value):$value);++$i;}$stringSignTemp=$paramStr."&key=".$api_config['key'];$sign=strtoupper(md5($stringSignTemp));return $sign;}/*** 生成的随机字符串(小于32位)* @return string $randStr : 返回32位的字符*/private function product_random_str(){$string = self::STING_POOL;$length = self::STR_LENGTH;$randStr = '';for($i = 0; $i < $length; $i++){$randStr .= $string[mt_rand(0, strlen($string)-1)];}return $randStr;}/*** 将xml转换成数组* @params xml $xml : xml数据* return array $data : 返回数组*/private function xmlToArray($xml){libxml_disable_entity_loader(true);//禁止引用外部xml实体$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);return json_decode(json_encode($xmlstring),true);}
}

四、写在最后

一开始看文档的时候,感觉微信的文档,写的还是不那么尽人意,所以,读了好几遍,才有所理解,其关键点,在于“签名的生成”,这里需要注意,另外,通过Curl函数传输数据的时候,会用到证书,这里文档有提到,但还是在这个地方,纠结了好久!总之,涉及到支付这块的,微信都比较严谨,需要细心理解、处理!

PHP之 微信支付 查询企业付款银行卡API 或 查询给企业付款是否到账 功能业务处理相关推荐

  1. Java中的微信支付(2):API V3 微信平台证书的获取与刷新

    1. 前言 在Java 中的微信支付(1):API V3 版本签名详解一文中胖哥讲解了微信支付 V3 版本 API 的签名,当我方(你自己的服务器)请求微信支付服务器时需要根据我方的API 证书对参数 ...

  2. 微信支付踩坑记录 (java后端四:企业付款到零钱)

    普通商户模式微信支付之企业付款到零钱: 前言: 为啥会用到企业付款到零钱呢,如果在自己的系统里面有涉及到用户提现,活动奖励等功能,则就可以使用到企业付款到零钱,我在这里将其称之为转账,但是使用企业付款 ...

  3. h5 实现微信支付以及易宝银行卡支付

    一.微信支付 // 1.判断是否是微信浏览器(即用户是否是在微信中点开链接,微信中点开支付链接默认是微信浏览器) isWeiXinHandle(){var ua = window.navigator. ...

  4. 微信支付 商家转账到零钱 Api 过程

    企业付款到零钱,已经限额500以内,完全不够用 商家转账到零钱,限额20000单笔,需要申请要按不通过原因修改多试几次 准备前提: 1,平台证书,商家证书,一共2个: 2,设置APIv3密钥: 正文: ...

  5. Java中的微信支付(1):API V3版本签名详解

    1. 前言 最近在折腾微信支付,证书还是比较烦人的,所以有必要分享一些经验,减少你在开发微信支付时的踩坑.目前微信支付的 API 已经发展到V3版本,采用了流行的 Restful 风格. 微信支付V2 ...

  6. 微信支付服务器验证的java_Java中的微信支付(3):API V3对微信服务器响应进行签名验证...

    1. 前言 牢记一句话:公钥加密,私钥解密:私钥加签,公钥验签. 微信支付V3版本前两篇分别讲了如何对请求做签名和如何获取并刷新微信平台公钥,本篇将继续展开如何对微信支付响应结果的验签. 2. 为什么 ...

  7. 微信支付将推双面屏;库克谈收购英特尔基带业务;Chrome 76 稳定版发布 | 极客头条...

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

  8. ansible 建 kubernetes 证书签名请求_Java中的微信支付(2):API V3 微信平台证书的获取与刷新...

    1. 前言 在Java 中的微信支付(1):API V3 版本签名详解一文中胖哥讲解了微信支付 V3 版本 API 的签名,当我方(你自己的服务器)请求微信支付服务器时需要根据我方的API 证书对参数 ...

  9. java读取微信证书_Java中的微信支付(2):API V3 微信平台证书的获取与刷新

    1. 前言 在Java中的微信支付(1):API V3版本签名详解一文中胖哥讲解了微信支付V3版本API的签名,当我方(你自己的服务器)请求微信支付服务器时需要根据我方的API证书对参数进行加签,微信 ...

最新文章

  1. 抓取了1400家科技公司的招聘信息,我发现数据工程师比数据科学家更有市场
  2. 关于Pulsar与Kafka
  3. 【hdu5285】wyh2000 and pupil
  4. Spring学习笔记--spring+mybatis集成
  5. 1万属性,100亿数据,每秒10万吞吐,架构如何设计?
  6. Java 洛谷 P1482 Cantor表(升级版)
  7. OpenCV在VS2005下的配置
  8. 分布式和微服务是什么?二者的区别又是什么?
  9. SpringBoot2.0基础案例分类总结,后续更新计划说明
  10. 平安银行软件测试项目,中国平安银行软件测试笔试试题
  11. UVa 11991 - Easy Problem from Rujia Liu?
  12. itunes显示无法更新服务器失败怎么办啊,更新iTunes出现错误解决办法介绍
  13. 移动端 设计师设计APP UI常用软件总结
  14. 电脑时间调到2099年,会发生什么
  15. Oracl中PL/SQL编程(10级学员 张帅鹏课堂总结)
  16. 用数学方法解约瑟夫环
  17. C++Qt开发-错误退出,退出代码2
  18. SQLSERVER储存过程批量添加10万条数据
  19. 如何组装、搭建一台永久运行的个人服务器?
  20. YOLOv4论文总结

热门文章

  1. Objective-C中的instancetype和id区别
  2. 向SQL Server数据库中插入日期型数据
  3. Excel在数字单元格后面怎么添加统一的内容(数字或其他内容)
  4. windows11 文档背景设置护眼色
  5. Ubuntu如何设置显示器不熄屏
  6. Linux远程控制音乐播放,总结一下linux远程控制方法
  7. 学生认证免费领取——使用阿里云服务器的Ubuntu版本,并进行图形化
  8. C++调用Python(混合编程)函数整理总结
  9. 一大法器-----正则表达式
  10. 零基础编程教学实录-000 思考要与不要