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入门的学习方法
Jan 02 PHP
php通过文件头检测文件类型通用代码类(zip,rar等)
Oct 19 PHP
PHP设计模式之解释器模式的深入解析
Jun 13 PHP
easyui的tabs update正确用法分享
Mar 21 PHP
php获取文件名后缀常用方法小结
Feb 24 PHP
PHP生成各种常见验证码和Ajax验证过程
Jan 10 PHP
PHP浮点比较大小的方法
Feb 14 PHP
PHP的Yii框架中过滤器相关的使用总结
Mar 29 PHP
PHP中子类重载父类的方法【parent::方法名】
May 06 PHP
php微信开发之带参数二维码的使用
Aug 03 PHP
详细解读php的命名空间(一)
Feb 21 PHP
PHP判断是否是json字符串
Apr 01 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
摩卡咖啡
2021/03/03 咖啡文化
PHP取进制余数函数代码
2012/01/19 PHP
php不写闭合标签的好处
2014/03/04 PHP
php使用curl出现Expect:100-continue解决方法
2015/03/03 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
详解php中 === 的使用
2016/10/24 PHP
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
jQuery获取文本节点之 text()/val()/html() 方法区别
2011/03/01 Javascript
如何编写高质量JS代码
2014/12/28 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
javascript验证内容为数字以及长度为10的简单实例
2016/08/20 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
使用Node.js实现RESTful API的示例
2017/08/01 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
关于vue编译版本引入的问题的解决
2018/09/17 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
2018/10/22 Javascript
微信用户访问小程序的登录过程详解
2019/09/20 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
Python3.2中的字符串函数学习总结
2015/04/23 Python
初步讲解Python中的元组概念
2015/05/21 Python
Python中关于浮点数的冷知识
2019/09/22 Python
Python列表list常用内建函数实例小结
2019/10/22 Python
Python astype(np.float)函数使用方法解析
2020/06/08 Python
Monnier Frères美国官网:法国知名奢侈品网站
2016/11/22 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
竞选班委演讲稿
2014/04/28 职场文书
中班上学期幼儿评语
2014/04/30 职场文书
校车安全责任书
2014/08/25 职场文书
大学生创业计划书怎么写
2014/09/15 职场文书
高中生毕业评语
2014/12/30 职场文书
公司行政助理岗位职责
2015/04/11 职场文书
SQL SERVER存储过程用法详解
2022/02/24 SQL Server
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫