PHP实现微信提现(企业付款到零钱)


Posted in PHP onAugust 01, 2019

怎么开通企业付款到零钱?

有的商户号的产品中心是没有这个功能的,不过,该功能的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;
   }
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php 设计模式之 工厂模式
Dec 19 PHP
php中session_unset与session_destroy的区别分析
Jun 16 PHP
PHP的基本常识小结
Jul 05 PHP
PHP实现数字补零功能的2个函数介绍
May 12 PHP
php单态设计模式(单例模式)实例
Nov 18 PHP
php按单词截取字符串的方法
Apr 07 PHP
php语言的7种基本的排序方法
Dec 28 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
May 13 PHP
php 输入输出流详解及示例代码
Aug 25 PHP
php 的多进程操作实践案例分析
Feb 28 PHP
PHP如何通过带尾指针的链表实现'队列'
Oct 22 PHP
php的单例模式及应用场景详解
Feb 27 PHP
php curl发送请求实例方法
Aug 01 #PHP
php layui实现前端多图上传实例
Jul 30 #PHP
安装docker和docker-compose实例详解
Jul 30 #PHP
docker-compose部署php项目实例详解
Jul 30 #PHP
php 使用mpdf实现指定字段配置字体样式的方法
Jul 29 #PHP
laradock环境docker-compose操作详解
Jul 29 #PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
Jul 26 #PHP
You might like
php 生成饼图 三维饼图
2009/09/28 PHP
php实现网站插件机制的方法
2009/11/10 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
JavaScript单元测试ABC
2012/04/12 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
详解jQuery事件
2017/01/13 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
vue-cli项目中使用Mockjs详解
2018/05/14 Javascript
vue中render函数的使用详解
2018/10/12 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
2020/09/04 Javascript
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
qpython3 读取安卓lastpass Cookies
2016/06/19 Python
对python:threading.Thread类的使用方法详解
2019/01/31 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
Pytorch反向求导更新网络参数的方法
2019/08/17 Python
Windows系统下pycharm中的pip换源
2020/02/23 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
2020/02/28 Python
Python读写操作csv和excle文件代码实例
2020/03/16 Python
什么是python的函数体
2020/06/19 Python
python Scrapy爬虫框架的使用
2021/01/21 Python
Canvas系列之滤镜效果
2019/02/12 HTML / CSS
日本最大的购物网站:日本乐天市场(Rakuten Ichiba)
2020/11/04 全球购物
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
我的梦想演讲稿
2014/04/30 职场文书
广播体操比赛口号
2014/06/10 职场文书
基层领导干部“四风”问题批评与自我批评
2014/09/23 职场文书
学校政风行风整改方案
2014/10/25 职场文书
地方课程教学计划
2015/01/19 职场文书
教你使用Python获取QQ音乐某个歌手的歌单
2022/04/03 Python
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js