PHP实现微信提现(企业付款到零钱)
怎么开通企业付款到零钱?
有的商户号的产品中心是没有这个功能的,不过,该功能的pid(product id)是5,只要随便进去某一个产品,在地址栏把pid改为5。
即可进入该功能页面,进行开通,不过要满足条件。
用户提现代码:
//用户微信提现
private function withdrawals_weixin($id){
$falg = M('withdrawals')->where(['id'=>$id])->find();
$openid = M('users')->where('user_id', $falg['user_id'])->value('openid');
$data['openid'] = $openid;
$data['pay_code'] = $falg['id'].$falg['user_id'];
$data['desc'] = '提现ID'.$falg['id'];
if($falg['taxfee'] >= $falg['money']){
return array('status'=>1, 'msg'=>"提现额度必须大于手续费!" );
}else{
$data['money'] = bcsub($falg['money'], $falg['taxfee'], 2);
}
include_once PLUGIN_PATH . "payment/weixin/weixin.class.php";
$weixin_obj = new \weixin();
$result = $weixin_obj->transfer($data); return $result;
}
其中pay_code在商户号的提现功能是唯一的,所以为了防重放攻击,这个值千万不能用随机数,最好用ID,具有提现记录唯一。
提现逻辑代码:
// 微信提现转账
function transfer($data){ header("Content-type: text/html; charset=utf-8");
//CA证书及支付信息
$wxchat['appid'] = WxPayConfig::$appid;
$wxchat['mchid'] = WxPayConfig::$mchid; $wxchat['api_cert'] = PLUGIN_PATH.'/payment/weixin/cert/apiclient_cert.pem';
$wxchat['api_key'] = PLUGIN_PATH.'/payment/weixin/cert/apiclient_key.pem'; // $wxchat['api_ca'] = '/plugins/payment/weixin/cert/rootca.pem';
$webdata = array(
'mch_appid' => $wxchat['appid'],
'mchid' => $wxchat['mchid'],
'nonce_str' => md5(time()),
//'device_info' => '1000',
'partner_trade_no'=> $data['pay_code'], //商户订单号,需要唯一
'openid' => $data['openid'],//转账用户的openid
'check_name'=> 'NO_CHECK', //OPTION_CHECK不强制校验真实姓名, FORCE_CHECK:强制 NO_CHECK:
//'re_user_name' => 'jorsh', //收款人用户姓名
'amount' => $data['money'] * 100, //付款金额单位为分
'desc' => $data['desc'],
'spbill_create_ip' => request()->ip(),
); foreach ($webdata as $k => $v) {
$tarr[] =$k.'='.$v;
} sort($tarr);
$sign = implode($tarr, '&');
$sign .= '&key='.WxPayConfig::$key;
$webdata['sign']=strtoupper(md5($sign)); $wget = $this->array2xml($webdata); $pay_url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; $res = $this->http_post($pay_url, $wget, $wxchat); if(!$res){
return array('status'=>1, 'msg'=>"Can't connect the server" );
}
$content = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA); if(strval($content->return_code) == 'FAIL'){
return array('status'=>1, 'msg'=>strval($content->return_msg));
}
if(strval($content->result_code) == 'FAIL'){
return array('status'=>1, 'msg'=>strval($content->err_code),':'.strval($content->err_code_des));
} $rdata = array(
'mch_appid' => strval($content->mch_appid),
'mchid' => strval($content->mchid),
'device_info' => strval($content->device_info),
'nonce_str' => strval($content->nonce_str),
'result_code' => strval($content->result_code),
'partner_trade_no' => strval($content->partner_trade_no),
'payment_no' => strval($content->payment_no),
'payment_time' => strval($content->payment_time),
);
return $rdata; }
其中 PLUGIN_PATH 是一个常量
 define('PLUGIN_PATH', __DIR__ . '/plugins/');
  定义插件目录
 /**
 * 将一个数组转换为 XML 结构的字符串
 * @param array $arr 要转换的数组
 * @param int $level 节点层级, 1 为 Root.
 * @return string XML 结构的字符串
 */
 function array2xml($arr, $level = 1) {
 $s = $level == 1 ? "<xml>" : '';
 foreach($arr as $tagname => $value) {
 if (is_numeric($tagname)) {
 $tagname = $value['TagName'];
 unset($value['TagName']);
 }
 if(!is_array($value)) {
 $s .= "<{$tagname}>".(!is_numeric($value) ? '<![CDATA[' : '').$value.(!is_numeric($value) ? ']]>' : '')."</{$tagname}>";
 } else {
 $s .= "<{$tagname}>" . $this->array2xml($value, $level + 1)."</{$tagname}>";
 }
 }
 $s = preg_replace("/([\x01-\x08\x0b-\x0c\x0e-\x1f])+/", ' ', $s);
 return $level == 1 ? $s."</xml>" : $s;
 }
 function http_post($url, $param, $wxchat) {
 $oCurl = curl_init();
 if (stripos($url, "https://") !== FALSE) {
 curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
 }
 if (is_string($param)) {
 $strPOST = $param;
 } else {
 $aPOST = array();
 foreach ($param as $key => $val) {
 $aPOST[] = $key . "=" . urlencode($val);
 }
 $strPOST = join("&", $aPOST);
 }
 curl_setopt($oCurl, CURLOPT_URL, $url);
 curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($oCurl, CURLOPT_POST, true);
 curl_setopt($oCurl, CURLOPT_POSTFIELDS, $strPOST);
 if($wxchat){
 curl_setopt($oCurl,CURLOPT_SSLCERT,$wxchat['api_cert']);
 curl_setopt($oCurl,CURLOPT_SSLKEY,$wxchat['api_key']);
 curl_setopt($oCurl,CURLOPT_CAINFO,$wxchat['api_ca']);
 }
 $sContent = curl_exec($oCurl);
 $aStatus = curl_getinfo($oCurl);
 curl_close($oCurl);
 if (intval($aStatus["http_code"]) == 200) {
 return $sContent;
 } else {
 return false;
 }
 }
很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的加群(点击→)677079770
PHP实现微信提现(企业付款到零钱)的更多相关文章
- php微信支付企业付款到零钱报错call faild, errorCode:58
		
这个报错一般是自己证书目录不是绝对目录,正确的目录结构应该是网站根目录下的:“C:\PHPWAMP_IN1\wwwroot\XXXX\XXXX.pem”. 还要注意的是文件夹命名一定 ...
 - PHP微信商户支付 - 企业付款到零钱功能(即提现)技术资料汇总
		
PHP实现微信开发中提现功能(企业付款到用户零钱) 一.实现该功能目的 这几天在小程序里要实现用户从系统中提现到零钱的功能,查了一下文档可以使用 企业付款到用户零钱 来实现: 官方文档:https:/ ...
 - PHP实现微信商户支付企业付款到零钱功能代码实例
		
本文为大家分享了PHP实现微信商户支付企业付款到零钱的具体代码,供大家参考,具体内容如下 微信支付开发文档 一.开通条件 企业付款为企业提供付款至用户零钱的能力,支持通过API接口付款,或通过微信支付 ...
 - 解决问题:CA_ERROR证书出错,请登录微信支付商户平台下载证书-企业付款到零钱接口(原创)
		
这几天用到了微信企业付款到零钱这个接口,结果出现了报错:CA_ERROR, 该接口的API说明和报错提示说明:https://pay.weixin.qq.com/wiki/doc/api/tools/ ...
 - JAVA微信企业付款到零钱(十分钟搞定),附完整DEMO下载
		
最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信企业付款到零钱的开发过程, 主要就是按规则封装好请求参数调用微信接口,涉及一些签名校验: A.接口流程 1. 获取用 ...
 - PHP微信商户支付企业付款到零钱功能
		
一 开通条件,就是首先要在微信平台设置好. 以下微信文档里有的,我这里大概掠几项比较重要的. 付款资金 企业付款到零钱资金使用商户号余额资金. 根据商户号的账户开通情况,实际出款账户有做区别: ◆ 默 ...
 - 强开企业付款到零钱与现金红包,无需等待90/30天,2-12H即可强开通!
		
一.微信官方给出的,企业付款到零钱|现金红包开通的说明 针对入账方式为即时入账至商户号,结算周期为T+1的商户,需满足三个条件:1)入驻满90天,2)连续正常交易30天,3)保持正常健康交易.其余结算 ...
 - 关于微信企业付款到零钱X509Certificate2读取证书信息,发布到服务器访问不到的解决方案
		
前言: 最近做了一个通过调用微信企业付款到用户零钱的功能,真的挺奇怪的,在我本地调试的时候都没有问题,但是当我发布到服务上的时候却一直无法读取到我的证书信息.读取的代码如下,使用的是微信官方文档提供 ...
 - 微信分账功能与微信支付企业付款相关内容详解(payjs版)
		
PAYJS开通微信分账功能以来,有很多同学咨询相关情况.很多同学关心有没有什么办法,可以让自己的商户号快速开通企业付款功能.这里就介绍下微信分账的具体相关内容,可以完美解决问题. 一.什么是微信分账? ...
 
随机推荐
- 安卓逆向基础(002)-android虚拟机
			
一, android分两种 1.Android 5.0以下(不含5.0) dalvik字节码 为dalvik虚拟机(jit机制) 基于寄存器架构 .dex=>dexopt=>.odex d ...
 - 管程(Moniter): 并发编程的基本心法
			
JavaStorm 关注公众号获取更多并发 在吃透 Syncchronized 原理 中介绍了关于 Synchronize的实现原理,无论是同步方法还是同步代码块,无论是ACC_SYNCHRONIZE ...
 - SpringCloud-创建服务消费者-Feign方式(附代码下载)
			
场景 SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
 - iOS核心动画高级技巧 - 6
			
11. 基于定时器的动画 基于定时器的动画 我可以指导你,但是你必须按照我说的做. -- 骇客帝国 在第10章“缓冲”中,我们研究了CAMediaTimingFunction,它是一个通过控制动画缓冲 ...
 - sql server重建全库索引和更新全库统计信息通用脚本
			
重建全库索引: exec sp_msforeachtable 'DBCC DBREINDEX(''?'')' 更新全库统计信息: --更新全部统计信息 exec sp_updatestats 实例反馈 ...
 - Eclipse——关联源代码
			
Eclipse——关联源代码 摘要:本文主要说明了如何在Eclipse里关联源代码. 下载源码包 首先去想要关联的jar包的官网下载对应jar包的源代码,拿Tomcat的类库举例,先去官网下载源码包: ...
 - Cookie与Session会话技术
			
Cookie与Session会话技术 一.什么是会话 会话:当用户打开浏览器,访问多个WEB资源,然后关闭浏览器的过程,称之为一个会话,选项卡,弹出页面都属于这个会话,且共享同一个session. 二 ...
 - 在IIS中部署.net core应用
			
在IIS中部署 .NET Core应用 对于熟悉IIS的程序员来说,将 .NET Core Web应用部署在IIS中,无疑是方便统一管理的事情.网上给出很多如何在IIS中部署 .NET Core 应用 ...
 - React Native-ios环境的搭建
			
要在mac系统上搭建RN环境: 一.安装Homebrew.它是一款Mac OS平台下的软件包管理工具. 详见Homebrew的安装这篇文章. 二.安装node和watchman,用Homebrew在命 ...
 - Python真牛逼,获取压缩文件密码,我只要一分钟!
			
事情的经过是这样的: 又是奶茶,行吧行吧. 快点开工,争取李大伟回来之前搞定. 李大伟说是6位数字密码 那么我们可以利用python生成全部的六位数字密码 这样,我们就生成了一个从000000到999 ...