微信商家转账到零钱

 1.发起商家转账

发起商家转账接口。商户可以通过该接口同时向多个用户微信零钱进行转账操作。请求消息中应包含商家批次单号、转账名称、appid、转账总金额、转账总笔数、转账openid、收款用户姓名等信息。注意受理成功将返回批次单号,此时并不代表转账成功,请通过查单接口查询单据的付款状态

请求后返回数据

 

2.通过商家批次单号查询批次单

商家明细单号查单接口。商户可以通过该接口查询转账批次单以及指定状态的转账明细单。返回消息中包含微信批次单号、批次状态、批次类型、转账总金额、转账总笔数、成功金额、失败金额等信息。

返回数据

<?phpnamespace fast;class WxWithdrawal
{protected $mch_id = '';//商户号protected $appid = '';//appID// 证书、密钥地址protected $cert_pem = './../extend/wx/apiclient_cert.pem';protected $key_pem = './../extend/wx/apiclient_key.pem';public function __construct(){
//        parent::__construct();}/*** 商家转账到零钱* @param $arr* @return mixed*/public function tx($arr){$remark = '佣金';// 需要转账的用户信息
//        $arr = [
//            [
//                'order_sn'=>'TEST'.time(),//
//                'total_money'=>$money,
//                'openid'=>$openid'openid'=>'oFMDw6hx3Wuvey_EGjHFw8AtyTNs'
//            ]
//        ];// 转账明细列表$transfer_detail_list = [];foreach($arr as $k=>$v){$transfer_detail_list[$k]['out_detail_no'] = $v['order_sn'];$transfer_detail_list[$k]['transfer_amount'] = (int)bcmul($v['total_money'], 100, 0);;$transfer_detail_list[$k]['transfer_remark'] = $remark;$transfer_detail_list[$k]['openid'] = $v['openid'];}// 参数$out_batch_no = 'TEST'.time(); // 商家批次单号$batch_name = '佣金'; // 该笔批量转账的名称$batch_remark = '佣金'; // 转账说明,最多允许32个字符$total_amount = number_format(array_sum(array_column($arr,'total_money')),2); // 转账总金额单位为“分”。$total_num = count($arr); // 转账总笔数,一个转账批次单最多发起一千笔转账$params = ['appid'=>$this->appid,'out_batch_no'=>$out_batch_no,'batch_name'=>$batch_name,'batch_remark'=>$batch_remark,'total_amount'=>$total_amount * 100,'total_num'=>$total_num,'transfer_detail_list'=>$transfer_detail_list,'notify_url'=>'https://kbadmin.wubukeji.com/pay/wxwith_notify/wxnotify',];// 商家转账没有要求参数排序,可写可不写$params = $this->param_filter($params);   //  过滤参数$params = $this->param_sort($params);    //  参数排序$url = 'https://api.mch.weixin.qq.com/v3/transfer/batches';$params = json_encode($params);$token = $this->getToken($url,time(),$params);$res_xml = $this->https_request($url,$params,$token);$resArr = json_decode($res_xml,true);return $resArr;// 查看请求数据
//        var_dump($resArr);// 业务逻辑...}/**** @param $out_batch_no* @return mixed*/public function query($out_batch_no){$params = ['GET'=>'','offset'=>0,'limit'=>20,'detail_status'=>'ALL'];
//        $out_batch_no='TEST1719306082';$url = 'https://api.mch.weixin.qq.com/v3/transfer/batches/out-batch-no/'.$out_batch_no.'?need_query_detail=true&detail_status=ALL';
//        $params = json_encode($params);$token = $this->getToken($url,time(),'','GET');
//        halt($token );$res_xml = $this->GetHttp($url,$token);$resArr = json_decode($res_xml,true);return $resArr;}// 获取请求头public function getToken($url,$timestamp,$body='',$http_method='POST'){$url_parts   = parse_url($url); //获取请求的绝对URL$nonce       = $this->nonce();  //请求随机串$stream_opts = ["ssl" => ["verify_peer"=>false,"verify_peer_name"=>false,]];$apiclient_cert_path = $this->cert_pem;$apiclient_key_path  = $this->key_pem;$apiclient_cert_arr = openssl_x509_parse(file_get_contents($apiclient_cert_path,false, stream_context_create($stream_opts)));$serial_no          = $apiclient_cert_arr['serialNumberHex'];   // 证书序列号(忽略)$mch_private_key    = file_get_contents($apiclient_key_path,false, stream_context_create($stream_opts));    // 密钥$merchant_id = $this->mch_id;   // 商户id$canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));$message = $http_method."\n".$canonical_url."\n".$timestamp."\n".$nonce."\n".$body."\n";openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');$sign = base64_encode($raw_sign);   // 签名return sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',$merchant_id, $nonce, $timestamp, $serial_no, $sign);   // 微信返回token}// 过滤参数public function param_filter($para){$paraFilter = [];foreach ($para as $key => $val) {if ($val === '' || $val === null) {continue;}if (!is_array($para[$key])) {if (!is_numeric($para[$key])){$para[$key] = is_bool($para[$key]) ? $para[$key] : trim($para[$key]);}}$paraFilter[$key] = $para[$key];}return $paraFilter;}// 参数排序public function param_sort(array $param){ksort($param);reset($param);return $param;}public  function GetHttp($url,$token=''){// 关闭句柄$curl = curl_init(); // 启动一个CURL会话curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_HEADER, 0);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在// 设置Accept头部字段//添加请求头$headers = ['Authorization:WECHATPAY2-SHA256-RSA2048 '.$token,'Accept: application/json','Content-Type: application/json; charset=utf-8','User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',];curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);$tmpInfo = curl_exec($curl); //返回api的json对象if(curl_exec($curl) === false){return 'Curl error: ' . curl_error($curl);}//关闭URL请求curl_close($curl);return $tmpInfo; //返回json对象}/***请求接口*/function https_request($url,$data = null,$token=''){$curl = curl_init();curl_setopt($curl, CURLOPT_URL, (string)$url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);if (!empty($data)){curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $data);}curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//添加请求头$headers = ['Authorization:WECHATPAY2-SHA256-RSA2048 '.$token,'Accept: application/json','Content-Type: application/json; charset=utf-8','User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',];if(!empty($headers)){curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);}$output = curl_exec($curl);curl_close($curl);return $output;}// 随机数public function nonce(int $size = 32){if ($size < 1) {throw new InvalidArgumentException('Size must be a positive integer.');}return implode('', array_map(static function(string $c): string {return '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'[ord($c) % 62];}, str_split(random_bytes($size))));}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM性能监控工具:JMX与VisualVM高级用法

在Java应用的开发和维护过程中&#xff0c;性能监控是一个不可或缺的环节。Java Management Extensions&#xff08;JMX&#xff09;和VisualVM是两个强大的工具&#xff0c;它们可以帮助开发者监控和管理Java应用程序的性能。本文将详细介绍如何使用JMX和VisualVM进行高级性能…

第二十站:Java未来光谱——量子计算与新兴技术的展望(第二篇)

在探讨Java与量子计算的未来融合时&#xff0c;我们首先要理解量子计算的基本概念及其与传统计算的区别。量子计算利用量子力学原理&#xff0c;如量子比特&#xff08;qubit&#xff09;的叠加态和纠缠效应&#xff0c;能在理论上实现远超经典计算机的计算速度&#xff0c;尤其…

缓存、数据库、搜索引擎、消息队列

缓存、数据库、搜索引擎、消息队列这四者都是应用依赖的后端基础服务&#xff0c;他们的性能直接影响到了应用的整体性能&#xff0c;有时候你代码写的再好也许就是因为这些服务导致应用性能无法提升上去。 缓存: 缓存通常被用来解决热点数据的访问问题&#xff0c;是提高数据查…

筑算网基石 创数智未来|锐捷网络闪耀2024 MWC上海

2024年6月26日至28日&#xff0c;全球科技界瞩目的GSMA世界移动大会&#xff08;MWC 上海&#xff09;在上海新国际博览中心&#xff08;SNIEC&#xff09;盛大召开。作为行业领先的网络解决方案提供商&#xff0c;锐捷网络以“筑算网基石 创数智未来”为主题&#xff0c;带来了…

Java程序员学习Go开发Higress的WASM插件

Java程序员学习Go开发Higress的WASM插件 契机 ⚙ 今年天池大赛有higress相关挑战&#xff0c;研究一下。之前没搞过go&#xff0c;踩了很多坑&#xff0c;最主要的就是tinygo打包&#xff0c;多方寻求解决无果&#xff0c;结论是tinygo0.32go1.19无法在macos arm架构下打包。…

SerDes介绍以及原语使用介绍(3)ISERDESE2原语介绍

文章目录 前言一、ISERDESE21.1、ISERDESE2端口信号1.1、ISERDESE2参数 二、BITSLIP-位滑动2.1、BITSLIP作用2.2、BITSLIP使用2.3、BITSLIP示例 前言 上文对OSERDESE进行了详细介绍并且进行了仿真分析&#xff0c;本文开始对ISERDES进行介绍&#xff0c; 一、ISERDESE2 不难…

云计算【第一阶段(20)】磁盘管理与文件系统 服务器硬件及RAID配置实战(三)

一、服务器硬件详解 cpu 主板 内存 硬盘 网卡 电源 raid卡 风扇 远程管理卡 1.1、硬盘尺寸 目前生产环境中主流的两种类型硬盘 3.5寸 和2.5寸硬盘 2.5寸硬盘可以通过使用硬盘托架后适用于3.5寸硬盘的服务器 但是3.5寸没法转换成2.5寸 二、RAID阵列详解 独立硬盘冗余阵…

SQL游标的基本使用方法与示例

SQL游标的基本使用方法与示例 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨SQL游标的基本使用方法及示例。在数据库编程中&#xff0c;游标是一…

高考后的抉择:是选择心仪的专业还是名校?

目录 一、选择专业的利与弊 1. 专业的深度培养 2. 兴趣的持续激发 3. 职业发展的方向 缺点&#xff1a; 二、选择学校的利与弊 1. 学术氛围的熏陶 2. 人脉资源的积累 3. 视野的拓展 缺点&#xff1a; 三、综合考量&#xff1a;专业优先还是学校优先&#xff1f; 1. …

【深度学习】图形模型基础(2):概率机器学习模型与人工智能

1.引言 1.1.背景 当机器需要从经验中汲取知识时&#xff0c;概率建模成为了一个至关重要的工具。它不仅为理解学习机制提供了理论框架&#xff0c;而且在实际应用中&#xff0c;特别是在设计能够从数据中学习的机器时&#xff0c;概率建模展现出了其独特的价值。概率框架的核…

不知道自己的优势擅长和兴趣爱好,我该如何填报高考志愿选专业?

天生我才必有用&#xff0c;每个人都是独立的个体&#xff0c;拥有自己的优势和擅长&#xff0c;当然这个优势和擅长&#xff0c;不是和别人对比&#xff0c;而是和自己对比产生的。 如果说你不知道自己的优势擅长&#xff0c;不知道自己的兴趣和爱好&#xff0c;那只不过是你没…

ES(笔记)

es就是json请求体代替字符串查询 dsl查询和过滤&#xff0c;一个模糊查询&#xff0c;一个非模糊查询 must&#xff0c;should 做模糊查询的&#xff0c;里面都是match&#xff0c;根据查询内容进行匹配&#xff0c;filter过滤&#xff0c;term词元查询&#xff0c;就是等值查…

html引入别的html文件(类似于框架的组件使用,只适合静态的,不适合组件传值)

接手了一个官网项目的开发,要求使用html原生去写,就不免有些头疼,像数据的响应式,组件化开发等这些框架带来的好处都用不了了,但是我需要使用使用组件以便于在各个页面引入开发,例如公共的导航栏,页脚等,这里给个案例可以使用html实现这种类似于组件的功能,这里不能组件互相传值…

cuda编码入门学习笔记

在日常深度学习和科学计算中,使用图形处理器(GPU)进行加速是一个常见的做法。CUDA (Compute Unified Device Architecture) 是英伟达公司提供的用于GPU编程的平台和编程模型。同时它是一种并行计算模型,允许开发人员使用标准C语言对GPU进行编程。CUDA的核心思想是将任务分解为…

The difference between Manhattan distance and Cosine Distance

题意&#xff1a;为什么即使返回了相同的文本块&#xff0c;曼哈顿距离&#xff08;Manhattan Distance&#xff09;和余弦距离&#xff08;Cosine Distance&#xff09;之间还是存在差异&#xff1f; 问题背景&#xff1a; I am using the qdrant DB and client for embeddin…

API-M端事件

学习目标&#xff1a; 掌握M端事件 学习内容&#xff1a; M端事件 M端事件&#xff1a; 移动端也有自己独特的地方。 比如触屏事件 touch&#xff08;也称触摸事件&#xff09;&#xff0c;Android和IOS都有。触屏事件 touch&#xff08;也称触摸事件&#xff09;&#xff0…

排序【插入排序】

排序的概念 排序&#xff1a;所谓排序&#xff0c;就是将一份数据&#xff0c;通过某个或者某些关键字的大小&#xff0c;进行递增或者递减排序的操作。 稳定性&#xff1a;假定在待排序的数据组中&#xff0c;存在多个相同的元素&#xff0c;若经过排序&#xff0c;这些数据…

从零开始学习Linux(11)----进程间通信(管道)

1.引言 两个进程之间&#xff0c;可以进行数据的直接传递吗&#xff1f;不能&#xff01;进程具有独立性 1.为什么&#xff1f;&#xff1f; 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源通知事件&#xff1a…

决定佛蒙特州版图的关键历史事件:

​决定佛蒙特州版图的关键历史事件: 1. 早期探险与命名&#xff1a; - 1609年&#xff0c;法国探险家萨缪尔德尚普兰&#xff08;Samuel de Champlain&#xff09;到达了现在的佛蒙特州区域&#xff0c;并探索了尚普兰湖&#xff08;Lake Champlain&#xff09;。他将周围的山…

深入探索Scala的高级类型系统:特性与应用

Scala是一种静态类型编程语言&#xff0c;以其强大的类型系统而著称。Scala的类型系统不仅提供了类型安全&#xff0c;还支持高级编程技术&#xff0c;如模式匹配、高阶函数和泛型编程。本文将深入探讨Scala类型系统的高级特性&#xff0c;包括它们的工作原理、如何使用以及在实…