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 相关文章推荐
动态新闻发布的实现及其技巧
Oct 09 PHP
PHP has encountered an Access Violation
Jan 15 PHP
PHP MYSQL乱码问题,使用SET NAMES utf8校正
Nov 30 PHP
php获取mysql数据库中的所有表名的代码
Apr 23 PHP
PHP中将数组转成XML格式的实现代码
Aug 08 PHP
ThinkPHP中的三大自动简介
Aug 22 PHP
Symfony学习十分钟入门经典教程
Feb 03 PHP
php微信支付接口开发程序
Aug 02 PHP
php无限级分类实现方法分析
Oct 19 PHP
PHP 配置后台登录以及模板引入
Jan 24 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
Aug 31 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
Oct 18 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
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/06/05 Javascript
通过location.replace禁止浏览器后退防止重复提交
2014/09/04 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
2015/12/10 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
利用jQuery对无序列表排序的简单方法
2016/10/16 Javascript
Vue组件开发初探
2017/02/14 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
vue2 自定义动态组件所遇到的问题
2017/06/08 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
Python升级提示Tkinter模块找不到的解决方法
2014/08/22 Python
简单介绍Python中的readline()方法的使用
2015/05/24 Python
Python实现自动登录百度空间的方法
2017/06/10 Python
Python爬虫文件下载图文教程
2018/12/23 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
Python Threading 线程/互斥锁/死锁/GIL锁
2019/07/21 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
解决pytorch报错:AssertionError: Invalid device id的问题
2020/01/10 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
2020/07/21 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
用css3写出气球样式的示例代码
2017/09/11 HTML / CSS
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
快餐店的创业计划书范文
2014/01/29 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
golang 实现菜单树的生成方式
2021/04/28 Golang
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS