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自定义函数返回多个值
Nov 26 PHP
php反弹shell实现代码
Apr 22 PHP
php excel reader读取excel内容存入数据库实现代码
Dec 06 PHP
将二维数组转为一维数组的2种方法
May 26 PHP
php生成随机数的三种方法
Sep 10 PHP
php实现的css文件背景图片下载器代码
Nov 11 PHP
ThinkPHP添加更新标签的方法
Dec 05 PHP
php检查页面是否被百度收录
Oct 28 PHP
ThinkPHP中html:list标签用法分析
Jan 09 PHP
php blowfish加密解密算法
Jul 02 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
Oct 03 PHP
PHP的new static和new self的区别与使用
Nov 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控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
菜鸟javascript基础资料整理2
2010/12/06 Javascript
jquery 实现上下滚动效果示例代码
2013/08/09 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
微信小程序自动客服功能
2017/11/02 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
vuex 使用文档小结篇
2018/01/11 Javascript
JS处理一些简单计算题
2018/02/24 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
vue-for循环嵌套操作示例
2019/01/28 Javascript
JavaScript前端开发时数值运算的小技巧
2020/07/28 Javascript
Python 流程控制实例代码
2009/09/25 Python
netbeans7安装python插件的方法图解
2013/12/24 Python
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
Python实现简单拆分PDF文件的方法
2015/07/30 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
python os模块常用的29种方法使用详解
2020/06/02 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
GOOD AMERICAN官网:为曲线性感而设计
2017/12/28 全球购物
Rentalcars.com中国:世界上最大的在线汽车租赁服务
2019/08/22 全球购物
年终自我鉴定
2013/10/09 职场文书
优秀士兵先进事迹
2014/02/06 职场文书
见习期自我鉴定范文
2014/03/19 职场文书
促销活动总结范文
2014/04/30 职场文书
银行会计主管岗位职责
2014/10/01 职场文书
民事申诉状范本
2015/05/20 职场文书
爱国影片观后感
2015/06/18 职场文书
2019年警察入党转正申请书最新范文
2019/09/03 职场文书
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL