微信官方又更新了接口。。。

V3版本的微信商家转账到零钱的接口---俗称提现接口

注意事项


一:开通条件:需满足入驻满90天,连续正常交易30天,保持正常健康交易。
二:分为页面发起和api接口操作,均需要手动开启才可。
三:需要设置IP白名单,否则不能发起接口调用。
四:商家转账的户口为商户平台的运营账户,非商户基本账户,注意保证运营账户的余额充足!
五:注意提现额度的变化,超过设置的免密额度,该笔提现会自动发送给超级管理员审核,输入密码确定此笔提现操作。

class Withdraw
{
public $mchid = '你的商户id';
public $appid = '小程序appid';
public $serial_no = '你的证书序列号'; // 证书序列号,不知道怎么获取的看上面的图 public function transfer($openid, $trade_no, $money, $desc='备注说明')
{
$money = (int)($money * 100); $post_data = [
"appid" => $this->appid,//appid
"out_batch_no" => $trade_no,//商家批次单号
"batch_name" => $desc,//批次名称
"batch_remark" => $desc,//批次备注
"total_amount" => $money,// 转账金额单位为“分”
"total_num" => 1, // 转账总笔数
//此处可以多笔提现 组合二维数组放到transfer_detail_list即可 我这里单笔操作,写死了
"transfer_detail_list" => [
[
'out_detail_no' => $trade_no,
'transfer_amount' => $money,
'transfer_remark' => $desc,
'openid' => $openid,
]
]
];
$url = 'https://api.mch.weixin.qq.com/v3/transfer/batches';
//JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE 防止中文被转义
$result = $this->wx_post($url, json_encode($post_data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE)); $result = json_decode($result, true);
if (isset($result['prepay_id'])) {
return $result['prepay_id'];
}
return $result;
} /**post请求
* @param $url
* @param $param
* @return bool|string
*/
private function wx_post($url, $param)
{
$authorization = $this->getV3Sign($url, "POST", $param);
$curl = curl_init();
$headers = [
'Authorization:' . $authorization,
'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);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POSTFIELDS, $param);
curl_setopt($curl, CURLOPT_POST, true);
$res = curl_exec($curl);
curl_close($curl);
return $res;
} /**
* 微信提现V3签名
* @param $url
* @param $http_method
* @param $body
* @return string
*/
private function getV3Sign($url, $http_method, $body)
{
$nonce = strtoupper($this->createNonceStr(32));
$timestamp = time();
$url_parts = parse_url($url);
$canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
$cert_dir = ROOT_PATH.DS."config".DS."payment_cert".DS."wechatpay".DS;
$sslKeyPath = $cert_dir."apiclient_key.pem";
//拼接参数
$message = $http_method . "\n" .
$canonical_url . "\n" .
$timestamp . "\n" .
$nonce . "\n" .
$body . "\n";
$private_key = $this->getPrivateKey($sslKeyPath);
openssl_sign($message, $raw_sign, $private_key, 'sha256WithRSAEncryption');
$sign = base64_encode($raw_sign);
$token = sprintf('WECHATPAY2-SHA256-RSA2048 mchid="%s",nonce_str="%s",timestamp="%s",serial_no="%s",signature="%s"', $this->mchid, $nonce, $timestamp, $this->serial_no, $sign);
return $token;
} /**
* 生成随机32位字符串
* @param $length
* @return string
*/
public function createNonceStr($length = 16) { //生成随机16个字符的字符串
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
} /**
* 获取私钥
* @param $filepath
* @return false|resource
*/
private function getPrivateKey($filepath = '')
{
if (empty($filepath)) {
//私钥位置
$cert_dir = ROOT_PATH.DS."config".DS."payment_cert".DS."wechatpay".DS;
$filepath = $cert_dir."apiclient_key.pem";
}
return openssl_get_privatekey(file_get_contents($filepath));
}
}

文章摘自:https://blog.zmzhz.com/archives/119.html

PHP实现微信提现V3版本2022-5更新接口:商家转账到零钱的更多相关文章

  1. 微信支付更新功能,商户转账到零钱 php版 (2022-10-12更新)

    <?php class WechatMerchantTransfer { /** * @notes 商家转账到零钱 * @param $batch_no //提现订单号 * @param $le ...

  2. 微信支付V3版本的那些事

    最近在接入微信支付这块功能,博客园也有很多博友发表了支付的各种吐槽和解决之道,基于那些经验分享之上,我也来说说我的填坑之路. 1:准备工作,首先去申请注册一个公众号——服务号,然后将微信支付功能开通, ...

  3. php微信支付v3版本签名生成

    前几天需要对接微信支付卡包营销活动需要对接微信新版SDKv3版 签名生成规则,微信的官方文档里面说明的还算可以吧,不过个人觉得不太理想- -.  自己调试的时候调试了半天才找了错误原因. https: ...

  4. 微信支付v3版本NET 图片上传API

    最近在写特约服务商进件的由于微信官方没有DEMO,导致踩了很多坑,特把自己经验分享给大家. 注意几点: 1.上传图片签名不是把所有body内容都进行签名,只需签名计算的请求主体为meta的json串: ...

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

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

  6. 微信APP支付V3版本签名 && APP下单/订单查询接口Python版实现

    问题背景 最近接入微信支付,微信官方并没有提供Python版的服务端SDK,因而只能根据文档手动实现一版,这里记录一下微信支付的整体流程.踩坑过程与最终具体实现. 微信支付APP下单流程 根据微信官方 ...

  7. 到处都是坑的微信支付V3

    业务需要一个在微信上能付款的功能,于是乎想到了最普遍的支付宝,坑爹的是T与A是水火不容啊,默默的还是接微信支付吧,没想到从此掉进了连环坑…… 网上写微信支付接口的还是很多,PHP官方有(鄙视源码作者, ...

  8. RDIFramework.NET平台代码生成器V3.0版本全新发布-更新于20160518(提供下载)

    最新版本请转到:RDIFramework.NET平台代码生成器V3.1版本全新发布-更新于2016-10-08(提供下载) RDIFramework.NET代码生成器V3.0版本修改了针对3.0版本的 ...

  9. 微信支付[v3]

    原文:微信支付[v3] V2升级V3 顺便记录一下 ,文档: http://pay.weixin.qq.com/wiki/doc/api/index.html !!! 支付授权目录与测试人的微信帐号白 ...

  10. ios微信支付 v3

    V2版本和V3版本存在很大的差异. 1. 从成功通过微信支付商户的资料审核返回的邮件开始: 你可以获得这些参数  appid,appSecret,partnerID,    partnerKey(从平 ...

随机推荐

  1. Spring Boot 配置 Swagger(3.0.0 版本)

    添加 Swagger 依赖 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter --> ...

  2. String和StringBuffer与StringBuilder的区别

    1.String.StringBuffer.StringBuilder都不可以被继承,在JDK中它们都被定义为final类. 2.执行速度:StringBuilder > StringBuffe ...

  3. 从FGUI中取一张图片并返回一个Sprite

    从Fgui中的图集中取一个图素,把图素用到场景等非UI的地方. 此操作会动态创建一个Sprite对象,效率不好,不适合大量使用. private static Dictionary<string ...

  4. k8s_service

    service 功能 主要是提供负载均衡和服务自动发现. pod的ip会随着升降级.销毁的操作改变.客户端不能直接访问pod的ip. service资源被用于在被访问的pod对象中添加一个有着固定IP ...

  5. 微信小程序学习记录

    尺寸单位 rpx 常常以iphone6为开发基准,  1px = 2rpx,不同设备的比例是不同的: 小程序生命周期 和vue的生命周期很相似,不过小程序的生命周期和页面.组件的生命周期又又一点不一样 ...

  6. Word09 会计电算化节节高升office真题

    1.课程的讲解之前,先来对题目进行分析,首先需要在考生文件夹下,将Wrod素材.docx文件另存为Word.docx,后续操作均基于此文件,否则不得分. 2.这一步非常的简单,打开下载素材文件,在[文 ...

  7. 记录php遇到的那些坑

    首先按照网上指南搭建php.阿帕奇.数据库环境. 具体放上网站 http://www.cnblogs.com/ypr-09-23/p/10797153.html  这是mysql安装指南 需要注意的是 ...

  8. VAE变分自编码器公式推导

    VAE变分推导依赖数学公式 (1)贝叶斯公式:\(p(z|x) = \frac{p(x|z)p(z)}{p(x)}\) (2)边缘概率公式:\(p(x) =\int{p(x,z)}dz\) (3)KL ...

  9. ES6 新特性 ES6使用 超实用

    ECMAScript 学习 ES5-数组的新方法 forEach forEach方法对数组的每个元素执行一次提供的函数.功能等同于for循环. 应用场景:为一些相同的元素,绑定事件处理器! var a ...

  10. evalJS代替mui.fire

    之前一直用mui.fire调用自定义事件以达到监听目标窗口的目的. 页面为双webview,页面跳转时 mui.openWindow({ url: '../choose/food-choose-con ...