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 不错的学习资料
Feb 06 PHP
php file_exists 检查文件或目录是否存在的函数
May 10 PHP
字母顺序颠倒而单词顺序不变的php代码
Aug 08 PHP
Fine Uploader文件上传组件应用介绍
Jan 06 PHP
php中DOMElement操作xml文档实例演示
Mar 26 PHP
PHP跳转页面的几种实现方法详解
Jun 08 PHP
PHP速成大法
Jan 30 PHP
php中return的用法实例分析
Feb 28 PHP
PHP+redis实现添加处理投票的方法
Nov 14 PHP
Yii框架响应组件用法实例分析
Sep 04 PHP
laravel框架语言包拓展实现方法分析
Nov 22 PHP
php 解析非标准json、非规范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
PHP数组交集的优化代码分析
2011/03/06 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
PHP中的Session对象如何使用
2015/09/25 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
php的扩展写法总结
2019/05/14 PHP
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
js模拟类继承小例子
2010/07/17 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
Angularjs 与 bower安装和使用详解
2017/05/11 Javascript
nodejs实现大文件(在线视频)的读取
2020/10/16 NodeJs
js实现图片局部放大效果详解
2019/03/18 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
2019/05/21 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
JS+JQuery实现无缝连接轮播图
2020/12/30 jQuery
[01:17:12]职来职往完美电竞专场
2014/09/18 DOTA
python3中bytes和string之间的互相转换
2017/02/09 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
美国Lolё官网:购买大胆而美丽的女性运动服装
2017/05/22 全球购物
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
澳大利亚香水在线:Price Rite Mart
2017/12/28 全球购物
护士毕业自我鉴定
2014/02/07 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python
浅谈mysql返回Boolean类型的几种情况
2021/06/04 MySQL
使用python绘制分组对比柱状图
2022/04/21 Python
Python matplotlib 利用随机函数生成变化图形
2022/04/26 Python
分享很少见很有用的SQL功能CORRESPONDING
2022/08/05 MySQL