• 微信有一个接口, 叫企业付款到零钱, 即将企业的余额转账到用户的零钱 前提条件也不高 仅需 商户号 及 绑定的 小程序或公众号 开通这个能力 开发注意事项 处理转账失败的情况 转账若返回, 系统正...

    微信有一个接口, 叫企业付款到零钱, 即将企业的余额转账到用户的零钱
    前提条件也不高
    仅需

    1. 商户号 及 绑定的 小程序或公众号
    2. 开通这个能力

    开发注意事项

    1. 处理转账失败的情况

    转账若返回, 系统正忙, 需要根据商户号(我方自定义的订单号)查询一次转账订单, 若订单不存在, 则重新发起, 若订单存在, 则根据订单转账状态更新我方业务状态以防止重复转账

    1. 重试转账的方式

    若如上所述, 转账失败需要尝试重新转账, 则应传递之前生成的订单号而非重新生成, 防止重复转账

    感想

    这和区块链上的合约处理全局状态何其相似, 要防止重入, 状态更新要谨慎, 先判断转账成功, 再更新状态

    展开全文
  • 微信接口资源:包含微信分享、微信公众号支付、微信红包、提现微信扫码支付、微信手机支付、申请流程以及demo以及SDK
  • APP微信提现接口

    2017-04-06 10:19:18
    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_nameNO_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);
       }
    
    }
    

    展开全文
  • 1.首先我们要知道微信企业付款到零钱注意事项:(1)不支持给非实名用户打款;(2)给同一个实名用户付款,单笔单日限额5000/5000元;... 接下来向微信发送请求:调用微信提现接口地址,传递必要的参...

    1.首先我们要知道微信企业付款到零钱注意事项:(1)不支持给非实名用户打款;(2)给同一个实名用户付款,单笔单日限额5000/5000元;(3)一个商户同一日付款总额限额10万元;(4)目前最低付款金额为1元,最高10万元,请确认是否付款金额超限;(5)默认每天最多可向同一个用户付款10次,可以在商户平台--API安全进行设置等注意事项

    接下来向微信发送请求:调用微信的提现接口地址,传递必要的参数给接口;

    /**
     * 企业支付(向微信发起企业支付到零钱的请求)
     * @param string $openid 用户openID
     * @param string $trade_no 单号
     * @param string $money 金额(单位分)
     * @param string $desc 描述
     * @param string $appid 协会appid
     * @return string   XML 结构的字符串
     **/
    function txFunc($openid,$trade_no,$money,$desc,$appid)
    {
        $data = array(
            'mch_appid' =>$appid,//协会appid
            'mchid' => '你自己的微信支付商户号',//微信支付商户号
            'nonce_str' => getNonceStr(), //随机字符串
            'partner_trade_no' => $trade_no, //商户订单号,需要唯一
            'openid' => $openid,
            'check_name' => 'NO_CHECK', //OPTION_CHECK不强制校验真实姓名, FORCE_CHECK:强制 NO_CHECK:
            'amount' => $money * 100, //付款金额单位为分
            'desc' => $desc,
            'spbill_create_ip' => get_client_ip(),
            //'re_user_name' => 'jorsh', //收款人用户姓名 *选填
            //'device_info' => '1000',  //设备号 *选填
        );
        //生成签名
        $data['sign']=makeSign($data);
        //构造XML数据(数据包要以xml格式进行发送)
        $xmldata = arrToXml($data);
        //请求url
        $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
        //发送post请求
        $res = curl_post_ssl($url,$xmldata);
        return $res;
    }
    接口传递参数
    微信支付文档
    /**
     * 随机字符串
     * @param int $length
     * @return string
     */
    function getNonceStr($length = 32)
    {
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }
    
    /**
     * 签名
     * @param $data
     * @return string
     */
    function makeSign($data)
    {
        $key="jlsajflewijsldffjiowej898w3lksdj";
        // 关联排序
        ksort($data);
        // 字典排序
        $str = http_build_query($data);
        // 添加商户密钥
        $str .= '&key=' . $key;
        // 清理空格
        $str = urldecode($str);
        $str = md5($str);
        // 转换大写
        $result = strtoupper($str);
        return $result;
    }
    
    /**
     * 数组转XML
     * @param $data
     * @return string
     */
    function arrToXml($data)
    {
        $xml = "<xml>";
        //  遍历组合
        foreach ($data as $k=>$v){
            $xml.='<'.$k.'>'.$v.'</'.$k.'>';
        }
        $xml .= '</xml>';
        return $xml;
    }
    
    /**
     * XML转数组
     * @param string
     * return $data
     * */
    function xmlToArray($xml)
    {
        //禁止引用外部xml实体
        libxml_disable_entity_loader(true);
        $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        return $values;
    }

    最后我们需要用到支付的证书

    证书
    /**
     * [curl_post_ssl 发送curl_post数据]
     * @param  [type]  $url     [发送地址]
     * @param  [type]  $xmldata [发送文件格式]
     * @param  [type]  $second [设置执行最长秒数]
     * @param  [type]  $aHeader [设置头部]
     * @return [type]           [description]
     */
    function curl_post_ssl($url, $xmldata, $second = 30, $aHeader = array()){
        $isdir = $_SERVER['DOCUMENT_ROOT']."/commonAssociation/cert/yfls/";//证书位置;绝对路径
        $ch = curl_init();//初始化curl
    
        curl_setopt($ch, CURLOPT_TIMEOUT, $second);//设置执行最长秒数
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页
        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, $isdir . 'apiclient_cert.pem');//证书位置
        curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');//CURLOPT_SSLKEY中规定的私钥的加密类型
        curl_setopt($ch, CURLOPT_SSLKEY, $isdir . 'apiclient_key.pem');//证书位置
        curl_setopt($ch, CURLOPT_CAINFO, 'PEM');
        curl_setopt($ch, CURLOPT_CAINFO, $isdir . 'rootca.pem');
        if (count($aHeader) >= 1) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);//设置头部
        }
        curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata);//全部数据使用HTTP协议中的"POST"操作来发送
    
    
        $data = curl_exec($ch);//执行回话
    
        if ($data) {
            curl_close($ch);
            return xmlToArray($data);
        } else {
            $error = curl_errno($ch);
            echo "call faild, errorCode:$error\n";
            curl_close($ch);
            return false;
        }
    }
    

    最后,自己写一个回调的方法,在里面具体处理你的业务逻辑。

    展开全文
  • 参考:... ... 首先要登录微信支付商户平台下载证书 注意点:最好使用QQ浏览器(兼容模式),在下载安全控件时,使用其他浏览器可能会失败。 获取API证书需要商户号的超级管理员才能操作,详细步骤...

    参考:https://blog.51cto.com/14210437/2353576?source=dra

    http://kf.qq.com/faq/161222NneAJf161222U7fARv.html

     首先要登录微信支付商户平台下载证书

    注意点:最好使用QQ浏览器(兼容模式),在下载安全控件时,使用其他浏览器可能会失败。

    获取API证书需要商户号的超级管理员才能操作,详细步骤如下:

    登录微信支付商户平台,进入【账户中心】->【账户设置】->【API安全】

     1、若页面效果如下图,表示你的证书类型为“微信支付颁发的API证书”,可点击“下载证书”按钮,并按页面指引操作即可。

     2、若页面效果如下图,表示你的证书类型为“权威CA颁发的API证书”,请点击“申请证书”按钮,并按以下指引完成证书申请。

     2.1在【商户平台】打开【生成API证书】弹窗,点击“允许访问”,同意网页访问剪切板;

     

    2.2 ①在【商户平台】-“提交请求串”环节,点击“下载证书工具”按钮;

    ② 下载并打开文件“WXCertUtil.exe”后;

    ③ 在【证书工具】,点击“申请证书”按钮,如下图:

     2.3在【证书工具】-“填写商户信息”环节,填写商户号和商户名称后,点击“下一步”按钮,可在【商户平台】查看商户号和商户名称;

    2.6 在【证书工具】-“生成证书”环节,已完成申请证书流程,点击“查看证书文件夹”,查看已生成的证书文件。

     2.7 请将生成的证书文件转交给技术人员,由技术人员将证书部署到服务器上。

    下载API证书

    运营账户充值

    保证运营账户有一定的余额,才能够提现成功。

     

    封装提现脚本

    将证书文件(3个)放在需要运行脚本的位置。代码如下

    class Cash{
        public function wxcash($openId,$money)   {
            $pub = ['app_id'=>'######','mch_id'=>'######','key'=>'######'];//config('keys.payConfig');
            $appid = $pub['app_id'];//商户账号appid
            $mch_id = $pub['mch_id'];//商户号
            $key = $pub['key'];
            $openid = $openId;//授权用户openid
    
            $arr = array();
            $arr['mch_appid'] = $appid;
            $arr['mchid'] = $mch_id;
            $arr['nonce_str'] = md5(uniqid(microtime(true),true));//随机字符串,不长于32位
            $arr['partner_trade_no'] = '123456789' . date("Ymd") . rand(10000, 90000) . rand(10000, 90000);//商户订单号
            $arr['openid'] = $openid;
            $arr['check_name'] = 'NO_CHECK';//是否验证用户真实姓名,这里不验证
            $arr['amount'] = $money * 100;//付款金额,单位为分
            $arr['desc'] = "零钱提现";//描述信息
            $arr['spbill_create_ip'] = 'xx.xx.xx.xx';//获取服务器的ip
            //封装的关于签名的算法
            $arr['sign'] = $this->makeSign($arr,$key);//签名
            $var = $this->arrayToXml($arr);
            // dump($arr['sign'] );exit;
            $xml = $this->curl_post_ssl('https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers',$var,30, array(), 1);
            libxml_disable_entity_loader(true);
    		//echo $xml; die;
    		$obj1=simplexml_load_string($xml,'SimpleXMLElement');
    //var_dump($obj1); die;
            $rdata = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)),true);
            var_dump('cash_xmldata',$rdata);//eblog('cash_xmldata',$rdata);
            // dump($rdata);exit;
            $return_code = trim(strtoupper($rdata['return_code']));
            $result_code = trim(strtoupper($rdata['result_code']));
            if ($return_code == 'SUCCESS' && $result_code == 'SUCCESS') {
                $isrr = array(
                    'status'=>1,
                    'msg' => '',
                );
            } else {
                // $returnmsg = $rdata['return_msg'];
                $err_code_des = $rdata['err_code_des'];
                $isrr = array(
                    'status' => 0,
                    'msg' => $err_code_des,
                );
            }
            return $isrr;
        }
    
        protected function makesign($data,$key)
        {
            //获取微信支付秘钥
            $data = array_filter($data);
            //签名步骤一:按字典序排序参数
            ksort($data);
            $string_a = http_build_query($data);
            $string_a = urldecode($string_a);
            //签名步骤二:在string后加入KEY
            //$config=$this->config;
            $string_sign_temp = $string_a."&key=".$key;
            //签名步骤三:MD5加密
            $sign = md5($string_sign_temp);
            // 签名步骤四:所有字符转为大写
            $result = strtoupper($sign);
            // $result = strtoupper(hash_hmac("sha256",$string_sign_temp,$key));
            return $result;
        }
    
        protected function arraytoxml($data){
            $str='<xml>';
            foreach($data as $k=>$v) {
                $str.='<'.$k.'>'.$v.'</'.$k.'>';
            }
            $str.='</xml>';
            return $str;
        }
    
        protected function curl_post_ssl($url, $vars, $second = 30, $aHeader = array())
        {
            $isdir = "cert/";//APP_PATH."/common/library/php_sdk/lib/";//证书位置
            $ch = curl_init();//初始化curl
            curl_setopt($ch, CURLOPT_TIMEOUT, $second);//设置执行最长秒数
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
            curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页
            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, $isdir . 'apiclient_cert.pem');//证书位置
            curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');//CURLOPT_SSLKEY中规定的私钥的加密类型
            curl_setopt($ch, CURLOPT_SSLKEY, $isdir . 'apiclient_key.pem');//证书位置
            curl_setopt($ch, CURLOPT_CAINFO, 'PEM');
            curl_setopt($ch, CURLOPT_CAINFO, $isdir . 'rootca.pem');
            if (count($aHeader) >= 1) {
                curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);//设置头部
            }
            curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
            curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);//全部数据使用HTTP协议中的"POST"操作来发送
            $data = curl_exec($ch);//执行回话
            if ($data) {
                curl_close($ch);
                return $data;
            } else {
                $error = curl_errno($ch);
                echo "call faild, errorCode:$error\n";
                curl_close($ch);
                return false;
            }
        }
    
    }
    
    $cash=new Cash();
    $cash->wxcash({openid},0.01);

     

    展开全文
  • 开发商用微信小程序,必不可少的微信提现功能。 主要结构就是 js 下载后自己改吧改吧可以当做功能模块使用。api 接口微信官网接口、这个东西研究了一天,实话说有些文档都是说的简单,实际使用还是要开发经验的。...
  • 这几天在小程序里要实现用户从系统中提现到零钱的功能,查了一下文档可以使用 企业付款到用户零钱 来实现;  官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1;  注意事项:...

    一.实现该功能目的

        这几天在小程序里要实现用户从系统中提现到零钱的功能,查了一下文档可以使用 企业付款到用户零钱 来实现;

     官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1;

     注意事项:商户打款时是从商户可用余额中减钱,所以确保商户可用余额充足,同时注意官方文档中的付款规则;

    二.php实现

    //封装提现方法
      function tixian($money){
            $appid = "################";//商户账号appid
            $secret = "##########";//api密码
            $mch_id = "#######";//商户号
            $mch_no = "#######";
            $openid="123456789";//授权用户openid
                 
            $arr = array();
            $arr['mch_appid'] = $appid;
            $arr['mchid'] = $mch_id;
            $arr['nonce_str'] = ugv::randomid(20);//随机字符串,不长于32位
            $arr['partner_trade_no'] = '1298016501' . date("Ymd") . rand(10000, 90000) . rand(10000, 90000);//商户订单号
            $arr['openid'] = $openid;
            $arr['check_name'] = 'NO_CHECK';//是否验证用户真实姓名,这里不验证
            $arr['amount'] = $money;//付款金额,单位为分
            $desc = "###提现";
            $arr['desc'] = $desc;//描述信息
            $arr['spbill_create_ip'] = '192.168.0.1';//获取服务器的ip
            //封装的关于签名的算法
            $notify = new Notify_pub();
            $notify->weixin_app_config = array();
            $notify->weixin_app_config['KEY'] = $mch_no;

            $arr['sign'] = $notify->getSign($arr);//签名

            $var = $notify->arrayToXml($arr);
            $xml = $this->curl_post_ssl('https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers', $var, 30, array(), 1);
            $rdata = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
            $return_code = (string)$rdata->return_code;
            $result_code = (string)$rdata->result_code;
            $return_code = trim(strtoupper($return_code));
            $result_code = trim(strtoupper($result_code));

            if ($return_code == 'SUCCESS' && $result_code == 'SUCCESS') {
                $isrr = array(
                    'con'=>'ok',
                    'error' => 0,
                );
            } else {
                $returnmsg = (string)$rdata->return_msg;
                $isrr = array(
                    'error' => 1,
                    'errmsg' => $returnmsg,
                );

            }
            return json_encode($isrr);
        }

     

    //上个方法中用到的curl_post_ssl()




    function curl_post_ssl($url, $vars, $second = 30, $aHeader = array())
        {
            $isdir = "/cert/";//证书位置

            $ch = curl_init();//初始化curl

            curl_setopt($ch, CURLOPT_TIMEOUT, $second);//设置执行最长秒数
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
            curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页
            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, $isdir . 'apiclient_cert.pem');//证书位置
            curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');//CURLOPT_SSLKEY中规定的私钥的加密类型
            curl_setopt($ch, CURLOPT_SSLKEY, $isdir . 'apiclient_key.pem');//证书位置
            curl_setopt($ch, CURLOPT_CAINFO, 'PEM');
            curl_setopt($ch, CURLOPT_CAINFO, $isdir . 'rootca.pem');
            if (count($aHeader) >= 1) {
                curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);//设置头部
            }
            curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
            curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);//全部数据使用HTTP协议中的"POST"操作来发送

            $data = curl_exec($ch);//执行回话
            if ($data) {
                curl_close($ch);
                return $data;
            } else {
                $error = curl_errno($ch);
                echo "call faild, errorCode:$error\n";
                curl_close($ch);
                return false;
            }
        }

     

    三.补充

    关于具体签名算法,可参考微信官方文档;

    简单示范签名算法:

     

    //将要发送的数据整理为$data

    ksort($data);//排序
    //使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串
    $str='';
    foreach($data as $k=>$v) {
        $str.=$k.'='.$v.'&';
    }
    //拼接API密钥
    $str.='key='.$secrect;
    $data['sign']=md5($str);//加密

    将数组转换成xml格式(简单方法):

    //遍历数组方法
    function arraytoxml($data){
        $str='<xml>';
        foreach($data as $k=>$v) {
            $str.='<'.$k.'>'.$v.'</'.$k.'>';
        }
        $str.='</xml>';
        return $str;
    }

     

    将xml格式转换为数组:

     

    function xmltoarray($xml) { 
         //禁止引用外部xml实体 
        libxml_disable_entity_loader(true); 
        $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); 
        $val = json_decode(json_encode($xmlstring),true); 
        return $val;
    }

     

     

     

    pulic

     

     

     

     

     

    以上是全部代码,不懂的可加我微信问我:1632282572

    展开全文
  • 分享给好友,领取红包,红包满100可以提取到微信零钱,一段时间天天被“PDD”好友助力轰炸,但是提现这个玩意到底怎么玩的呢,一直也没时间也没场景去搞一下。这几天刚好项目需要提现的需求,于是乎在这里整理一下...
  • 微信支付,分为很多种,前端一般情况两种,公众号支付和H5页面支付(在QQ,浏览器上),这篇文章为公众号支付,H5页面支付请看:https://blog.csdn.net/qq_34664239/article/details/79142923 官方文档:...
  • 开发笔记解决更换微信公众号后提现签名错误的问题1.首先确认是不是你的参数问题2.登录绑定的微信商户号重新设置密钥(ApiKey)分析如果帮到了大家,请大家点个赞再走吧,爱你们3000遍[ღ( ´・ᴗ・` )比心] 解决更换微信...
  • 最近做了一个小程序用到了微信支付及零钱提现功能。 准备工作,开发之前,我们需要下面这些东西: appId 密钥(小程序配置界面) 商户号 api密钥(商家后台自己设置) 1,小程序代码实现 <view class='pay_...
  • 支付宝充值弄完了之后,接下来就讲一下支付宝的提现微信提现的服务端集成的大概逻辑。 一:支付宝提现 首先申请appid,生成应用公私钥并上传支付宝后台就不说了,然后写一个配置信息类将appid,privateKey和alipay...
  • 微信提现demo

    2020-07-08 23:31:08
    微信提现demo,大家如果还有疑问请联系我.
  • C#微信提现功能

    2019-01-12 17:48:20
    1. 今天第一次了解微信提现功能,主要就是提供appid,appsercert,keys,商户号等 2. 先在微信公众号中开通【企业付款到用户零钱】,下载关于商户号的p12文件 ............. //引用都是必须的 using System....
  • 接口 需要参数 通知方式 支付宝APP支付 应用公钥,应用私钥 异步 支付宝APP提现 应用公钥,...
  • 微信小程序怎么提现到零钱?提现的功能,但是看了下小程序API没有看到关于提现接口,所以不知道该怎么搞了
  • 微信提现到零钱代码,可直接运行,代码如下: import java.io.File; import java.io.FileInputStream; import java.security.KeyStore; import java.util.Iterator; import java.util.Map; import java....
  • 用nodejs搭建的微信小程序的后台,如何实现提现到银行卡或者提现到零钱!
  • 微信公众号里我们时常会遇到一些提现支付。作为前端我们又该怎样来做呢? 一、首先我们前端要获取code去后台换openid, https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&amp;...
  • 注意:微信提现之前需要接入微信登录,因为需要用到微信用户的openID,还需要在微信开放平台申请自己的app获得到Appid 一 提现前的准备工作 确认自己的企业资质查看是否符合开通微信企业付款到微信个人用户,...
1 2 3 4 5 ... 20
收藏数 1,141
精华内容 456