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 相关文章推荐
一个可以删除字符串中HTML标记的PHP函数
Oct 09 PHP
php xml留言板 xml存储数据的简单例子
Aug 24 PHP
php addslashes和mysql_real_escape_string
Jan 24 PHP
PHP 日,周,月点击排行统计
Jan 11 PHP
php错误、异常处理机制(补充)
May 07 PHP
探讨:如何使用PhpDocumentor生成文档
Jun 25 PHP
微信公众平台实现获取用户OpenID的方法
Apr 15 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
Docker搭建自己的PHP开发环境
Feb 24 PHP
thinkPHP5框架设置404、403等http状态页面的方法
Jun 05 PHP
php实现构建排除当前元素的乘积数组方法
Oct 06 PHP
PHP levenshtein()函数用法讲解
Mar 08 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
计数器详细设计
2006/10/09 PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
php中{}大括号是什么意思
2013/12/01 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
PHP使用memcache缓存技术提高响应速度的方法
2014/12/26 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
关于javascript document.createDocumentFragment()
2009/04/04 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
js onload事件不起作用示例分析
2013/10/09 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
javascript中in运算符用法分析
2015/04/28 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
原生js实现对Ajax的封装(仿jquery)
2017/01/22 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
Python信息抽取之乱码解决办法
2017/06/29 Python
python对日志进行处理的实例代码
2018/10/06 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
Ooni英国官网:披萨烤箱
2020/05/31 全球购物
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
编写strcpy函数
2014/06/24 面试题
咖啡蛋糕店创业计划书
2014/01/28 职场文书
运动会入场词50字
2014/02/20 职场文书
财务会计自荐信范文
2014/02/21 职场文书
幼儿园小班植树节活动方案
2014/03/04 职场文书
2015年度公共机构节能工作总结
2015/05/26 职场文书
详解MySQL的半同步
2021/04/22 MySQL
Spring Boot 整合 Apache Dubbo的示例代码
2021/07/04 Java/Android
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL
Python+pyaudio实现音频控制示例详解
2022/07/23 Python