PHP實現微信商戶支付企業付款到零錢功能代碼實例

 

 

 

本文爲你們分享了PHP實現微信商戶支付企業付款到零錢的具體代碼,供你們參考,具體內容以下php

微信支付開發文檔html

1、開通條件算法

企業付款爲企業提供付款至用戶零錢的能力,支持經過API接口付款,或經過微信支付商戶平臺(pay.weixin.qq.com)網頁操做付款。json

使用條件小程序

  • 商戶號(或同主體其餘非服務商商戶號)已入駐90日
  • 商戶號(或同主體其餘非服務商商戶號)有30天連續正常交易
  • 登陸微信支付商戶平臺-產品中心,開通企業付款。

具體的能夠看微信支付開發文檔api

2、代碼展現數組

 

//企業付款到微信零錢,PHP接口調用方法
define("APPID", "wxe062425f740c30d8"); // 商戶帳號appid
define("MCHID", "10000098");  // 商戶號
define("SECRECT_KEY", "453436425252"); //支付密鑰簽名
define("IP", "xxx.xxx.xx.xx"); //IP
 
 
 /**
 * [xmltoarray xml格式轉換爲數組]
 * @param [type] $xml [xml]
 * @return [type]  [xml 轉化爲array]
 */
 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;
 }
 
 /**
 * [arraytoxml 將數組轉換成xml格式(簡單方法):]
 * @param [type] $data [數組]
 * @return [type]  [array 轉 xml]
 */
 function arraytoxml($data){
  $str='<xml>';
  foreach($data as $k=>$v) {
   $str.='<'.$k.'>'.$v.'</'.$k.'>';
  }
  $str.='</xml>';
  return $str;
 }
 
 /**
 * [createNoncestr 生成隨機字符串]
 * @param integer $length [長度]
 * @return [type]   [字母大小寫加數字]
 */
 function createNoncestr($length =32){
  $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz0123456789"; 
  $str ="";
 
  for($i=0;$i<$length;$i++){ 
   $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1); 
  } 
  return $str;
 }
 
 /**
 * [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']."/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, $xmldata);//所有數據使用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;
  }
 }
 
 
 /**
 * [sendMoney 企業付款到零錢]
 * @param [type] $amount  [發送的金額(分)目前發送金額不能少於1元]
 * @param [type] $re_openid [發送人的 openid]
 * @param string $desc  [企業付款描述信息 (必填)]
 * @param string $check_name [收款用戶姓名 (選填)]
 * @return [type]    [description]
 */
 function sendMoney($amount,$re_openid,$desc='測試',$check_name=''){
   
  $total_amount = (100) * $amount;
   
  $data=array(
   'mch_appid'=>APPID,//商戶帳號appid
   'mchid'=> MCHID,//商戶號
   'nonce_str'=>createNoncestr(),//隨機字符串
   'partner_trade_no'=> date('YmdHis').rand(1000, 9999),//商戶訂單號
   'openid'=> $re_openid,//用戶openid
   'check_name'=>'NO_CHECK',//校驗用戶姓名選項,
   're_user_name'=> $check_name,//收款用戶姓名
   'amount'=>$total_amount,//金額
   'desc'=> $desc,//企業付款描述信息
   'spbill_create_ip'=> IP,//Ip地址
  );
 
  //生成簽名算法
  $secrect_key=SECRECT_KEY;///這個就是個API密碼。MD5 32位。
  $data=array_filter($data);
  ksort($data);
  $str='';
  foreach($data as $k=>$v) {
   $str.=$k.'='.$v.'&';
  }
  $str.='key='.$secrect_key;
  $data['sign']=md5($str);
  //生成簽名算法
 
 
  $xml=arraytoxml($data);
  
  $url='https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; //調用接口
  $res=curl_post_ssl($url,$xml);
  $return=xmltoarray($res);
   
  
  print_r($return);
  //返回來的結果是xml,最後轉換成數組
 /*
 array(9) {
  ["return_code"]=>
  string(7) "SUCCESS"
  ["return_msg"]=>
  array(0) {
  }
  ["mch_appid"]=>
  string(18) "wx57676786465544b2a5"
  ["mchid"]=>
  string(10) "143345612"
  ["nonce_str"]=>
  string(32) "iw6TtHdOySMAfS81qcnqXojwUMn8l8mY"
  ["result_code"]=>
  string(7) "SUCCESS"
  ["partner_trade_no"]=>
  string(18) "201807011410504098"
  ["payment_no"]=>
  string(28) "1000018301201807019357038738"
  ["payment_time"]=>
  string(19) "2018-07-01 14:56:35"
 }
 */
 
   
  $responseObj = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA);
  echo $res= $responseObj->return_code; //SUCCESS 若是返回來SUCCESS,則發生成功,處理本身的邏輯
   
  return $res;
 }

 

3、調用方法服務器

sendMoney(1,'gdgfdg56456223423','xxxx測試','xxx');

調用的話,稍微在修改下,加上本身的業務邏輯就好了。微信

4、調用效果微信開發

 

 

本功能也能夠參看以下類文件:wechat_paymentchange.class.php

<?php

//企業付款到微信零錢,PHP接口調用方法
define("APPID", "wxe062425f740c30d8"); // 商戶帳號appid
define("MCHID", "10000098");      // 商戶號
define("SECRECT_KEY", "453436425252");  //支付密鑰簽名
define("IP", "xxx.xxx.xx.xx");   //IP



class wechat_paymentchange {

    /**
     * [xmltoarray xml格式轉換爲數組]
     * @param  [type] $xml [xml]
     * @return [type]      [xml 轉化爲array]
     */
    public 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;
    }


    /**
     * [arraytoxml 將數組轉換成xml格式(簡單方法):]
     * @param  [type] $data [數組]
     * @return [type]       [array 轉 xml]
     */
    public function arraytoxml($data){
        $str='<xml>';
        foreach($data as $k=>$v) {
            $str.='<'.$k.'>'.$v.'</'.$k.'>';
        }
        $str.='</xml>';
        return $str;
    }

    /**
     * [createNoncestr 生成隨機字符串]
     * @param  integer $length [長度]
     * @return [type]          [字母大小寫加數字]
     */
    public function createNoncestr($length =32){
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz0123456789";  
        $str ="";

        for($i=0;$i<$length;$i++){  
            $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);   
        }  
        return $str;
    }

    /**
     * [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, $vars, $second = 30, $aHeader = array()){
        $isdir = $_SERVER['DOCUMENT_ROOT']."/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;
        }
    }




    /**
     * [sendMoney 企業付款到零錢]
     * @param  [type] $amount     [發送的金額(分)目前發送金額不能少於1元]
     * @param  [type] $re_openid  [發送人的 openid]
     * @param  string $desc       [企業付款描述信息 (必填)]
     * @param  string $check_name [收款用戶姓名 (選填)]
     * @return [type]             [description]
     */
    public function sendMoney($amount,$re_openid,$desc='測試',$check_name=''){

        $total_amount = (100) * $amount;
        
        $data=array(
            'mch_appid'=>APPID,//商戶帳號appid
            'mchid'=> MCHID,//商戶號
            'nonce_str'=>$this->createNoncestr(),//隨機字符串
            'partner_trade_no'=> date('YmdHis').rand(1000, 9999),//商戶訂單號
            'openid'=> $re_openid,//用戶openid
            'check_name'=>'NO_CHECK',//校驗用戶姓名選項,
            're_user_name'=> $check_name,//收款用戶姓名
            'amount'=>$total_amount,//金額
            'desc'=> $desc,//企業付款描述信息
            'spbill_create_ip'=> IP,//Ip地址
        );

        //生成簽名算法
        $secrect_key=SECRECT_KEY;///這個就是個API密碼。MD5 32位。
        $data=array_filter($data);
        ksort($data);
        $str='';
        foreach($data as $k=>$v) {
           $str.=$k.'='.$v.'&';
        }
        $str.='key='.$secrect_key;
        $data['sign']=md5($str);
        //生成簽名算法


        $xml=$this->arraytoxml($data);
      
        $url='https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; //調用接口
        $res=$this->curl_post_ssl($url,$xml);
        $return=$this->xmltoarray($res);
        
         return $return;
     
        print_r($return);
        //返回來的結果
        // [return_code] => SUCCESS [return_msg] => Array ( ) [mch_appid] => wxd44be6876gg73 [mchid] => 76775512 [nonce_str] => 616615516 [result_code] => SUCCESS [partner_trade_no] => 20186505080216815 
        // [payment_no] => 1000018361251805057502564679 [payment_time] => 2018-05-15 15:29:50
        
        $responseObj = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA);
        echo $res= $responseObj->return_code;  //SUCCESS  若是返回來SUCCESS,則發生成功,處理本身的邏輯
        
        return $res;
    }


}

?>

 


 

PHP實現微信開發中提現功能(企業付款到用戶零錢)

一.實現該功能目的

    這幾天在小程序裏要實現用戶從系統中提現到零錢的功能,查了一下文檔可使用 企業付款到用戶零錢 來實現;

 官方文檔: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;
}
複製代碼
相關文章
相關標籤/搜索