PHP APP微信提现接口代码


Posted in PHP onSeptember 30, 2018

本文实例为大家分享了APP微信提现接口的具体代码,供大家参考,具体内容如下

之前分享了微信支付接口、现在给大家分享一下APP提现的接口。

提现必须得用双向证书、所以大家一定要在微信的商户平台找到相应的地方去设置、因为我做这个提现已经有一段时间了、所以设置微信商户平台的那几个地方没有图的情况、也说不清楚、下次再做提现的时候、给大家分享如何设置商户平台那几个地方、不是很难、下面贴代码

<?php
namespace Home\Controller;
use Think\Controller;
class TixianController extends Controller{

  //高级功能-》开发者模式-》获取
  private $app_id1 = '';   //appid
  private $app_secret1 = ''; //secreat
  private $apikey1 = ''; //支付秘钥
  private $mchid1 = 's';    //商户号
  
    private $app_id=null;
    private $app_secret=null;
    private $apikey=null;
    private $mchid=null;
   
   
  public $error=0;
  public $state = '';
  //金额,需在实例化时传入
  public $amount = '0';
  //用户订单号,需在实例化时传入
  public $order_sn = '';
  //用户openid,需在实例化时传入
  public $openid = '';
  
  

  //微信提现操作接口-------》
  public function actionAct_tixian()
  {
   
   $this->state=md5(uniqid(rand(), TRUE));
   $this->amount=I('amount');//设置POST过来钱数
   $this->order_sn=rand(100,999).date('YmdHis'); //随机数可以作为单号
   $this->openid= I('openid'); //设置获取POST过来用户的OPENID
    $user_id = I('user_id');

   $this->app_id=$this->app_id1;
   $this->app_secret=$this->app_secret1;
   $this->apikey=$this->apikey1;
   $this->mchid=$this->mchid1;
   $xml=$this->tiXianAction();
   $result=simplexml_load_string($xml);
   
   if($result->return_code=='SUCCESS' && $result->result_code=='SUCCESS') {

        $cash = D('cash');
        $data['user_id'] = $user_id;
        $data['amount'] = $this->amount;
        $res = $cash->where('user_id="'.$user_id.'"')->find();
        if($res){
          $res2 = $cash->where('user_id="'.$user_id.'"')->setInc('amount',$this->amount);
          $res4 = D('member')->where('user_id="'.$user_id.'"')->setDec('user_balance',$this->amount);
        }else{
          $res3 = $cash->add($data);
        }

      $output = array('code' => 1, 'data' => $result->result_code, 'info' => '提现成功');
      exit(json_encode($output));
   }else{

      $output = array('code' => 2, 'data' => $xml, 'info' => '提现失败');
      exit(json_encode($output));
   }
  }
  /**
  * 提现接口操作,控制器调用
  * @param $openid 用户openid 唯一标示
  * @return
  */
  //提现接口操作
  public function tiXianAction(){
   //获取xml数据
   $data=$this->getdataXml($this->openid);
   $ch = curl_init ();
   //接口地址
   $MENU_URL="https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";

   curl_setopt ( $ch, CURLOPT_URL, $MENU_URL );
   curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, "POST" );
   curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
   curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );

   //证书地址,微信支付下面

    curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
    curl_setopt($ch,CURLOPT_SSLCERT, 'C:\web\www\Home\wx_pay\apiclient_cert.pem'); //证书这块大家把文件放到哪都行、
    curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
    curl_setopt($ch,CURLOPT_SSLKEY, 'C:\web\www\Home\wx_pay\apiclient_key.pem');//注意证书名字千万别写错、

   //$zs1=dirname(dirname(__FILE__)).'\wx_pay\apiclient_cert.pem';
   //$zs2=dirname(dirname(__FILE__)).'\wx_pay\apiclient_key.pem';
   //show_bug($zs1);

   //curl_setopt($ch,CURLOPT_SSLCERT,$zs1);
   //curl_setopt($ch,CURLOPT_SSLKEY,$zs2);
   // curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01;
   // Windows NT 5.0)');
   //curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 );
   curl_setopt ( $ch, CURLOPT_AUTOREFERER, 1 );
   curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
   curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
   $info = curl_exec ( $ch );
    //返回结果
    if($info){
      curl_close($ch);
      return $info;
    } else {
      $error = curl_errno($ch);
      curl_close($ch);
      return "curl出错,错误码:$error";
    }
  }
  /**
  * 获取数据封装为数组
  * @param $openid 用户openid 唯一标示
  * @return xml
  */

  private function getdataXml($openid){
   //封装成数据
   $dataArr=array(
     'amount'=>$this->amount*100,//金额(以分为单位,必须大于100)
     'check_name'=>'NO_CHECK',//校验用户姓名选项,NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
     'desc'=>'提现',//描述
     'mch_appid'=>$this->app_id,
     'mchid'=>$this->mchid,//商户号
     'nonce_str'=>rand(100000, 999999),//不长于32位的随机数
     'openid'=>$openid,//用户唯一标识
     'partner_trade_no'=>$this->order_sn,//商户订单号
     're_user_name'=>'',//用户姓名,check_name为NO_CHECK时为可选项
     'spbill_create_ip'=>$_SERVER["REMOTE_ADDR"],//服务器ip
   );
   //获取签名
   $sign=$this->getSign($dataArr);
   //xml数据
   $data="<xml>
     <mch_appid>".$dataArr['mch_appid']."</mch_appid>
     <mchid>".$dataArr['mchid']."</mchid>
     <nonce_str>".$dataArr['nonce_str']."</nonce_str>
     <partner_trade_no>".$dataArr['partner_trade_no']."</partner_trade_no>
     <openid>".$dataArr['openid']."</openid>
     <check_name>".$dataArr['check_name']."</check_name>
     <re_user_name>".$dataArr['re_user_name']."</re_user_name>
     <amount>".$dataArr['amount']."</amount>
     <desc>".$dataArr['desc']."</desc>
     <spbill_create_ip>".$dataArr['spbill_create_ip']."</spbill_create_ip>
     <sign>".$sign."</sign>
     </xml>";
   return $data;

  }
  /**
  *   作用:格式化参数,签名过程需要使用
  */
  private function formatBizQueryParaMap($paraMap, $urlencode)
  {

   $buff = "";
   ksort($paraMap);
   foreach ($paraMap as $k => $v)
   {
     if($v){
      if($urlencode)
      {
        $v = urlencode($v);
      }

      $buff .= $k . "=" . $v . "&";
     }

   }
   $reqPar=NULL;
   if (strlen($buff) > 0)
   {
     $reqPar = substr($buff, 0, strlen($buff)-1);
   }

   return $reqPar;
  }

  /**
  *   作用:生成签名
  */
  private function getSign($Obj)
  {

   foreach ($Obj as $k => $v)
   {
     $Parameters[$k] = $v;
   }
   //签名步骤一:按字典序排序参数
   ksort($Parameters);
   $String = $this->formatBizQueryParaMap($Parameters, false);
   //echo '【string1】'.$String.'</br>';
   //签名步骤二:在string后加入KEY
   $String = $String."&key=".$this->apikey;
   //echo "【string2】".$String."</br>";
   //签名步骤三:MD5加密
   $String = md5($String);
   //echo "【string3】 ".$String."</br>";
   //签名步骤四:所有字符转为大写
   $result_ = strtoupper($String);
   //echo "【result】 ".$result_."</br>";
   return $result_;
  }
  //-----------
  private function http($url, $method='POST', $postfields = null, $headers = array())
  {
   header("Content-Type:text/html;charset=utf-8");
   $ch = curl_init();
   /* Curl settings */
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_POSTFIELDS, "");
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
   curl_setopt($ch, CURLOPT_TIMEOUT, 30);
   switch ($method){
     case 'POST':
      curl_setopt($ch,CURLOPT_POST, true);
      break;
   }
   curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
   curl_setopt($ch, CURLINFO_HEADER_OUT, true);
   $response = curl_exec($ch);
   $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //返回请求状态码
   curl_close($ch);
   return array($http_code, $response);
  }

}

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

PHP 相关文章推荐
Php部分常见问题总结
Oct 09 PHP
php htmlspecialchars加强版
Feb 16 PHP
PHP和.net中des加解密的实现方法
Feb 27 PHP
解析PHP多种序列化与反序列化的方法
Jun 06 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
Feb 13 PHP
php实现的SESSION类
Dec 02 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
Feb 07 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 PHP
PHP简单实现记录网站访问量功能示例
Jun 06 PHP
Laravel框架实现的记录SQL日志功能示例
Jun 19 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
Oct 14 PHP
解决laravel 出现ajax请求419(unknown status)的问题
Sep 03 PHP
PHP实现微信提现功能
Sep 30 #PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 #PHP
Thinkphp 5.0实现微信企业付款到零钱
Sep 30 #PHP
PHP使用函数用法详解
Sep 30 #PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
Sep 29 #PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
Sep 28 #PHP
PHP从尾到头打印链表实例讲解
Sep 27 #PHP
You might like
用PHP调用数据库的存贮过程
2006/10/09 PHP
php面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
php文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
解析PHP提交后跳转
2013/06/23 PHP
ThinkPHP登录功能的实现方法
2014/08/20 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
php for 循环使用的简单实例
2016/06/02 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
2013/09/22 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
2017/02/10 Javascript
javascript DOM的详解及实例代码
2017/03/06 Javascript
jQuery实现弹窗下底部页面禁止滑动效果
2017/12/19 jQuery
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
python计算圆周率pi的方法
2015/07/11 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
Clarins娇韵诗英国官网:来自法国的天然护肤品牌
2017/04/18 全球购物
美国折扣地毯销售网站:Rugs.com
2020/03/27 全球购物
银行会计职员个人的自我评价
2013/09/29 职场文书
男方父母证婚词
2014/01/12 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
又涨知识了,自律到底多重要?
2019/06/27 职场文书
Pytorch中的数据集划分&正则化方法
2021/05/27 Python
Redis 限流器
2022/05/15 Redis
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers